04 - Chaves de Autenticação
video: https://youtu.be/... no frontmatter da nota.Chaves de Autenticação
1. Definição e Contexto
No protocolo SSH, as chaves de autenticação (public key authentication) representam o método mais robusto e amplamente recomendado de validar a identidade de um usuário. Ao contrário das senhas tradicionais, vulneráveis a ataques de força bruta e intercepção, a autenticação por chave baseia-se em criptografia assimétrica — um par de chaves matemáticas que permite ao servidor verificar a legitimidade do cliente sem que nenhum segredo sensível trafegue pela rede. Este mecanismo está definido nas RFCs 4252 (Authentication) e 4253 (Transport), complementadas pela RFC 8709 (Ed25519 e Ed448).
Características Fundamentais
- Algoritmo: Criptografia assimétrica (RSA, ECDSA, Ed25519).
- Sem envio de segredo: A chave privada nunca sai do cliente.
- Desafio-resposta: Servidor cifra um nonce com a chave pública; cliente decifra e devolve assinado.
- Tamanho típico: Ed25519 (32 bytes), RSA-4096 (512 bytes).
- Arquivo local:
~/.ssh/id_*(privada) e~/.ssh/id_*.pub(pública). - Arquivo servidor:
~/.ssh/authorized_keys.
2. O Par de Chaves: Pública e Privada
O fundamento deste método é a separação de funções entre duas chaves geradas matematicamente como par:
| Chave | Local | Função | Distribuição |
|---|---|---|---|
Privada (id_ed25519) |
Cliente | Assina desafios | Nunca sai do cliente |
Pública (id_ed25519.pub) |
Servidor (authorized_keys) |
Verifica assinaturas | Pode ser publicada livremente |
Geração de um Par de Chaves
# Ed25519 (recomendado moderno — curva elíptica, rápido e seguro)
ssh-keygen -t ed25519 -C "usuario@host-2025" -f ~/.ssh/id_ed25519
# RSA 4096 (legado, compatibilidade com sistemas antigos)
ssh-keygen -t rsa -b 4096 -C "usuario@host-2025" -f ~/.ssh/id_rsa
# ECDSA (alternativa curva elíptica, FIPS 186-4)
ssh-keygen -t ecdsa -b 521 -f ~/.ssh/id_ecdsa
# Chave FIDO2/hardware (YubiKey, SoloKeys) — RFC 8709
ssh-keygen -t ed25519-sk -f ~/.ssh/id_ed25519_sk
# Copiar a chave pública para um servidor remoto
ssh-copy-id -i ~/.ssh/id_ed25519.pub usuario@servidor.exemplo.com
3. Algoritmos de Chave — Comparativo
A escolha do algoritmo define o nível de segurança, performance e compatibilidade:
| Algoritmo | Tamanho | Segurança equivalente | Velocidade | Status |
|---|---|---|---|---|
| RSA-2048 | 256 B | 112 bits | Lento | Obsoleto (NIST 2030) |
| RSA-3072 | 384 B | 128 bits | Lento | Aceitável |
| RSA-4096 | 512 B | ~150 bits | Muito lento | Compatível |
| ECDSA-256 | 32 B | 128 bits | Rápido | Comum em FIPS |
| ECDSA-521 | 66 B | 256 bits | Rápido | Forte |
| Ed25519 | 32 B | 128 bits | Muito rápido | Recomendado |
| Ed25519-SK | 32 B + token | 128 bits + hardware | Rápido | Recomendado (FIDO2) |
| DSA-1024 | 64 B | 80 bits | — | Obsoleto (RFC 8268) |
Recomendações Atuais
- Ed25519 é o padrão moderno desde OpenSSH 6.5 (2014). Oferece segurança equivalente a RSA-3072 com chaves 16 vezes menores.
- RSA-4096 permanece como fallback para sistemas legados (roteadores antigos, appliances).
- Ed25519-SK (security key) adiciona hardware token (YubiKey, SoloKeys), exigindo toque físico para autenticação — ideal para administradores.
4. Fluxo de Autenticação (Desafio-Resposta)
O processo não envia a chave privada pela rede, mas sim uma prova criptográfica de posse:
- Pedido (SSH_MSG_USERAUTH_REQUEST): Cliente informa ao servidor que deseja autenticar-se via
publickeycom uma chave específica. - Desafio (SSH_MSG_USERAUTH_PK_OK): Servidor gera um nonce aleatório (session_id + identificador de chave), cifra-o com a chave pública do usuário e envia ao cliente.
- Assinatura (SSH_MSG_USERAUTH_REQUEST): Cliente decifra o desafio usando a chave privada local, assina matematicamente o desafio + session_id e devolve ao servidor.
- Validação: Servidor verifica a assinatura usando a chave pública armazenada em
authorized_keys. Se válida, acesso concedido instantaneamente.
Características de Segurança
- Sem replay: O nonce é único por sessão (inclui
session_iddo transporte SSH). - Sem vazamento: A chave privada nunca sai do cliente.
- Não-repúdio: A assinatura prova matematicamente que o portador da chave privada autorizou.
5. Proteção da Chave Privada: Passphrase
Embora a chave de autenticação elimine a senha do servidor, recomenda-se proteger a própria chave privada no disco com uma passphrase, que a cifra simetricamente (AES-256-CTR ou bcrypt KDF).
Configuração de Passphrase
# Adicionar passphrase a uma chave existente
ssh-keygen -p -f ~/.ssh/id_ed25519
# KDF moderna (bcrypt, mais resistente a brute force)
ssh-keygen -o -a 100 -t ed25519 -f ~/.ssh/id_ed25519
SSH Agent
Para evitar digitar a passphrase em cada conexão, usa-se o ssh-agent, que mantém a chave desbloqueada na memória RAM durante a sessão:
# Iniciar o agente
eval "$(ssh-agent -s)"
# Adicionar a chave (solicita passphrase uma vez)
ssh-add ~/.ssh/id_ed25519
# Listar chaves carregadas
ssh-add -l
# Remover chave do agente
ssh-add -d ~/.ssh/id_ed25519
Forwarding de Agente (Agent Forwarding)
Permite que conexões SSH em cascata (A → B → C) usem a chave do usuário de A para autenticar em C, sem que a chave privada saia de A. Risco: se B estiver comprometido, um atacante pode usar o socket do agente forwardado para autenticar-se como o usuário. Preferir ProxyJump em vez de AgentForwarding sempre que possível.
6. Arquivo authorized_keys
O servidor gerencia chaves autorizadas em ~/.ssh/authorized_keys. Cada linha contém:
options keytype base64-key comment
Opções Restritivas Comuns
| Opção | Função |
|---|---|
from="200.10.0.0/24" |
Limita origem por IP/CIDR |
command="/usr/bin/backup.sh" |
Força execução de comando específico |
no-pty |
Nega terminal interativo |
no-port-forwarding |
Bloqueia -L, -R, -D |
no-X11-forwarding |
Bloqueia X11 |
no-agent-forwarding |
Bloqueia -A |
permitlisten="" |
Bloqueia -R |
permitopen="host:443" |
Limita -L a destino específico |
expiry-time="20251231T235959" |
Expiração da chave |
Exemplo Prático (chave de backup automatizado)
from="10.0.0.50",command="/usr/local/bin/backup-restricted.sh",no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... backup@cron
7. Segurança e Boas Práticas
Rotação de Chaves
Recomenda-se rodar chaves pessoais a cada 1-2 anos e imediatamente após qualquer suspeita de comprometimento. Em ambientes corporativos, ferramentas como HashiCorp Vault SSH Secrets Engine automatizam emissão e revogação. Para revogação: remover a linha do authorized_keys em cada servidor (manual ou via configuration management) ou usar SSH CA (RFC 6187) — revogar uma chave de CA invalida todos os certificados emitidos.
Fingerprints e Verificação TOFU
Cada chave pública tem um fingerprint (SHA-256 em base64). Na primeira conexão, o cliente pergunta se confia; em conexões subsequentes, compara com ~/.ssh/known_hosts. Mudança de fingerprint indica possível MITM ou reconfiguração legítima.
ssh-keygen -l -f ~/.ssh/known_hosts # Listar fingerprints
ssh-keygen -lv -f ~/.ssh/known_hosts # ASCII art para identificação humana
Certificados SSH (RFC 6187)
Em vez de distribuir chaves públicas em cada servidor, gera-se um certificado assinado por uma CA interna. O servidor confia apenas na CA, e cada usuário recebe um certificado com tempo de expiração. Simplifica revogação em escala.
8. Auditoria e Diagnóstico
# Testar qual método de autenticação SSH é usado de fato
ssh -v usuario@servidor.exemplo.com 2>&1 | grep -i auth
# Listar chaves disponíveis no agente
ssh-add -L
# Verificar permissões (600 privada, 644 pública, 700 ~/.ssh)
ls -l ~/.ssh/
# Auditar chaves autorizadas em um servidor remoto
ssh usuario@servidor 'cat ~/.ssh/authorized_keys'
# Validar uma chave privada (se está bem-formada e cifra compatível)
ssh-keygen -y -f ~/.ssh/id_ed25519 | head -1
9. Resumo Técnico
| Atributo | Valor |
|---|---|
| Método | Assimétrico (desafio-resposta) |
| Algoritmos modernos | Ed25519, Ed25519-SK (FIDO2) |
| Algoritmos legados | RSA-4096, ECDSA |
| RFCs | 4252, 4253, 6187, 8268, 8709 |
| Arquivo cliente (privada) | ~/.ssh/id_* |
| Arquivo cliente (pública) | ~/.ssh/id_*.pub |
| Arquivo servidor | ~/.ssh/authorized_keys |
| Armazenamento de chave no agente | RAM (apenas sessão atual) |
10. Conclusão
As chaves de autenticação SSH são o padrão moderno para acesso remoto seguro. Eliminam o problema das senhas fracas, são imunes a ataques de replay e, combinadas com passphrase + ssh-agent + tokens FIDO2, oferecem múltiplas camadas de defesa. Em escala corporativa, o uso de Certificados SSH (CA) simplifica a gestão, permitindo emitir credenciais com tempo de expiração embutido. O domínio de opções restritivas em authorized_keys (from, command, no-pty) permite implementar princípio do menor privilégio mesmo em cenários de automação. Para administradores e analistas de segurança, auditar periodicamente chaves autorizadas, rotacionar chaves antigas e migrar de RSA para Ed25519 são tarefas essenciais de hardening de infraestrutura SSH.