03 - Troca de Chave de Sessão
video: https://youtu.be/... no frontmatter da nota.A Troca de Chave de Sessão (ou Key Exchange - KEX) é o momento técnico onde o segredo da criptografia é gerado. No SSH, isso é feito de forma que um atacante observando a rede não consiga descobrir a chave, mesmo capturando todos os pacotes.
1. O Algoritmo Diffie-Hellman (DH)
O método padrão para a troca de chaves é o Diffie-Hellman (ou sua versão moderna ECDH - Elliptic Curve Diffie-Hellman).
O processo simplificado funciona assim:
1. Chave de Host (Host Key): O servidor envia sua chave pública para o cliente. O cliente verifica se confia nela (conferindo o arquivo known_hosts).
2. Valores Temporários: Cada lado gera um par de chaves temporárias (efêmeras) e trocam os valores públicos entre si.
3. Cálculo do Segredo: Através de propriedades matemáticas complexas, tanto o cliente quanto o servidor calculam o mesmo valor final, sem que esse valor tenha sido enviado pela rede.
Fundamento Matemático do DH
A mágica do Diffie-Hellman está na propriedade comutativa da exponenciação modular:
Públicos: p (primo grande), g (gerador)
Alice escolhe a (privado), envia A = g^a mod p
Bob escolhe b (privado), envia B = g^b mod p
Segredo compartilhado: S = B^a mod p = A^b mod p = g^(ab) mod p
Um atacante que capture A e B na rede não consegue calcular S sem conhecer a ou b, o que exigiria resolver o problema do logaritmo discreto — computacionalmente intratável para números de 2048+ bits.
2. A Chave de Sessão (Session Key)
A partir do segredo gerado pelo Diffie-Hellman, o SSH deriva Chaves de Sessão Simétricas (usando algoritmos como SHA-256). Estas chaves são usadas para:
- Criptografar o tráfego (ex: usando AES).
- Gerar os MACs (Message Authentication Codes) para garantir a integridade.
A partir deste momento, todo o tráfego da rede está criptografado. O que quer que o cliente envie agora (como sua senha) será invisível para qualquer um no meio do caminho.
Derivação de Múltiplas Chaves
O SSH deriva 6 chaves distintas a partir do segredo compartilhado (definidas na RFC 4253):
| Chave | Função | Direção |
|---|---|---|
| IV Cliente → Servidor | Vetor de inicialização (cifra) | C→S |
| IV Servidor → Cliente | Vetor de inicialização (cifra) | S→C |
| Chave de Cifra C→S | Criptografia de dados | C→S |
| Chave de Cifra S→C | Criptografia de dados | S→C |
| Chave de MAC C→S | Integrity/autenticação | C→S |
| Chave de MAC S→C | Integrity/autenticação | S→C |
A separação direcional previne ataques de reflexão, onde um atacante reverteria pacotes de uma direção na outra.
3. Perfect Forward Secrecy (PFS)
Como as chaves efêmeras usadas no Diffie-Hellman são descartadas assim que a sessão termina, o SSH garante a Sigilo Direto Perfeito.
- Se um atacante capturar e guardar o tráfego criptografado hoje e, daqui a um ano, conseguir roubar a Chave de Host do servidor, ele ainda assim não conseguirá descriptografar os dados salvos.
- Isso ocorre porque a chave de host foi usada apenas para Autenticação (provar que o servidor é ele mesmo), mas não para a Criptografia dos dados.
4. Algoritmos KEX Suportados
O SSH-2 (RFC 4253) permite múltiplos algoritmos de troca de chaves. Os principais são:
| Algoritmo | Curva/Grupo | RFC | Status Moderno |
|---|---|---|---|
diffie-hellman-group1-sha1 |
Oakley Group 2 (1024-bit) | RFC 4253 | Obsoleto (inseguro) |
diffie-hellman-group14-sha1 |
Oakley Group 14 (2048-bit) | RFC 4253 | Aceitável, mas SHA-1 fraco |
diffie-hellman-group14-sha256 |
2048-bit + SHA-256 | RFC 8268 | Recomendado mínimo |
diffie-hellman-group16-sha512 |
4096-bit + SHA-512 | RFC 8268 | Recomendado alto |
diffie-hellman-group18-sha512 |
8192-bit + SHA-512 | RFC 8268 | Recomendado máximo |
ecdh-sha2-nistp256 |
NIST P-256 (ECDH) | RFC 5656 | Recomendado |
ecdh-sha2-nistp384 |
NIST P-384 (ECDH) | RFC 5656 | Recomendado alto |
curve25519-sha256 |
Curve25519 | RFC 8731 | Recomendado padrão |
curve25519-sha256@libssh.org |
Curve25519 (variante) | Proposta OpenSSH | Recomendado |
sntrup761x25519-sha512@openssh.com |
Pós-quântico híbrido | OpenSSH 8.5+ | Resistente a Shor |
5. Curve25519 - O Padrão Moderno
A Curve25519 foi projetada por Daniel J. Bernstein em 2005 e é hoje a escolha padrão do OpenSSH por:
- Performance: Mais rápida que RSA e ECDH-NIST em software.
- Segurança contra timing attacks: Implementação naturalmente resistente a ataques de canal lateral.
- Sem suspeitas de backdoor: Ao contrário das curvas NIST (que tiveram coeficientes escolhidos pela NSA sem justificativa pública), a Curve25519 tem parâmetros matemáticos transparentes.
- Tamanho compacto: Apenas 32 bytes por chave pública.
Exemplo de Configuração no sshd_config
# /etc/ssh/sshd_config
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512
6. RSA Key Exchange (Obsoleto)
Versões antigas do SSH suportavam rsa-key-exchange, onde a chave de sessão era gerada pelo cliente e enviada cifrada com a chave pública RSA do servidor. Esse modelo não oferece Perfect Forward Secrecy — se a chave privada do servidor for comprometida no futuro, todas as sessões gravadas poderão ser descriptografadas.
Por isso, o RSA KEX foi removido do OpenSSH 8.2+ em 2020.
7. ED25519 - O Futuro das Chaves de Host
A mesma curva Curve25519 que serve para KEX também é usada para gerar chaves de assinatura Ed25519 (RFC 8032). Vantagens sobre RSA:
- Chaves públicas de apenas 32 bytes (vs 256 bytes de RSA-2048).
- Assinaturas de 64 bytes (vs 256 bytes de RSA-2048).
- Verificação e geração extremamente rápidas.
- Resistente a colisões conhecidas em SHA-1.
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519
O parâmetro -a 100 aplica 100 rodadas de KDF (Key Derivation Function) sobre a passphrase, dificultando ataques de força bruta offline.
8. ECDSA - A Alternativa NIST
O ECDSA (Elliptic Curve Digital Signature Algorithm) usa as curvas NIST P-256, P-384 e P-521 para gerar chaves de assinatura. Embora seja mais rápido e compacto que o RSA, há suspeitas históricas de que coeficientes das curvas NIST foram escolhidos pela NSA para permitir backdoors. Por isso, a comunidade prefere Ed25519 quando disponível.
ssh-keygen -t ecdsa -b 521 -f ~/.ssh/id_ecdsa
9. Troca de Chaves em Alta Velocidade (Rekey)
Para limitar o impacto de um eventual vazamento de chave de sessão, o SSH faz rekeying automático:
- Após 1 GB de dados trafegados.
- Após 1 hora de sessão ativa.
Esses limites são configuráveis no sshd_config:
RekeyLimit 1G 1h
10. Resumo Técnico
| Atributo | Valor |
|---|---|
| Fase SSH | Transport layer (RFC 4253) |
| Algoritmo padrão | Curve25519 (moderno) |
| Algoritmo legado | DH Group 14/18 |
| Propriedade crítica | Perfect Forward Secrecy |
| Chaves derivadas | 6 (IV+Cifra+MAC em cada direção) |
| Rekeying | A cada 1GB ou 1h |
| Resistente a Shor | Apenas sntrup761x25519 |
11. Conclusão
A troca de chaves é o coração criptográfico do SSH. Sem ela, qualquer um na rede poderia ler senhas e comandos. O uso de Diffie-Hellman efêmero, complementado pelas modernas curvas Curve25519 e Ed25519, garante propriedades de segurança fortes como Perfect Forward Secrecy e resistência a ataques quânticos. Compreender esses algoritmos é essencial para configurar servidores SSH robustos e compatíveis com as melhores práticas modernas.