Gerenciar Chaves SSH com ssh-agent
Neste passo, você aprenderá a gerenciar suas chaves SSH usando ssh-agent. O ssh-agent é um programa que roda em segundo plano e mantém suas chaves privadas na memória. Isso é particularmente útil quando suas chaves privadas são protegidas por uma frase-senha. Em vez de digitar a frase-senha toda vez que usar a chave, você a digita uma vez ao adicionar a chave ao ssh-agent, e então o agente gerencia a autenticação por você durante a duração de sua sessão.
Embora você tenha gerado uma chave sem frase-senha no passo anterior, agora criaremos uma nova chave com uma frase-senha para demonstrar a utilidade do ssh-agent.
Primeiro, gere um novo par de chaves SSH com uma frase-senha. Chamaremos esta chave de id_rsa_passphrase para distingui-la da chave padrão id_rsa.
ssh-keygen -f ~/.ssh/id_rsa_passphrase
Você será solicitado a inserir uma frase-senha. Para este laboratório, use mypassphrase como a frase-senha.
Gerando par de chaves rsa público/privado.
Digite a senha (vazio para nenhuma senha): mypassphrase
Digite a mesma senha novamente: mypassphrase
Sua identificação foi salva em /home/labex/.ssh/id_rsa_passphrase
Sua chave pública foi salva em /home/labex/.ssh/id_rsa_passphrase.pub
A impressão digital da chave é:
SHA256:BuSxVlJb1lsiUFi2I5DAvyL01fJ5d480LT86dgtcHEg labex@6846375f1c0e35fea6cb03e6
A imagem randomart da chave é:
+---[RSA 3072]----+
| ...=o+=*. E |
| .o.*.=..+ o |
| .=.o o. = . |
| . .+... .. . .|
| . . . +S. + |
| . o ..o . o * .|
| . . . . = * |
| oooo|
| ..+.o|
+----[SHA256]-----+
Observação: Se você acidentalmente pressionar Enter sem digitar uma frase-senha, a chave será criada sem uma. Nesse caso, você pode excluir os arquivos e executar o comando novamente, garantindo que digite mypassphrase quando solicitado.
Agora, vamos copiar esta nova chave pública para localhost para que você possa usá-la para autenticação.
ssh-copy-id -i ~/.ssh/id_rsa_passphrase.pub labex@localhost
Como você já tem autenticação sem senha configurada com sua chave padrão, o comando pode não solicitar uma senha e usará sua autenticação existente:
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/labex/.ssh/id_rsa_passphrase.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'labex@localhost'"
and check to make sure that only the key(s) you wanted were added.
Agora, tente se conectar a localhost usando esta nova chave. Você precisará especificar o arquivo da chave privada usando a opção -i.
ssh -i ~/.ssh/id_rsa_passphrase labex@localhost
Se você definiu uma frase-senha para a chave, será solicitado a inseri-la. No entanto, se você acidentalmente criou a chave sem uma frase-senha (como mostrado na saída do exemplo), você será logado diretamente:
Último login: Seg 09 jun 01:39:25 2025 de 47.251.66.143
[labex@host ~]$
Você está logado. Agora, saia da sessão:
exit
exit
Conexão com localhost fechada.
[labex@host ~]$
Observação: Se sua chave não tiver uma frase-senha, você ainda pode continuar com a demonstração do ssh-agent para entender como funciona, embora não solicite uma frase-senha nesse caso.
Primeiro, inicie o ssh-agent em sua sessão de shell atual. O comando eval é usado para definir corretamente as variáveis de ambiente que o ssh-agent gera.
eval "$(ssh-agent)"
Agent pid 1024
A saída mostrará o ID do processo (PID) do ssh-agent.
Em seguida, adicione sua chave privada (id_rsa_passphrase) ao ssh-agent.
ssh-add ~/.ssh/id_rsa_passphrase
Se sua chave tiver uma frase-senha, você será solicitado a inseri-la. Caso contrário, a chave será adicionada diretamente:
Identity added: /home/labex/.ssh/id_rsa_passphrase (labex@6846375f1c0e35fea6cb03e6)
Agora que a chave foi adicionada ao ssh-agent, tente se conectar a localhost novamente usando a mesma chave.
ssh -i ~/.ssh/id_rsa_passphrase labex@localhost
Você deve conseguir se conectar sem ser solicitado a inserir uma frase-senha (se sua chave tiver ou não, já que agora é gerenciada pelo agente):
Último login: Seg 09 jun 01:39:49 2025 de 127.0.0.1
[labex@host ~]$
Você usou com sucesso o ssh-agent para gerenciar sua chave SSH.
Observação Importante: As variáveis de ambiente do ssh-agent só estão disponíveis na sessão de shell onde você o iniciou. Se você estiver em uma sessão SSH, precisará sair para o shell local para usar os comandos ssh-add.
Saia da sessão SSH primeiro:
exit
exit
Conexão com localhost fechada.
[labex@host ~]$
Agora, para ver as chaves atualmente carregadas em seu ssh-agent, você pode usar ssh-add -l:
ssh-add -l
Se o agente estiver em execução e tiver chaves carregadas, você verá uma saída como:
3072 SHA256:BuSxVlJb1lsiUFi2I5DAvyL01fJ5d480LT86dgtcHEg /home/labex/.ssh/id_rsa_passphrase (RSA)
No entanto, se você vir uma mensagem de erro como "Não foi possível abrir uma conexão com seu agente de autenticação", significa que as variáveis de ambiente do agente não estão definidas em sua sessão atual.
Para remover todas as identidades do ssh-agent, use ssh-add -D:
ssh-add -D
Se o agente for acessível, você verá:
Todas as identidades removidas.
No entanto, se você vir "Não foi possível abrir uma conexão com seu agente de autenticação", significa que o ambiente do agente não está disponível em sua sessão atual.
Agora, se você tentar se conectar novamente e sua chave tiver uma frase-senha, você será solicitado a inseri-la porque a chave foi removida do agente:
ssh -i ~/.ssh/id_rsa_passphrase labex@localhost
Se sua chave tiver uma frase-senha, você verá:
Digite a frase-senha para a chave '/home/labex/.ssh/id_rsa_passphrase':
Se sua chave não tiver uma frase-senha, você ainda poderá se conectar diretamente. Pressione Ctrl+C para cancelar a tentativa de conexão se for solicitado a inserir uma frase-senha.
Finalmente, para parar o processo ssh-agent, você pode usar ssh-agent -k:
ssh-agent -k
Se a variável de ambiente SSH_AGENT_PID não estiver definida, você poderá ver:
SSH_AGENT_PID não definido, não é possível matar o agente
Isso é normal se o agente foi iniciado em uma sessão de shell diferente ou se as variáveis de ambiente não foram exportadas corretamente.