Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

04 - Chaves de Autenticação

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione 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:

  1. Pedido (SSH_MSG_USERAUTH_REQUEST): Cliente informa ao servidor que deseja autenticar-se via publickey com uma chave específica.
  2. 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.
  3. Assinatura (SSH_MSG_USERAUTH_REQUEST): Cliente decifra o desafio usando a chave privada local, assina matematicamente o desafio + session_id e devolve ao servidor.
  4. 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_id do 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.