Introdução
Se você gerencia servidores Linux, provavelmente utiliza SSH (Secure Shell) para acessá-los com segurança. A melhor prática é usar chaves SSH protegidas por senha (passphrase), em vez de autenticação por usuário e senha simples.
Mas há um problema: digitar a senha da chave privada em cada nova conexão pode se tornar cansativo — especialmente quando você acessa vários servidores ao longo do dia.
Para resolver isso, o próprio OpenSSH oferece uma solução nativa e segura: o SSH-Agent. Com ele, sua chave privada é armazenada temporariamente na memória, permitindo conexões subsequentes sem solicitar a senha novamente — tudo isso sem comprometer a segurança.
O Problema: Digitar a senha da chave privada a cada conexão SSH
Um cenário comum é o sysadmin possuir uma máquina especializada para gerenciamento, ou uma Bastion Host, e a partir dela realizar acessos SSH a servidores e equipamentos de rede diversos. Uma configuração segura do serviço SSH restringe o acesso remoto de usuários a apenas aqueles com chaves públicas inseridas em /etc/ssh/authorized_keys, impedindo o acesso por usuário e senha. Além do uso de chaves SSH, estas devem ser criadas com uma passphrase forte como critério mínimo de segurança. O problema é ficar digitando a senha a cada acesso, visto que administradores de rede costumam realizar muitos acessos SSH em curto espaço de tempo.
ssh user@servidor1
Enter passphrase for key '/home/user/.ssh/id_rsa':
Claro que eu uso SSH diariamente, tanto é que meu post anterior foi baseado em um problema que tive ao realizar minhas tarefas de administrador de redes.
A solução: SSH-Agent e SSH-add
O utilitário SSH-Agent gerencia as chaves SSH e mantém a senha em memória durante a sessão. Quando você se conecta a sua máquina de gerenciamento, seja ela seu PC remoto ou um Bastion Host, a partir do momento que realizou o login com sucesso você esta em uma sessão. Se for um terminal SSH, cada terminal SSH aberto é uma sessão diferente. Assim, você só precisa digitar sua senha uma vez por sessão. Depois disso, todos os acessos SSH subsequentes serão realizados sem a necessidade de digitar a senha novamente.
Já o comando ssh-add adiciona a chave privada informada ao agente.
Os comandos para isso são bem simples:
# Iniciar o agente.
eval $(ssh-agent)
# Adicionar a chave privada ao agente
ssh-add ~/.ssh/id_rsa
É muito pouco trabalho para um benefício enorme 😀
Se você tiver dúvidas sobre o eval acima, saiba que ssh-agent é um processo filho, e pode alterar apenas suas próprias variáveis de ambiente e de processos filho dele. eval captura as variáveis de ambiente configuradas por ssh-agent e carrega estas variáveis no processo atual, permitindo o uso.
SSH-Agent: Garantindo que seja iniciado automaticamente.
Quando usamos alguma distribuição Linux como desktop, normalmente a funcionalidade do agente vem “embutida” no gerenciador de janelas, solicitando a chave SSH ou nossa senha para destravar o chave pública e armazenando-a no chaveiro. Para usuários GNOME há o GNOME Keyring enquanto usuário KDE contam com o KWallet. Mas quando acessamos nossa máquina remotamente por SSH, precisamos iniciar o SSH-Agent. As distribuições Linux possuem arquivos que são lidos em situações específicas, como em um login com sucesso, por exemplo. Se você usa Bash, adicione os comandos no .bashrc. Se usa Zsh, edite o .zshrc. Neste arquivo vamos acrescentar os comandos para armazenamento de nossa chave privada SOMENTE após um login com sucesso.
# Considerando o usuário vrrnet, o arquivo estaria na home, como:
# /home/vrrnet/.bashrc
# Edite e insira no final do arquivo as seguintes linhas:
eval $(ssh-agent) > /dev/null 2>&1
ssh-add ~/.ssh/id_rsa
Pronto! Uma vez feito login, todo acesso SSH não solicitará a senha.
Segurança: Protegendo o SSH-Agent:
Para aumentar a segurança, podemos definir um tempo de expiração para a chave no armazenada no agente e removê-las manualmente quando não forem mais necessárias:
# Definindo tempo de expiração da chave no agente.
ssh-add -t 3600 ~/.ssh/id_rsa # Expira em 1 hora
# Removendo todas as chaves do agente
ssh-add -D
Falando em segurança, jamais deixe sua chave privada exposta. Mantenha-a armazenada apenas nos dispositivos onde seu uso é realmente necessário e sob seu controle. Nunca compartilhe esse arquivo, mesmo com colegas de equipe — cada usuário deve ter sua própria chave.
É fundamental também manter uma cópia de segurança da chave privada, mas esse backup deve ser criptografado e armazenado offline, preferencialmente em um local seguro como um HD externo, pendrive criptografado ou mesmo um cofre digital. Evite armazenar em serviços de nuvem sem criptografia adicional.
Outro cuidado importante é a permissão do arquivo: sua chave privada deve ter permissões restritas (como chmod 600), evitando que outros usuários no sistema consigam acessá-la. E lembre-se: usar uma senha forte (passphrase) para proteger a chave privada continua sendo sua primeira linha de defesa.
Finalizando
Utilizar o agente ssh melhora a produtividade sem comprometer a segurança. Ao evitar a repetição desnecessária da senha, você mantém boas práticas e reduz o risco de usar senhas fracas ou até mesmo removê-las por conveniência.
E você? Já utiliza o SSH-Agent? Conhece outras maneiras de automatizar logins SSH? Comente abaixo e compartilhe sua experiência!
Referências
- https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
- https://www.ssh.com/academy/ssh/agent
- https://unix.stackexchange.com/questions/351725/why-eval-the-output-of-ssh-agent
- https://www.openssh.com/
Perguntas Frequentes (FAQ)
O que é SSH-Agent e para que serve?
O SSH-Agent é um utilitário do OpenSSH que gerencia chaves privadas para evitar que o usuário precise digitar a senha toda vez que acessa um servidor via SSH. Ele armazena temporariamente a chave na memória até o fim da sessão.
Como ativar o SSH-Agent automaticamente no Linux?
Para ativar o SSH-Agent automaticamente ao fazer login, adicione este comando ao seu .bashrc ou .zshrc:
eval $(ssh-agent) > /dev/null 2>&1
ssh-add ~/.ssh/id_rsa
Isso garante que a chave será carregada sempre que você iniciar uma sessão.
Como verificar se o SSH-Agent está em execução?
Para verificar se o SSH-Agent está ativo, use o comando:
ssh-add -l
Se nenhuma chave estiver carregada, a saída será: The agent has no identities.
Como remover chaves do agente?
Para remover todas as chaves carregadas no agente, use:
ssh-add -D
Isso garante que nenhuma chave privada fique em memória.
Como definir um tempo de expiração para a chave?
Para definir um tempo limite para que a chave permaneça no SSH-Agent, use o comando:
ssh-add -t 3600 ~/.ssh/id_rsa
Esse comando faz com que a chave expire após 1 hora.
Este método de autenticação é seguro?
Sim, o SSH-Agent é seguro desde que sua máquina não seja comprometida. Para maior segurança, defina um tempo de expiração para as chaves e use o comando ssh-add -D quando terminar suas conexões.
Como evitar que o SSH-Agent perca as chaves após reiniciar o terminal?
Para manter as chaves ao longo de várias sessões, ative o Forwarding do SSH-Agent ou use um gerenciador de chaves como o gnome-keyring ou kwallet.
Como usar SSH-Agent Forwarding para conexões intermediárias?
Para encaminhar o SSH-Agent para servidores intermediários, utilize a opção -A no SSH:
ssh -A usuario@bastion_host
Isso permite que o SSH-Agent seja usado para acessar outros servidores sem necessidade de reautenticação.