SSH: Configuração, Hardening e Diagnóstico de Anomalias para Sysadmins em 2026
Linux · Segurança · OpenSSH · Hardening · Troubleshooting | ✎ Duarte Spínola | 10 de Julho de 2026
O SSH (Secure Shell) é o protocolo fundamental para administração remota de servidores Linux, mas também é um dos vetores de ataque mais explorados em ataques de força bruta e credenciais roubadas. Este guia cobre a configuração completa do sshd_config, geração e gestão de chaves, hardening para PMEs, diagnóstico sistemático de falhas de ligação, e resolução dos problemas mais comuns que sysadmins encontram no dia-a-dia. Inclui comandos testados em Ubuntu 24.04, Debian 12, CentOS Stream 9 e Windows 11 (OpenSSH nativo), com referências à documentação oficial OpenBSD, Microsoft Learn e NIST SP 800-53.
Conteúdos
- 1. O que Está a Acontecer — SSH em 2026: Protocolo, Versões e Ameaças
- 2. Cenários em que a Configuração SSH é Crítica
- 3. Configuração Base do sshd_config — Os 12 Parâmetros Essenciais
- 4. Chaves SSH — Gerar, Distribuir, Rodar e Revogar
- 5. Hardening SSH para PME — Checklist NIST SP 800-53
- 6. Diagnóstico de Falhas de Ligação SSH — Método Sistemático
- 7. Os 10 Problemas Mais Comuns — Causa e Solução
- 8. SSH no Windows 11 e Windows Server 2025
- 9. Jump Host / Bastion e Túneis SSH para PME
- 10. Monitorização e Auditoria de Sessões SSH
- 11. FAQ para Sysadmins
- 12. Erros Comuns e Resoluções Rápidas
1. O que Está a Acontecer — SSH em 2026: Protocolo, Versões e Ameaças
O SSH (Secure Shell) é o protocolo criptográfico padrão para acesso remoto a sistemas Unix/Linux, substituindo protocolos inseguros como Telnet e rlogin. A versão actual é o SSH-2 (RFC 4251-4254), sendo o SSH-1 considerado obsoleto e inseguro desde 2017 (OpenSSH release notes). A implementação de referência é o OpenSSH, desenvolvido pelo projeto OpenBSD (openssh.com).
Em 2026, o SSH enfrenta três categorias de ameaças principais:
Ataques de força bruta — Bots automatizados tentam milhares de combinações user/password por minuto contra servidores SSH expostos. O MITRE ATT&CK cataloga este vector como T1110.004 (Brute Force: SSH) (MITRE ATT&CK). A mitigação é desativar autenticação por password e usar exclusivamente chaves SSH.
Credenciais roubadas — Atacantes que comprometem chaves privadas SSH (via malware, repositórios expostos, ou backups não encriptados) podem aceder qualquer servidor onde a chave correspondente esteja autorizada. A mitigação é usar passphrase nas chaves, rodar chaves periodicamente, e restringir por IP/source.
Vulnerabilidades do protocolo — Embora o SSH-2 seja robusto, implementações antigas do OpenSSH tiveram vulnerabilidades graves (CVE-2024-6387 “regreSSHion” permitia RCE como root em OpenSSH 8.5-9.7). A mitigação é manter o OpenSSH actualizado (OpenBSD sshd_config man page).
⚠ Atenção: Se o seu servidor SSH está exposto à Internet na porta 22 e aceita passwords, é quase certo que já está a receber tentativas de brute-force. Verifique com journalctl -u sshd --since "1 hour ago" | grep "Failed password" em Linux ou Get-EventLog -LogName Security -Source "OpenSSH" no Windows.
2. Cenários em que a Configuração SSH é Crítica
Estes são os cenários mais comuns onde uma configuração SSH correcta ou incorrecta determina se a operação corre bem ou resulta num incidente de segurança:
| Cenário | Risco | Configuração crítica |
|---|---|---|
| Servidor cloud (Hetzner, DigitalOcean, AWS) | Exposto à Internet 24/7 | PasswordAuth no, chave SSH obrigatória, fail2ban |
| Servidor on-premise com acesso via VPN | Acesso restrito à rede VPN | ListenAddress interno, AllowUsers restrito |
| Administração de fleet Linux (Ansible) | Chave partilhada em múltiplos servidores | Chave dedicada Ansible, from=IP no authorized_keys |
| Jump host / bastion para acesso a rede interna | Ponto único de falha de segurança | MFA/2FA, ProxyJump, sem AgentForwarding |
| Windows Server 2025 com OpenSSH nativo | Integração com AD/Entra ID | Match Group, chaves em ficheiro, não em AD |
| Acesso remoto a Android via Termux | Dispositivo móvel, IP dinâmico | DynamicDNS, porta não-standard, chave com passphrase |
| DevOps / CI/CD (GitHub Actions, GitLab CI) | Chave deploy sem passphrase em pipeline | Chave restrita a repositório, from=IP do runner |
| Recuperação de desastre (sem rede) | Consola série / IPMI única via SSH | Chave de emergência separada, auditada |
3. Configuração Base do sshd_config — Os 12 Parâmetros Essenciais
O ficheiro /etc/ssh/sshd_config (Linux) ou C:\ProgramData\ssh\sshd_config (Windows) controla todos os aspectos do servidor SSH. A documentação de referência é a página man do OpenBSD. Aqui estão os 12 parâmetros que todo sysadmin deve configurar:
# /etc/ssh/sshd_config — Configuração base para PME # Testado em Ubuntu 24.04, Debian 12, CentOS Stream 9 (2026-07) # 1. Apenas SSH protocolo 2 (SSH-1 é obsoleto desde 2017) Protocol 2 # 2. Porta — mudar de 22 reduz log noise de bots (não é segurança real) Port 22 # 3. Endereço de escuta — restringir a interface específica se possível # ListenAddress 0.0.0.0 # ListenAddress :: # 4. Root login — nunca permitir login directo como root PermitRootLogin no # 5. Autenticação por password — desactivar em produção PasswordAuthentication no # 6. Autenticação por chave pública — obrigatória PubkeyAuthentication yes # 7. Tentativas de autenticação antes de desconectar MaxAuthTries 3 # 8. Tempo limite de login (segundos) LoginGraceTime 30 # 9. Tentativas de chave por ligação MaxSessions 10 # 10. Encaminhamento de X11 — desactivar em servidores X11Forwarding no # 11. Agent forwarding — desactivar (risco de chave roubada) AllowAgentForwarding no # 12. TCP forwarding — restringir se servidor não deve ser túnel AllowTcpForwarding no
Após editar o sshd_config, valide a sintaxe antes de reiniciar:
# Validar configuração (não reinicia o serviço) sudo sshd -t # Se não houver erros, reiniciar sudo systemctl restart sshd # Verificar que o serviço está a correr sudo systemctl status sshd
⚠ Nunca reinicie o sshd sem uma sessão SSH alternativa aberta. Se a configuração estiver errada, perde o acesso ao servidor. Mantenha uma sessão activa e teste a nova ligação numa segunda janela antes de fechar a primeira.
Parâmetros adicionais de segurança
# Restringir utilizadores autorizados (whitelist) AllowUsers admin deploy ansible # Restringir grupos AllowGroups ssh-users admins # Mensagem de aviso legal antes do login Banner /etc/ssh/banner.txt # Tempo de inactividade antes de desconectar (segundos) ClientAliveInterval 300 ClientAliveCountMax 2 # Tipo de chaves aceites (ed25519 preferido, RSA ≥ 4096) PubkeyAcceptedAlgorithms ssh-ed25519,rsa-sha2-512,rsa-sha2-256 # Cifras aceites (apenas as mais seguras em 2026) Ciphers [email protected],[email protected],[email protected] MACs [email protected],[email protected]
4. Chaves SSH — Gerar, Distribuir, Rodar e Revogar
Gerar chaves SSH
O tipo de chave recomendado em 2026 é Ed25519 — mais rápido, mais pequeno (68 bytes vs 672 bytes do RSA-4096) e igualmente seguro. A geração usa o comando ssh-keygen (documentação OpenBSD):
# Gerar chave Ed25519 (recomendado) ssh-keygen -t ed25519 -C "[email protected] - 2026-07" # Output: # Generating public/private ed25519 key pair. # Enter file in which to save the key (~/.ssh/id_ed25519): # Enter passphrase (empty for no passphrase): ******** # Your identification has been saved in ~/.ssh/id_ed25519 # Your public key has been saved in ~/.ssh/id_ed25519.pub # The key fingerprint is: # SHA256:AbCdEf... [email protected] - 2026-07
Alternativa com RSA 4096 bits (para sistemas antigos sem suporte Ed25519):
# Gerar chave RSA 4096 (compatibilidade legacy) ssh-keygen -t rsa -b 4096 -C "[email protected] - 2026-07"
ℹ Passphrase é obrigatória em chaves de produção. Sem passphrase, quem roubar o ficheiro da chave privada tem acesso imediato a todos os servidores. A passphrase encripta a chave privada no disco — só é pedida quando se usa a chave, e o ssh-agent cache-a na sessão.
Distribuir chaves SSH
# Método 1: ssh-copy-id (mais simples) ssh-copy-id -i ~/.ssh/id_ed25519.pub user@servidor # Output: # /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "~/.ssh/id_ed25519.pub" # user@servidor's password: ******** # Number of key(s) added: 1 # Now try logging into the machine, with: "ssh user@servidor" # Método 2: Manual (quando ssh-copy-id não está disponível) cat ~/.ssh/id_ed25519.pub | ssh user@servidor "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Restringir chave por IP de origem
No ficheiro authorized_keys no servidor, pode-se restringir de que IP a chave pode ser usada:
# ~/.ssh/authorized_keys no servidor # Restringir a IP fixo da empresa from="192.168.1.100" ssh-ed25519 AAAA... [email protected] # Restringir a range de IPs from="10.0.0.0/24,192.168.1.0/24" ssh-ed25519 AAAA... [email protected] # Chave apenas para Ansible — sem shell interactiva from="10.0.0.50",command="/usr/local/bin/ansible-runner.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-ed25519 AAAA... [email protected]
Verificar chaves existentes
# Listar chaves no servidor cat ~/.ssh/authorized_keys # Verificar fingerprint de uma chave ssh-keygen -lf ~/.ssh/id_ed25519.pub # 256 SHA256:AbCdEf... [email protected] - 2026-07 (ED25519) # Verificar todas as chaves de um utilizador for key in ~/.ssh/*.pub; do ssh-keygen -lf "$key"; done
Rodar e revogar chaves
A rotação periódica de chaves é uma boa prática. O processo é: gerar nova chave, distribuir, testar, remover chave antiga:
# 1. Gerar nova chave ssh-keygen -t ed25519 -C "[email protected] - 2026-12" # 2. Distribuir ssh-copy-id -i ~/.ssh/id_ed25519.pub user@servidor # 3. Testar nova chave ssh -i ~/.ssh/id_ed25519 user@servidor "echo OK" # 4. Remover chave antiga do servidor ssh user@servidor "sed -i '/[email protected] - 2026-07/d' ~/.ssh/authorized_keys" # 5. Confirmar que a chave antiga já não funciona ssh -i ~/.ssh/id_ed25519_old user@servidor # Expected: Permission denied (publickey)
5. Hardening SSH para PME — Checklist NIST SP 800-53
O NIST SP 800-53 (Security and Privacy Controls for Information Systems) inclui controlos específicos para acesso remoto. A tabela abaixo mapeia os controlos NIST relevantes a configurações SSH concretas (NIST SP 800-53 Rev 5):
| Controlo NIST | Descrição | Configuração SSH |
|---|---|---|
| AC-2(2) | Gestão de contas privilegiadas | PermitRootLogin no, sudo para escalamento |
| AC-17(1) | Acesso remoto com proteção criptográfica | Protocol 2, cifras modernas, Ed25519 |
| AC-17(2) | Controlo de rotas de acesso remoto | AllowUsers, AllowGroups, from= no authorized_keys |
| AU-2 | Auditoria de eventos | LogLevel VERBOSE, journalctl, /var/log/auth.log |
| AU-12 | Geração de registos de auditoria | ForceCommand para log de sessões, session recording |
| IA-5(1) | Autenticação baseada em chaves | PasswordAuthentication no, PubkeyAuthentication yes |
| IA-5(6) | Protecção contra replay attacks | ClientAliveInterval, MaxAuthTries |
| SC-8 | Confidencialidade em trânsito | Cifras AEAD (chacha20-poly1305, aes-gcm) |
| SC-13 | Uso de criptografia aprovada | Ed25519, RSA-SHA2, cifras NIST-approved |
| MA-4 | Manutenção remota | Jump host dedicado, ProxyJump, logs de sessão |
Script de hardening automático
#!/bin/bash
# hardening-ssh.sh — Hardening SSH para PME
# Testado em Ubuntu 24.04, Debian 12, CentOS Stream 9 (2026-07)
set -euo pipefail
SSHD_CONFIG="/etc/ssh/sshd_config"
BACKUP="${SSHD_CONFIG}.backup.$(date +%Y%m%d)"
# Backup
cp "$SSHD_CONFIG" "$BACKUP"
echo "Backup criado: $BACKUP"
# Aplicar configurações de hardening
sed -i 's/^#*Protocol .*/Protocol 2/' "$SSHD_CONFIG"
sed -i 's/^#*PermitRootLogin .*/PermitRootLogin no/' "$SSHD_CONFIG"
sed -i 's/^#*PasswordAuthentication .*/PasswordAuthentication no/' "$SSHD_CONFIG"
sed -i 's/^#*PubkeyAuthentication .*/PubkeyAuthentication yes/' "$SSHD_CONFIG"
sed -i 's/^#*MaxAuthTries .*/MaxAuthTries 3/' "$SSHD_CONFIG"
sed -i 's/^#*LoginGraceTime .*/LoginGraceTime 30/' "$SSHD_CONFIG"
sed -i 's/^#*X11Forwarding .*/X11Forwarding no/' "$SSHD_CONFIG"
sed -i 's/^#*AllowAgentForwarding .*/AllowAgentForwarding no/' "$SSHD_CONFIG"
# Adicionar configurações que não existem
grep -q "^ClientAliveInterval" "$SSHD_CONFIG" || echo "ClientAliveInterval 300" >> "$SSHD_CONFIG"
grep -q "^ClientAliveCountMax" "$SSHD_CONFIG" || echo "ClientAliveCountMax 2" >> "$SSHD_CONFIG"
# Validar
sshd -t && echo "Configuração válida" || { echo "ERRO: configuração inválida"; exit 1; }
echo "Hardening aplicado. Reinicie com: sudo systemctl restart sshd"
echo "MAS TESTE PRIMEIRO numa sessão alternativa!"
6. Diagnóstico de Falhas de Ligação SSH — Método Sistemático
Quando uma ligação SSH falha, o erro pode estar em qualquer ponto da cadeia: rede, DNS, firewall, configuração do servidor, chaves, permissões de ficheiros, ou cliente. O método correcto é diagnosticar camada a camada, da mais básica para a mais complexa.
Passo 1 — Verificar conectividade de rede
# 1. Conectividade IP (camada 3) ping -c 3 192.168.1.100 # 2. Porta SSH aberta (camada 4) nc -zv 192.168.1.100 22 # ou telnet 192.168.1.100 22 # Output esperado: Connected to 192.168.1.100. # Se timeout: firewall a bloquear ou sshd não está a correr # 3. Resolver DNS (se usar hostname) dig +short servidor.kbase.pt nslookup servidor.kbase.pt
Passo 2 — Modo verbose do cliente SSH
# Modo verbose (3 níveis: -v, -vv, -vvv) ssh -vvv user@servidor # Output típico (resumido): # debug1: Connecting to servidor [192.168.1.100] port 22. # debug1: Connection established. # debug1: Local version string: OpenSSH_9.6p1 Ubuntu-3ubuntu13 # debug1: Remote protocol version 2.0, remote software version OpenSSH_9.6p1 # debug1: SSH2_MSG_KEXINIT sent # debug1: SSH2_MSG_KEXINIT received # debug1: Offering public key: id_ed25519 ED25519 SHA256:... # debug1: Server accepts key: id_ed25519 ED25519 # debug1: Authentication succeeded (publickey).
O modo verbose mostra exactamente em que fase a ligação falha. As fases são:
- Connection established — rede OK
- KEXINIT — negociação de cifra OK
- Offering public key — a tentar a chave
- Server accepts/rejects key — resultado da autenticação
- Authentication succeeded — ligação completa
Passo 3 — Verificar logs do servidor
# Ubuntu/Debian — auth.log sudo tail -f /var/log/auth.log | grep sshd # CentOS/RHEL/Stream — journalctl sudo journalctl -u sshd -f # Ver falhas de autenticação na última hora sudo journalctl -u sshd --since "1 hour ago" | grep -i "fail\|denied\|invalid" # Windows Server 2025 Get-WinEvent -LogName "Microsoft-Windows-OpenSSH/Operational" -MaxEvents 20
Passo 4 — Verificar permissões de ficheiros
SSH é extremamente rigoroso com permissões. Se as permissões não estiverem correctas, a autenticação por chave falha silenciosamente:
# Permissões correctas (OBRIGATÓRIAS): # ~/.ssh/ → 700 (drwx------) # ~/.ssh/authorized_keys → 600 (-rw-------) # ~/.ssh/id_ed25519 → 600 (-rw-------) # ~/.ssh/id_ed25519.pub → 644 (-rw-r--r--) # Corrigir permissões chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chmod 600 ~/.ssh/id_ed25519 chmod 644 ~/.ssh/id_ed25519.pub # Verificar ownership (deve ser o próprio utilizador) ls -la ~/.ssh/ # chown user:user ~/.ssh/authorized_keys
ℹ Permissões incorrectas são a causa #1 de “Permission denied (publickey)”. O SSH ignora silenciosamente chaves em directórios com permissões demasiado permissivas. Se a home directory tiver permissões 777, o SSH recusa todas as chaves.
Passo 5 — Verificar configuração do servidor
# Validar sintaxe do sshd_config sudo sshd -t # Ver configuração efectiva (com valores por omissão) sudo sshd -T | grep -E "permitroot|passwordauth|pubkey|maxauth" # Verificar que o sshd está a correr sudo systemctl status sshd sudo systemctl is-active sshd # Verificar porta de escuta sudo ss -tlnp | grep ssh # ou sudo netstat -tlnp | grep ssh
7. Os 10 Problemas Mais Comuns — Causa e Solução
| Problema | Causa | Solução |
|---|---|---|
| Permission denied (publickey) | Permissões erradas em ~/.ssh ou authorized_keys | chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys |
| Connection timed out | Firewall a bloquear porta 22 ou sshd parado | sudo ufw allow 22 ou sudo systemctl start sshd |
| Connection refused | sshd não está a correr ou porta errada | sudo systemctl start sshd && sudo ss -tlnp | grep ssh |
| Host key verification failed | Chave do servidor mudou (reinstall, clone, IP reutilizado) | ssh-keygen -R servidor para remover known_hosts |
| Too many authentication failures | Cliente a tentar muitas chaves automáticas | ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519 user@host |
| No route to host | Roteamento de rede incorrecto ou host down | Verificar com ping, traceroute, rota de gateway |
| Remote port forwarding failed | Porta local já em uso ou GatewayPorts no | sudo lsof -i :porta e GatewayPorts yes no sshd_config |
| key_load_public: Permission denied | Permissões erradas na chave privada | chmod 600 ~/.ssh/id_ed25519 |
| WARNING: UNPROTECTED PRIVATE KEY FILE | Chave privada com permissões demasiado abertas (644) | chmod 600 ~/.ssh/id_ed25519 |
| fatal: no matching MAC found | Cliente e servidor não partilham nenhum algoritmo MAC | Actualizar OpenSSH em ambos os lados ou adicionar MACs compatíveis |
8. SSH no Windows 11 e Windows Server 2025
O Windows inclui OpenSSH nativamente desde o Windows 10 1809. No Windows Server 2025 e Windows 11 24H2, o OpenSSH vem pré-instalado mas precisa de ser activado (Microsoft Learn — OpenSSH installation, Microsoft Learn — OpenSSH configuration).
Instalar e activar OpenSSH no Windows
# Instalar via PowerShell (admin) Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0 # Iniciar serviço Start-Service sshd # Configurar arranque automático Set-Service -Name sshd -StartupType Automatic # Firewall — abrir porta 22 New-NetFirewallRule -Name sshd -DisplayName "OpenSSH Server (sshd)" ` -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
Configuração sshd_config no Windows
# C:\ProgramData\ssh\sshd_config # Nota: ProgramData é pasta oculta PubkeyAuthentication yes PasswordAuthentication no PermitRootLogin no # Para utilizadores do domínio (AD): # As chaves vão em C:\ProgramData\ssh\administrators_authorized_keys # (não em ~/.ssh/authorized_keys como no Linux) # Para utilizadores comuns: # As chaves vão em C:\Users\\.ssh\authorized_keys # Match Group — restringir por grupo AD Match Group Administradores AuthorizedKeysFile C:\ProgramData\ssh\administrators_authorized_keys
ℹ No Windows, administradores (incluindo Domain Admins) usam o ficheiro C:\ProgramData\ssh\administrators_authorized_keys — não ~/.ssh/authorized_keys. Isto confunde muitos sysadmins Linux. As permissões correctas são atribuídas com icacls "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "SYSTEM:(F)" /grant "BUILTIN\Administradores:(F)".
Gerar chaves SSH no Windows
# PowerShell ssh-keygen -t ed25519 -C "[email protected] - 2026-07" # As chaves ficam em: # C:\Users\\.ssh\id_ed25519 (privada) # C:\Users\ \.ssh\id_ed25519.pub (pública)
PowerShell remoting via SSH
O PowerShell 7 suporta remoting via SSH nativamente, sem necessidade de WinRM (Microsoft Learn — SSH remoting in PowerShell):
# Entrar numa sessão remota via SSH
Enter-PSSession -HostName servidor -UserName admin
# Executar comando remoto
Invoke-Command -HostName servidor -UserName admin -ScriptBlock {
Get-Service | Where-Object Status -eq "Running"
}
9. Jump Host / Bastion e Túneis SSH para PME
ProxyJump — A via jump host sem expor servidores internos
O ProxyJump (introduzido no OpenSSH 7.3, 2016) permite ligar a um servidor interno através de um bastion, sem necessidade de túneis manuais. É a forma recomendada de aceder a servidores numa rede privada (OpenBSD ssh_config man page):
# ~/.ssh/config no cliente
# Bastion (jump host)
Host bastion
HostName bastion.kbase.pt
User admin
IdentityFile ~/.ssh/id_ed25519
# Servidor interno via bastion
Host servidor-interno
HostName 192.168.1.50
User admin
ProxyJump bastion
IdentityFile ~/.ssh/id_ed25519
# Agora basta:
ssh servidor-interno
# O SSH liga primeiro ao bastion, depois salta para 192.168.1.50
Túnel SSH — Port forwarding
# Forward local — aceder serviço remoto localmente # Aceder web interface remota em http://localhost:8080 ssh -L 8080:localhost:8080 user@servidor # Forward remoto — expor serviço local ao servidor remoto # Útil para acessos reversos através de CGNAT ssh -R 9090:localhost:22 user@servidor-cloud # Dynamic (SOCKS proxy) — túnel dinâmico ssh -D 1080 user@servidor # Configurar proxy SOCKS5 127.0.0.1:1080 no browser
Configuração ~/.ssh/config recomendada para PME
# ~/.ssh/config — Configuração base para PME
# Global
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
TCPKeepAlive yes
IdentitiesOnly yes
HashKnownHosts yes
AddKeysToAgent yes
# Servidores cloud
Host hetzner-prod
HostName 188.245.x.x
User admin
IdentityFile ~/.ssh/kbase_ed25519
Port 22
Host hetzner-staging
HostName 188.245.x.y
User admin
IdentityFile ~/.ssh/kbase_ed25519
# Servidor interno via bastion
Host db-interno
HostName 10.0.0.5
User postgres
ProxyJump hetzner-prod
IdentityFile ~/.ssh/kbase_ed25519
# Windows Server via SSH
Host win-ad
HostName 192.168.1.10
User Administrator
IdentityFile ~/.ssh/kbase_ed25519
10. Monitorização e Auditoria de Sessões SSH
LogLevel VERBOSE para auditoria
# sshd_config — registar fingerprints de chaves usadas LogLevel VERBOSE # Após reiniciar sshd, os logs mostram: # Jul 10 14:23:01 servidor sshd[1234]: Connection from 192.168.1.100 port 54321 # Jul 10 14:23:01 servidor sshd[1234]: Accepted publickey for admin from 192.168.1.100 # Jul 10 14:23:01 servidor sshd[1234]: paml_unix(sshd:session): session opened for user admin # Jul 10 14:23:01 servidor sshd[1234]: User child is on pid 1235
Fail2ban — Bloquear ataques de força bruta
# Instalar sudo apt install fail2ban # Configuração: /etc/fail2ban/jail.local [sshd] enabled = true port = 22 maxretry = 3 bantime = 3600 findtime = 600 # Reiniciar sudo systemctl restart fail2ban # Verificar status sudo fail2ban-client status sshd # Status for the jail: sshhd # |- Filter # | |- Currently failed: 0 # | |- Total failed: 47 # |- Actions # | |- Currently banned: 2 # | |- Total banned: 15
Auditoria de sessões com session recording
# Para auditoria completa (NIST AU-12), gravar todas as sessões:
# /etc/ssh/sshd_config
ForceCommand /usr/local/bin/session-log.sh
# /usr/local/bin/session-log.sh
#!/bin/bash
LOGDIR="/var/log/ssh-sessions"
mkdir -p "$LOGDIR"
LOGFILE="$LOGDIR/${USER}_$(date +%Y%m%d_%H%M%S)_$$.log"
exec script -q -f "$LOGFILE" -c "$SHELL"
# chmod +x /usr/local/bin/session-log.sh
# Cada sessão SSH fica gravada em /var/log/ssh-sessions/
11. FAQ para Sysadmins
1. Devo mudar a porta SSH de 22 para outra?
Mudar a porta reduz o ruído nos logs (bots scaneiam a 22 por defeito), mas não é uma medida de segurança real — um atacante determinado encontra a porta. Use como camada adicional, não como substituto de hardening real (chaves, fail2ban, firewall).
2. Ed25519 ou RSA?
Ed25519 em 2026. É mais rápido, mais pequeno, e igualmente seguro. RSA 4096 só se precisar de compatibilidade com sistemas antigos (OpenSSH < 6.5, 2014). Nunca use RSA 2048 ou menor — é considerada insegura (OpenBSD ssh-keygen man page).
3. Quanto tempo deve durar uma chave SSH?
Não há um standard oficial, mas a prática recomendada é rodar chaves administrativas a cada 12-18 meses. Chaves de deploy/CI podem durar mais se forem restritas por IP e repositório. O mais importante é ter um processo de revogação rápido — se uma chave é comprometida, deve poder ser removida de todos os servidores em minutos.
4. Posso usar a mesma chave em todos os servidores?
Sim para ambientes pequenos (1-10 servidores). Para fleets maiores, use chaves diferentes por função (admin, deploy, ansible, backup) para que possa revogar uma sem afectar as outras. A chave Ansible, por exemplo, deve ter from= restrito ao IP do controlador e command= restrito ao runner.
5. SSH agent forwarding é seguro?
Não totalmente. O agent forwarding permite que o servidor remoto use as suas chaves locais para saltar para outros servidores. Se o servidor remoto estiver comprometido, o atacante pode usar as suas chaves. Use ProxyJump em vez de agent forwarding sempre que possível.
6. Como diagnosticar “Permission denied (publickey)” quando tudo parece correcto?
Verifique nesta ordem: (1) permissões ~/.ssh (700), authorized_keys (600); (2) ownership dos ficheiros (chown user:user); (3) sshd_config tem PubkeyAuthentication yes; (4) ssh -vvv mostra “Server accepts key”; (5) logs do servidor mostram motivo da rejeição; (6) SELinux/AppArmor não está a bloquear.
7. Como aceder a um servidor quando o SSH está completamente partido?
Em cloud: consola serie do provider (Hetzner Cloud Console, AWS Systems Manager, Azure Serial Console). On-premise: IPMI/iLO/DRAC com consola virtual. Se nenhuma disponível: boot com live USB e montar o disco para corrigir sshd_config.
8. Devo desactivar PasswordAuthentication completamente?
Sim em produção. Mantenha activo apenas em fase de instalação inicial (para distribuir a primeira chave). Depois da chave instalada e testada, desactive. Exceção: servidores de emergência onde possa perder acesso à chave — nestes casos, use password + MFA (via PAM).
12. Erros Comuns e Resoluções Rápidas
| Erro | Causa provável | Comando de resolução |
|---|---|---|
| ssh: connect to host X port 22: Connection refused | sshd parado | sudo systemctl start sshd |
| ssh: connect to host X port 22: Connection timed out | Firewall ou host down | nc -zv host 22 + ping host |
| Permission denied (publickey) | Permissões, chave errada, ou user errado | chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys |
| Host key verification failed | Chave do servidor mudou | ssh-keygen -R host |
| WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED | Possível MITM ou reinstall | Verificar com admin, depois ssh-keygen -R host |
| bad permissions | ~/.ssh demasiado permissivo | chmod 700 ~/.ssh |
| no matching key exchange found | Cliente/servidor incompatíveis | Actualizar OpenSSH ou adicionar KexAlgorithms compatíveis |
| systemctl status sshd: failed | Erro de sintaxe no sshd_config | sshd -t para ver o erro exacto |
| Authenticated with partial success | MFA requerido (PAM + segundo factor) | Configurar segundo factor (TOTP, FIDO2) |
| channel 2: open failed: administratively prohibited | AllowTcpForwarding no no servidor | Activar AllowTcpForwarding yes no sshd_config |
Artigos Relacionados
- Instalar e Utilizar o OpenSSH no Windows 10
- Copiar Ficheiros entre Windows e Servidor Linux via SSH (SCP)
- Acesso Remoto ao Android via SSH e scrcpy
- Criptografia Pós-Quântica: Migrar para Algoritmos Quantum-Safe
- Diagnóstico de Conectividade Linux Avançado: curl, TLS, nftables, WireGuard
- CGNAT na MEO: Verificar e Contornar para Acesso Remoto
- Ansible: Automação de Configuração para PMEs
- WSL2 em 2026: Configurar para Sysadmins e Developers
- Passkeys (Chaves de Acesso): Substituir Passwords com FIDO2
- Migrar de PowerShell 5.1 para PowerShell 7
