TL;DR — Resumo Rápido
Guia de gestão de chaves SSH para sysadmins: gere chaves Ed25519, use ssh-agent, configure ~/.ssh/config, rode e revogue chaves e use certificados SSH.
As chaves SSH são a base do acesso remoto seguro para todo sysadmin e profissional de DevOps. Este guia de gerenciamento de chaves SSH cobre o ciclo de vida completo: gerar chaves, armazená-las em cache com ssh-agent, organizar múltiplos hosts com ~/.ssh/config, implantar chaves públicas, rotacionar e revogar credenciais comprometidas, escalar com certificados SSH e fortalecer com chaves de hardware.
Pré-requisitos
- Linux, macOS ou WSL com cliente OpenSSH (
ssh,ssh-keygen,ssh-agent,ssh-copy-id). - Acesso SSH a pelo menos um servidor remoto para praticar.
- Opcional:
ssh-audit(pip install ssh-audit) para auditoria de algoritmos. - Opcional: YubiKey ou outra chave de hardware FIDO2 para máxima proteção.
Geração de Chaves SSH: Ed25519 vs RSA
Ed25519 (recomendado)
ssh-keygen -t ed25519 -C "voce@exemplo.com"
Ed25519 usa criptografia de curva elíptica sobre Curve25519. As chaves têm 256 bits, as assinaturas são rápidas e o algoritmo é resistente a ataques de canal lateral. Esta é a escolha padrão para todas as novas chaves.
RSA (compatibilidade legada)
ssh-keygen -t rsa -b 4096 -C "voce@exemplo.com"
Use RSA-4096 apenas quando o sistema remoto não suportar Ed25519 — por exemplo, versões muito antigas do OpenSSH (< 6.5) ou certos dispositivos de rede. RSA-2048 não é mais recomendado.
Melhores práticas para senhas
- Sempre defina uma senha. Ela criptografa sua chave privada em disco. Uma chave roubada sem a senha é inútil.
- Use pelo menos 20 caracteres — uma senha aleatória do seu gerenciador de senhas é ideal.
- Armazene-a no seu gerenciador de senhas (1Password, Bitwarden, pass).
SSH Agent: Cache de Chaves na Sessão
# Iniciar o agente
eval "$(ssh-agent -s)"
# Adicionar sua chave (solicita senha uma vez)
ssh-add ~/.ssh/id_ed25519
# Listar chaves carregadas
ssh-add -l
# Remover todas as chaves
ssh-add -D
Dica de segurança: Passe -t 3600 ao ssh-add para expirar automaticamente a chave após uma hora:
ssh-add -t 3600 ~/.ssh/id_ed25519
Arquivo de Configuração SSH: Gerenciando Múltiplos Hosts
# ~/.ssh/config
# Configurações padrão para todos os hosts
Host *
AddKeysToAgent yes
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
ServerAliveCountMax 3
# Servidor web de produção
Host prod-web
HostName 203.0.113.10
User deploy
Port 22
IdentityFile ~/.ssh/id_ed25519_prod
# Servidor de banco de dados interno via jump host
Host db-internal
HostName 10.0.1.50
User dbadmin
ProxyJump prod-web
# GitHub
Host github.com
User git
IdentityFile ~/.ssh/id_ed25519_github
Com esta configuração, ssh prod-web conecta com o usuário e a chave corretos, e ssh db-internal tunela automaticamente pelo bastion.
Implantação de Chaves Públicas
ssh-copy-id (mais fácil)
ssh-copy-id -i ~/.ssh/id_ed25519.pub usuario@host
Implantação manual
cat ~/.ssh/id_ed25519.pub | ssh usuario@host \
"mkdir -p ~/.ssh && chmod 700 ~/.ssh && \
cat >> ~/.ssh/authorized_keys && \
chmod 600 ~/.ssh/authorized_keys"
Permissões de arquivo — crítico
| Caminho | Permissão | Por que |
|---|---|---|
~/.ssh/ | 700 | Apenas o proprietário pode listar/entrar |
~/.ssh/id_ed25519 | 600 | Chave privada — apenas leitura/escrita do proprietário |
~/.ssh/id_ed25519.pub | 644 | Chave pública — legível por todos |
~/.ssh/authorized_keys | 600 | Apenas o proprietário pode modificar |
~/.ssh/config | 600 | Impede que outros leiam sua configuração |
O SSH recusará usar chaves com permissões de leitura global e falhará silenciosamente.
Estratégias de Rotação de Chaves
Rotacione chaves SSH quando:
- Uma chave é mais antiga que a política da sua organização (comumente 1–2 anos).
- Um funcionário com acesso a chaves sai da empresa.
- Uma máquina ou mídia que continha a chave privada é descontinuada ou perdida.
- Você suspeita de comprometimento.
Procedimento seguro de rotação:
- Gere um novo par de chaves:
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_nova. - Implante a nova chave pública em todos os hosts sem remover a antiga.
- Verifique se você pode fazer login com a nova chave:
ssh -i ~/.ssh/id_ed25519_nova usuario@host. - Atualize
~/.ssh/configpara usar a nova chave. - Remova a chave pública antiga de todos os arquivos
authorized_keys. - Delete com segurança a chave privada antiga:
shred -u ~/.ssh/id_ed25519_antiga.
Revogação de Chaves Comprometidas
O SSH não tem uma lista de revogação integrada para chaves públicas, então a revogação é um processo manual:
- Remova a chave imediatamente de todos os arquivos
authorized_keysem todos os hosts. - Para infraestruturas de certificados SSH, adicione a chave a um arquivo
RevokedKeysno servidor (RevokedKeys /etc/ssh/revoked_keysnosshd_config). - Audite os logs de login (
/var/log/auth.log,journalctl -u ssh) para sessões usando a chave comprometida. - Rotacione quaisquer segredos ou credenciais que possam ter sido acessados.
Certificados SSH: Gerenciamento de Frotas em Escala
Quando você tem dezenas ou centenas de servidores, gerenciar authorized_keys em cada máquina é propenso a erros. Os certificados SSH resolvem isso introduzindo uma Autoridade Certificadora (CA).
Criar um par de chaves CA
ssh-keygen -t ed25519 -f /etc/ssh/ca_key -C "org-ssh-ca"
Mantenha ca_key privada e offline. Distribua ca_key.pub para cada servidor.
Configurar servidores para confiar na CA
# /etc/ssh/sshd_config
TrustedUserCAKeys /etc/ssh/ca_key.pub
Assinar uma chave de usuário
ssh-keygen -s /etc/ssh/ca_key \
-I "alice@corp" \
-n alice,admin \
-V +30d \
~/.ssh/id_ed25519.pub
Vantagens sobre authorized_keys
- Expiração automática — os certificados expiram sem limpeza manual.
- Controle centralizado — revogue removendo a confiança da CA ou usando
RevokedKeys. - Aplicação de principals — um certificado só pode fazer login como nomes de usuário específicos.
Chaves de Hardware: YubiKey e FIDO2
# Gerar chave armazenada no YubiKey/FIDO2 (OpenSSH 8.2+)
ssh-keygen -t ed25519-sk -O resident -C "yubikey@corp"
A chave privada nunca sai do dispositivo. Durante a autenticação, o dispositivo requer um toque físico, tornando impossível o roubo remoto de chaves.
Tabela Comparativa: Ed25519 vs RSA vs ECDSA
| Característica | Ed25519 | RSA-4096 | ECDSA P-256 |
|---|---|---|---|
| Tamanho da chave | 256 bits | 4096 bits | 256 bits |
| Velocidade de assinatura | Muito rápida | Lenta | Rápida |
| Velocidade de verificação | Rápida | Rápida | Rápida |
| Tamanho do arquivo de chave | ~400 bytes | ~3.3 KB | ~600 bytes |
| Compatibilidade legada | OpenSSH 6.5+ (2014) | Universal | OpenSSH 5.7+ (2011) |
| Resistência a ataques de canal lateral | Excelente | Moderada | Ruim |
| Chave FIDO2/hardware | Sim (ed25519-sk) | Não | Sim (ecdsa-sk) |
| Recomendação | Primeira escolha | Apenas legado | Evitar |
Cenário Real
Você tem uma frota de produção de 40 servidores Linux. Três desenvolvedores saíram da empresa no mês passado. Você precisa revogar o acesso SSH deles imediatamente sem tempo de inatividade.
Com authorized_keys: Você deve acessar (ou usar Ansible) todos os 40 servidores, localizar a impressão digital da chave pública de cada usuário saindo, remover essas linhas e repetir. Um servidor esquecido é uma brecha.
Com certificados SSH: A CA simplesmente para de assinar certificados para esses usuários. Certificados existentes expiram naturalmente. Para revogação imediata, adicione suas impressões digitais ao arquivo RevokedKeys implantado via Ansible em segundos:
ssh-keygen -lf usuario-saindo-cert.pub >> /tmp/revogados
ansible all -m copy -a "src=/tmp/revogados dest=/etc/ssh/revoked_keys mode=0644"
ansible all -m service -a "name=sshd state=reloaded"
Concluído em menos de dois minutos em toda a frota.
Configuração SSH no GitHub e GitLab
GitHub
gh ssh-key add ~/.ssh/id_ed25519.pub --title "estacao-trabalho-2026"
Teste: ssh -T git@github.com
GitLab
Adicione a chave em GitLab → Configurações do Usuário → Chaves SSH.
Teste: ssh -T git@gitlab.com
Armadilhas e Casos Especiais
- StrictHostKeyChecking=no em scripts — Desabilitar a verificação de chave de host remove a proteção contra ataques man-in-the-middle. Em vez disso, pré-popule
~/.ssh/known_hostscomssh-keyscandurante o provisionamento. - Chaves compartilhadas — Nunca compartilhe uma chave privada entre múltiplas pessoas ou máquinas. Cada pessoa e máquina deve ter seu próprio par de chaves.
- Login root — Desabilite
PermitRootLogin yesnosshd_config. Use um usuário regular comsudo. - Nomes de chave não padrão — Se você criar uma chave com nome não padrão, o SSH não a usará automaticamente. Especifique-a no
~/.ssh/configou passe-iexplicitamente.
Solução de Problemas
| Problema | Solução |
|---|---|
| ”Permission denied (publickey)“ | Verifique permissões com ls -la ~/.ssh/. Execute ssh -vvv host para ver quais chaves são tentadas |
| Agente não funciona | Verifique com ssh-add -l. Se disser “Could not open connection to agent”, execute eval $(ssh-agent -s) |
| Chave errada usada para o host | Adicione IdentityFile explícito e IdentitiesOnly yes no ~/.ssh/config |
| ”Host key verification failed” | A chave do servidor mudou. Remova a entrada antiga: ssh-keygen -R hostname |
| Certificado rejeitado | Verifique a expiração com ssh-keygen -L -f cert.pub. Verifique se o principal corresponde ao nome de usuário |
| YubiKey não detectado | Certifique-se de que pcscd está ativo (systemctl start pcscd). Tente ssh-add -K para carregar chaves residentes |
Resumo
- Gere chaves Ed25519 para todos os novos pares; use RSA-4096 apenas para compatibilidade legada.
- Sempre defina uma senha e use
ssh-agentpara armazená-la em cache na sessão. - Use
~/.ssh/configcomProxyJumppara gerenciar múltiplos hosts e bastions de forma limpa. - Implante chaves com
ssh-copy-id; nunca compartilhe chaves privadas entre pessoas ou máquinas. - Para frotas de mais de ~10 servidores, adote certificados SSH para expiração, principals e revogação centralizada.
- Armazene chaves em hardware FIDO2 (YubiKey) para máxima segurança.
- Aplique permissões de arquivo corretas (
700em~/.ssh/,600em chaves eauthorized_keys). - Audite regularmente a configuração do seu servidor SSH com
ssh-audit.