Dicas para gerenciar chaves SSH com ssh-agent e ~/.ssh/config

1. Fundamentos do gerenciamento de chaves SSH

O SSH (Secure Shell) utiliza criptografia de chave pública para autenticação. O par de chaves consiste em uma chave privada (mantida em segredo no cliente) e uma chave pública (copiada para servidores remotos). Essa abordagem elimina a necessidade de senhas tradicionais e oferece maior segurança.

O diretório padrão para armazenar essas chaves é ~/.ssh, com permissões restritas (700 para o diretório, 600 para arquivos de chave privada). Para gerar um novo par de chaves:

ssh-keygen -t ed25519 -C "seu-email@exemplo.com"

Recomenda-se usar o algoritmo Ed25519 por sua segurança e desempenho. Sempre proteja a chave privada com uma senha forte (passphrase).

2. Configurando o arquivo ~/.ssh/config para conexões eficientes

O arquivo ~/.ssh/config permite definir regras de conexão personalizadas. A sintaxe básica utiliza os parâmetros Host, HostName, User e Port:

Host servidor-dev
    HostName 192.168.1.100
    User desenvolvedor
    Port 2222

Com essa configuração, basta digitar ssh servidor-dev para conectar, sem precisar especificar IP, usuário ou porta manualmente.

Para usar chaves específicas por host:

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_github
    IdentitiesOnly yes

3. Automatizando conexões com opções avançadas do config

Curingas permitem aplicar regras globais. Por exemplo, para todos os servidores de uma rede interna:

Host *.empresa.local
    User admin
    IdentityFile ~/.ssh/id_rsa_corporativo
    Compression yes
    ServerAliveInterval 60

Para saltar por um bastion host (ProxyJump):

Host servidor-interno
    HostName 10.0.0.50
    User dev
    ProxyJump bastion.empresa.com

A opção Compression yes acelera transferências em conexões lentas, enquanto ServerAliveInterval mantém a conexão ativa enviando pacotes keepalive.

4. Gerenciando múltiplas chaves com ssh-agent

O ssh-agent é um programa que mantém as chaves privadas descriptografadas na memória, evitando redigitar senhas repetidamente.

Inicie o agente e adicione chaves:

eval $(ssh-agent)
ssh-add ~/.ssh/id_ed25519_github
ssh-add ~/.ssh/id_rsa_corporativo

Para verificar as chaves carregadas:

ssh-add -l

Para remover uma chave específica ou limpar todas:

ssh-add -d ~/.ssh/id_ed25519_github
ssh-add -D

5. Estratégias para persistência do ssh-agent

Integrar o ssh-agent ao shell garante que ele esteja disponível em todas as sessões do terminal. No ~/.bashrc ou ~/.zshrc:

if [ -z "$SSH_AUTH_SOCK" ]; then
    eval $(ssh-agent -s)
    ssh-add ~/.ssh/id_ed25519_principal
fi

Para persistência entre sessões, o keychain é uma ferramenta útil:

# Instalação (Debian/Ubuntu)
sudo apt install keychain

# No ~/.bashrc
eval $(keychain --eval --agents ssh id_ed25519_principal)

Uma abordagem mais moderna é usar systemd user service:

systemctl --user enable ssh-agent
systemctl --user start ssh-agent

6. Resolvendo problemas comuns de autenticação SSH

Para depurar problemas de conexão, use o modo verbose:

ssh -v servidor-dev
ssh -vvv servidor-dev

Verifique permissões incorretas, uma causa frequente de falhas:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/authorized_keys

Conflitos de chaves podem ocorrer quando múltiplas chaves são oferecidas ao servidor. Use IdentitiesOnly yes no config para forçar o uso de uma chave específica.

7. Segurança avançada e boas práticas

Proteja sempre as chaves com senha forte (mínimo 16 caracteres, com maiúsculas, minúsculas, números e símbolos). O ssh-agent evita redigitar a senha a cada conexão.

Para rotação segura de chaves:

# Gerar nova chave
ssh-keygen -t ed25519 -C "novo-email@exemplo.com" -f ~/.ssh/id_ed25519_novo

# Adicionar ao servidor
ssh-copy-id -i ~/.ssh/id_ed25519_novo.pub usuario@servidor

# Remover chave antiga do servidor (editar authorized_keys manualmente)

No servidor, restrinja o uso de chaves no arquivo ~/.ssh/authorized_keys:

from="192.168.1.0/24",command="/usr/bin/rsync --server" ssh-ed25519 AAAAC3... chave@exemplo

8. Automação e integração com ferramentas externas

Organize configurações complexas usando a diretiva Include:

# ~/.ssh/config
Include config.d/*

Crie scripts para gerenciar chaves temporárias:

#!/bin/bash
# add-temp-key.sh
ssh-add -t 3600 ~/.ssh/chave_temporaria
echo "Chave adicionada por 1 hora"

Para integração com ferramentas como Ansible, Git e rsync, o config SSH garante que todas usem as mesmas configurações:

# Git usando config SSH
git clone git@github.com:usuario/repositorio.git

# Rsync via SSH
rsync -avz --rsh='ssh' /local/pasta usuario@servidor:/remoto/

# Ansible usando inventário com SSH config
ansible-playbook -i inventario.ini playbook.yml

Dominar o gerenciamento de chaves SSH com ssh-agent e ~/.ssh/config transforma a experiência de administração de servidores, automatizando conexões e aumentando significativamente a segurança e produtividade no trabalho com infraestrutura remota.

Referências