08 - Fundamentos
video: https://youtu.be/... no frontmatter da nota.Fundamentos do Protocolo SSH
O SSH (Secure Shell) é o protocolo da Camada de Aplicação que substituiu com segurança os antigos rsh, rlogin, telnet e rsh. Definido pelas RFCs 4250-4256 (2006) e atualizado pelas RFCs 5656, 6668, 8268, 8308, 8709 e 8731, o SSH provê canal criptografado, autenticado e com integridade sobre uma rede não confiável (como a internet). É hoje o padrão de fato para administração remota de sistemas Unix/Linux, transferência segura de arquivos (SFTP/SCP) e tunelamento de portas.
1. Características Fundamentais
| Atributo | Valor |
|---|---|
| Camada OSI | 7 (Aplicação) |
| Protocolo de transporte | TCP |
| Porta padrão | 22 |
| Modelo | Cliente-Servidor |
| Estado | Stateful (sessão persistente) |
| Cifragem padrão | ChaCha20-Poly1305, AES-GCM |
| Troca de chaves | Curve25519, ECDH, DH |
| RFCs principais | 4250, 4251, 4252, 4253, 4254, 5656, 8731, 8709 |
2. Camadas do Protocolo SSH
O SSH é estruturado em três camadas internas:
| Camada | RFC | Função |
|---|---|---|
| Transport Layer | 4253 | Estabelece canal seguro, troca de chaves, criptografia |
| Authentication Layer | 4252 | Autentica o usuário (senha, chave pública, Kerberos) |
| Connection Layer | 4254 | Multiplexa canais (shell, exec, X11, port-forwarding) |
Essa separação permite que cada camada use algoritmos independentes negociados dinamicamente.
3. Etapas de uma Conexão SSH
- TCP Handshake: cliente abre conexão TCP na porta 22.
- Version Exchange: cliente e servidor trocam strings de versão (ex:
SSH-2.0-OpenSSH_9.6). - Algorithm Negotiation: troca de pacotes
SSH_MSG_KEXINITlistando algoritmos suportados (KEX, host key, cipher, MAC, compression). - Key Exchange (KEX): Diffie-Hellman ou ECDH. Ambos derivam chave de sessão compartilhada sem transmiti-la.
- Server Authentication: servidor assina o hash
Hcom sua chave privada. Cliente verifica contra~/.ssh/known_hosts(Trust On First Use - TOFU). - New Keys: pacote
SSH_MSG_NEWKEYSativa as chaves derivadas e cifras. - User Authentication: usuário prova identidade (senha, chave pública, GSSAPI/Kerberos, etc).
- Channel Opening: aberto canal de sessão (shell, exec, subsistema SFTP).
- Dados criptografados: comandos e respostas trafegam com confidencialidade e integridade.
4. Negociação de Algoritmos
Categorias Negociadas
| Categoria | Exemplos Modernos |
|---|---|
| Key Exchange (KEX) | curve25519-sha256, ecdh-sha2-nistp256, diffie-hellman-group16-sha512 |
| Host Key | ssh-ed25519, rsa-sha2-512, ecdsa-sha2-nistp256 |
| Cipher | chacha20-poly1305@openssh.com, aes256-gcm@openssh.com, aes256-ctr |
| MAC (modo CTR) | hmac-sha2-256-etm@openssh.com, umac-128-etm@openssh.com |
| Compression | none, zlib@openssh.com |
# Lista algoritmos suportados pelo cliente
ssh -Q kex
ssh -Q cipher
ssh -Q mac
ssh -Q key
# Força algoritmo específico (debug)
ssh -o KexAlgorithms=curve25519-sha256 \
-o Ciphers=chacha20-poly1305@openssh.com \
-o MACs=hmac-sha2-256-etm@openssh.com \
user@host
5. Métodos de Autenticação
Por Senha (password)
Senha é enviada pelo canal criptografado. Seguro contra sniffing, mas vulnerável a brute-force.
Por Chave Pública (publickey)
- Recomendado pela RFC 4252 e NIST SP 800-63B.
- Cliente prova posse da chave privada respondendo a um desafio assinado.
- Servidor verifica a assinatura contra
~/.ssh/authorized_keys.
| Algoritmo | Tamanho | Recomendação |
|---|---|---|
| Ed25519 (RFC 8709) | 256 bits | Recomendado (rápido, seguro) |
| RSA-SHA2 (RFC 8332) | 3072-4096 | Aceitável (use SHA-2, não SHA-1) |
| ECDSA | 256/384/521 | Aceitável (curvas NIST) |
| DSA | 1024 | Obsoleto (removido do OpenSSH 9.0+) |
| Ed25519-SK | 256 + FIDO2 | Hardware token (YubiKey, etc) |
Por Teclado Interativo (keyboard-interactive)
Permite múltiplos desafios (incluindo 2FA via TOTP, OATH).
GSSAPI/Kerberos
Integração com Active Directory ou MIT Kerberos (SSO empresarial).
Host-based
Confiança baseada no host de origem (estilo antigo .rhosts, mas criptografado).
6. Connection Layer e Canais
Após autenticado, o SSH multiplexa múltiplos canais lógicos na mesma conexão TCP:
| Canal | Função |
|---|---|
session |
Shell interativo, comando único, subsistema |
direct-tcpip / forwarded-tcpip |
Port forwarding local (-L) / remoto (-R) |
x11 |
Túnel X11 (aplicações gráficas Unix) |
subsystem |
Subsistemas como sftp |
7. Recursos do SSH
Port Forwarding
ssh -L 8080:interno.exemplo.com:80 user@gateway.exemplo.com # local (-L): acessa serviço remoto via porta local
ssh -R 9090:localhost:22 user@servidor.exemplo.com # remoto (-R): expõe porta local no servidor remoto
ssh -D 1080 user@servidor.exemplo.com # dinâmico (-D): SOCKS proxy
Agent Forwarding vs ProxyJump
ssh -A user@servidor.exemplo.com # Agent Forwarding (riscoso — agentes comprometidos no servidor)
ssh -J jump@bastion.exemplo.com user@alvo.exemplo.com # ProxyJump (recomendado desde OpenSSH 7.3+)
SCP e SFTP
scp arquivo.txt user@host:/tmp/ # SCP (legado, simplificado)
sftp user@host # SFTP (recomendado, RFC 4251)
8. Configuração do Servidor (sshd_config)
# /etc/ssh/sshd_config
Port 22
Protocol 2
PermitRootLogin prohibit-password
PasswordAuthentication no
PubkeyAuthentication yes
UsePAM yes
# Algoritmos modernos
KexAlgorithms curve25519-sha256,ecdh-sha2-nistp256
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com
HostKeyAlgorithms ssh-ed25519,rsa-sha2-512,ecdsa-sha2-nistp256
# Limites e isolamento
MaxAuthTries 3
LoginGraceTime 30
AllowUsers admin deploy
AllowGroups sshusers
X11Forwarding no
ClientAliveInterval 300
ClientAliveCountMax 2
# Chroot para SFTP-only
Subsystem sftp internal-sftp
Match Group sftpusers
ChrootDirectory /home/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
9. Vulnerabilidades Históricas e Mitigações
| Vulnerabilidade | Ano | Mitigação |
|---|---|---|
| SSH-1 protocol flaw | 1998-2001 | Migrar para SSH-2 (OpenSSH 7.6+ removeu SSH-1) |
| ROCA (CVE-2017-15361) | 2017 | Rotação de chaves RSA Infineon |
| Terrapin (CVE-2023-48795) | 2023 | Desativar chacha20-poly1305 afetado, aplicar patch |
| OpenSSH user enumeration | 2018+ | MaxAuthTries baixo, fail2ban |
| Weak DH groups (Logjam) | 2015 | Migrar para curve25519 |
| CBC padding oracle | 2008 | Usar CTR/GCM, desativar CBC |
10. Ferramentas e Auditoria
nmap --script ssh2-enum-algos -p 22 host # algoritmos suportados pelo servidor
ssh-audit host # auditar configuração do sshd
ssh-keygen -F host # verificar host key (fingerprint)
nc -v host 22 # capturar banner SSH (sem logar)
ssh -vvv user@host # verbose completo (até 3 níveis)
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user@host # TOFU bypass
11. Best Practices de Hardening
- Desabilitar SSH-1 (apenas Protocol 2); desabilitar autenticação por senha quando possível.
- Usar Ed25519 para chaves de host e usuário; limitar usuários com
AllowUsers/AllowGroups. - Desabilitar root direto (
PermitRootLogin prohibit-password); configurar fail2ban contra brute-force. - Usar MFA via
keyboard-interactive(Google Authenticator, OATH-TOTP). - Rotação anual de chaves de host; monitorar logs (
/var/log/auth.log,/var/log/secure). - Patching periódico — SSH é alvo frequente de CVEs críticos.
12. Conclusão
O SSH é uma das ferramentas mais críticas para administradores de sistemas e analistas de segurança. Compreender seus fundamentos — camadas do protocolo, etapas de conexão, algoritmos modernos, métodos de autenticação e mecanismos de tunneling — é essencial para operar infraestruturas seguras e identificar vetores de ataque. Em um mundo que caminha para Zero Trust, o SSH permanece como base de administração remota segura, sendo continuamente atualizado (RFC 8709 Ed25519, RFC 8731 Curve25519 KEX, RFC 8308 Extension Negotiation) para enfrentar novas ameaças como Terrapin (2023).