03 - Processo de Autenticação
video: https://youtu.be/... no frontmatter da nota.Processo de Autenticação
O Processo de Autenticação no SSH é a fase crítica que ocorre imediatamente após o estabelecimento do túnel cifrado (Camada de Transporte). O objetivo técnico desta etapa é provar ao servidor que o cliente possui o direito de acessar a conta solicitada. No SSH-2 (especificado pela RFC 4252), a autenticação é flexível e multi-método, permitindo que uma única sessão exija múltiplas provas de identidade antes de liberar o acesso ao shell.
1. Pré-requisitos: O Túnel Seguro
Antes de qualquer dado de autenticação (como uma senha) ser enviado, o cliente e o servidor já completaram a troca de chaves Diffie-Hellman.
- Confidencialidade: Todas as mensagens de autenticação são enviadas dentro do túnel cifrado simetricamente (AES-256-GCM, ChaCha20-Poly1305).
- Identidade do Servidor: O cliente já validou a Host Key do servidor. O processo de autenticação de usuário só começa se o cliente confiar que o servidor não é um impostor (Trust On First Use — TOFU — ou via
known_hostspré-populado). - Forward Secrecy: Como o KEX DH efêmero descarta as chaves privadas temporárias após o NEWKEYS, a captura posterior do tráfego cifrado não compromete senhas transmitidas nesta sessão.
Sequência de Estados até Autenticação
1. TCP connect (porta 22)
2. Version exchange (SSH-2.0-OpenSSH_9.6p1)
3. SSH_MSG_KEXINIT (algoritmos)
4. SSH_MSG_KEXDH_INIT/REPLY (Diffie-Hellman)
5. SSH_MSG_NEWKEYS (início da cifragem simétrica)
6. SSH_MSG_SERVICE_REQUEST "ssh-userauth" <-- INÍCIO da autenticação
7. SSH_MSG_USERAUTH_REQUEST (método)
8. SSH_MSG_USERAUTH_SUCCESS / FAILURE <-- FIM da autenticação
2. O Protocolo de Autenticação (ssh-userauth)
O processo segue um modelo de requisição e resposta estruturado:
- Requisição de Serviço: O cliente envia uma mensagem
SSH_MSG_SERVICE_REQUESTpara o serviçossh-userauth(RFC 4254 §4). - Lista de Métodos: O servidor responde com
SSH_MSG_SERVICE_ACCEPTe, na primeira tentativa de autenticação, devolveSSH_MSG_USERAUTH_FAILUREcom a lista de métodos aceitos (ex:publickey,password,keyboard-interactive). - Tentativa de Autenticação: O cliente escolhe um método e envia uma mensagem
SSH_MSG_USERAUTH_REQUESTespecificandomethod name, parâmetros específicos do método e o nome de usuário alvo.
Anatomia da Mensagem USERAUTH_REQUEST
byte SSH_MSG_USERAUTH_REQUEST (50)
string user name (ex: "admin")
string service name ("ssh-connection")
string method name ("publickey"|"password"|"keyboard-interactive")
... method-specific fields
3. Métodos Comuns de Autenticação
A. Senha (Password — RFC 4252 §8)
O método mais simples, onde o cliente envia a senha em texto claro dentro do túnel cifrado. O servidor valida a senha contra o banco de dados local (ex: /etc/shadow via PAM).
- Risco: Vulnerável a ataques de força bruta se o servidor estiver exposto à internet sem proteções como Fail2Ban ou rate limiting.
- Diretiva sshd_config:
PasswordAuthentication yes|no.
B. Chave Pública (Public Key — RFC 4252 §7)
O método mais seguro. O cliente prova a posse de uma chave privada sem nunca enviá-la.
- O cliente envia a chave pública e o algoritmo (
ssh-ed25519,rsa-sha2-256,ecdsa-sha2-nistp256). - O servidor verifica se a chave pública está em
~/.ssh/authorized_keys. - Se estiver, o servidor envia um "nonce" (número aleatório) como desafio.
- O cliente assina o nonce com sua chave privada e devolve a assinatura.
- O servidor verifica a assinatura com a chave pública — se válida, autenticação confirmada.
- Diretiva sshd_config:
PubkeyAuthentication yes. - Vantagem: Imune a brute force (2256 combinações Ed25519); nada além da assinatura transita pela rede.
C. Interativo por Teclado (Keyboard-Interactive — RFC 4256)
Um método genérico onde o servidor envia prompts de texto ao usuário via SSH_MSG_USERAUTH_INFO_REQUEST. É comumente utilizado para implementar a Autenticação de Dois Fatores (2FA/MFA), como códigos do Google Authenticator ou tokens SMS.
- Diretiva sshd_config:
KbdInteractiveAuthentication yes(renomeado deChallengeResponseAuthenticationem OpenSSH 8.2+). - Cenário Típico: Senha → OTP TOTP → biometria (3 fatores sequenciais).
Comparativo dos Métodos
| Método | RFC | Força | Latência | Phishing-Resistant |
|---|---|---|---|---|
password |
4252 §8 | Baixa | Baixa | Não |
publickey |
4252 §7 | Alta | Média | Sim (FIDO2 Ed25519-sk) |
keyboard-interactive |
4256 | Variável | Alta | Depende do 2º fator |
hostbased |
4252 §9 | Alta | Baixa | Sim, mas raramente usado |
gssapi-with-mic |
4462 | Alta (Kerberos) | Média | Sim |
4. Ordem e Persistência
O servidor SSH pode ser configurado para exigir uma ordem específica ou múltiplos métodos em cascata (RFC 4252 §5.1):
- MFA Obrigatório: O servidor pode ser configurado para aceitar a
publickey, mas ainda assim exigir okeyboard-interactivelogo em seguida. Diretiva:AuthenticationMethods publickey,keyboard-interactive. - Tentativas Limitadas: O parâmetro
MaxAuthTriesno arquivosshd_configdefine quantas vezes o cliente pode falhar antes que o servidor encerre a conexão TCP por segurança. Padrão: 6. - Métodos Opcionais (
noneprobe): Alguns clientes enviam primeiro uma requisição com método"none"apenas para descobrir quais métodos o servidor aceita — probe de capacidades.
Exemplo de Configuração Multi-fator
# /etc/ssh/sshd_config — exigir chave + OTP
PubkeyAuthentication yes
KbdInteractiveAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
# /etc/pam.d/sshd — adicionar TOTP após autenticação de chave
auth required pam_google_authenticator.so
5. Finalização do Processo
- Sucesso: O servidor envia uma mensagem
SSH_MSG_USERAUTH_SUCCESS. O cliente então solicita a abertura de um canal de sessão (SSH_MSG_CHANNEL_OPEN "session", RFC 4254) e o shell interativo começa. - Falha: O servidor envia
SSH_MSG_USERAUTH_FAILURE. Ele pode listar quais métodos ainda restam para o cliente tentar. Se o cliente esgotar as tentativas (MaxAuthTriesatingido), ocorre o "Permission denied (publickey,password)" e a conexão TCP é encerrada. - Disconnect por Falhas: Após
MaxAuthTries, o servidor enviaSSH_MSG_DISCONNECTcom reason codeSSH_DISCONNECT_BY_APPLICATIONe fecha o socket TCP.
Tabela de Reason Codes Comuns (RFC 4250 §4.2.2)
| Código | Constante | Cenário |
|---|---|---|
| 1 | SSH_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT |
Cliente banido (hosts.deny) |
| 2 | SSH_DISCONNECT_PROTOCOL_ERROR |
Mensagem malformada |
| 11 | SSH_DISCONNECT_BY_APPLICATION |
Falha de MaxAuthTries ou shutdown |
| 14 | SSH_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE |
Nenhum método restante |
6. Segurança: O Papel do PAM (Pluggable Authentication Modules)
No Linux, o processo de autenticação do SSH frequentemente delega a decisão final para o PAM. Isso permite que o SSH se integre a diretórios centrais como LDAP (via pam_ldap), Active Directory (via sssd/pbis), Kerberos 5 (via pam_krb5) ou utilize módulos complexos de conformidade de senha (pam_cracklib, pam_pwquality) sem precisar alterar o código-fonte do servidor SSH.
Auditoria do Processo de Autenticação
# Log em tempo real de tentativas
sudo journalctl -u ssh -f
# Filtrar apenas autenticações bem-sucedidas
sudo grep 'Accepted' /var/log/auth.log
# Contar tentativas falhas por IP (últimas 24h)
sudo journalctl -u ssh --since "24h ago" | \
grep -E 'Failed password|Invalid user' | \
awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -10
# Verificar sessões atualmente ativas
who
ss -tnp | grep ':22' | grep ESTAB
# Rastrear comandos executados por usuário em sessão SSH (via auditd)
sudo auditctl -a always,exit -F arch=b64 -F euid=0 -S execve -k ssh_cmd
sudo ausearch -k ssh_cmd --start today
7. Resumo Técnico
| Atributo | Valor |
|---|---|
| RFC | 4252 (SSH Authentication Protocol) |
| Porta padrão | TCP 22 |
| Serviço pós-NEWKEYS | ssh-userauth |
| Mensagem requisição | SSH_MSG_USERAUTH_REQUEST (50) |
| Mensagem sucesso | SSH_MSG_USERAUTH_SUCCESS (52) |
| Mensagem falha | SSH_MSG_USERAUTH_FAILURE (51) |
Default MaxAuthTries |
6 |
| Integração Linux | PAM (/etc/pam.d/sshd) |
| Compatibilidade MFA | AuthenticationMethods (cascata) |
8. Conclusão
O processo de autenticação SSH é a fronteira final entre o acesso legítimo e a invasão. Sua arquitetura multi-método — combinável em cascata via AuthenticationMethods — permite implementar políticas que vão desde o simples "chave pública OU senha" até "chave pública E TOTP E biometria", atendendo requisitos de compliance como PCI-DSS 4.0 (Requirement 8.4) e ISO 27001:2022 (A.5.17). A integração com PAM desacopla a decisão de autenticação do código do sshd, permitindo que organizações consolidem identidade via LDAP/AD/Kerberos sem recompilar o daemon. A maturidade de um ambiente SSH mede-se pelo rigor em logs, monitoramento (Fail2Ban/CrowdSec + SIEM) e adoção progressiva de FIDO2 (ed25519-sk) como substituto definitivo de senhas.