SSH seguro na VPS: configuração completa

SSH é o principal ponto de entrada em uma VPS, e o principal alvo de ataques de força bruta. Um servidor exposto na internet recebe centenas de tentativas de login por hora na porta 22. Com as configurações corretas, você elimina praticamente toda ameaça: chave pública obrigatória, root bloqueado e fail2ban cobrindo o restante.

Gerar par de chaves SSH (no seu computador)

Chaves Ed25519 são mais seguras e menores que RSA. Gere no seu computador, nunca na VPS:

bash
# Gerar chave Ed25519 (recomendada)
ssh-keygen -t ed25519 -C "deploy@minha-vps" -f ~/.ssh/id_ed25519_runstack

# Ver a chave pública (vai para a VPS)
cat ~/.ssh/id_ed25519_runstack.pub

# Copiar para a VPS
ssh-copy-id -i ~/.ssh/id_ed25519_runstack.pub deploy@IP_DA_VPS

# Ou manualmente:
cat ~/.ssh/id_ed25519_runstack.pub | ssh deploy@IP_DA_VPS \
  "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

sshd_config endurecido para produção

Configuração SSH que elimina os vetores de ataque mais comuns:

bash
# /etc/ssh/sshd_config

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
MaxAuthTries 3
MaxSessions 3
LoginGraceTime 20
AllowUsers deploy
ClientAliveInterval 600
ClientAliveCountMax 2
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
PrintMotd no

# Algoritmos seguros
KexAlgorithms curve25519-sha256,diffie-hellman-group14-sha256
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com

# Verificar sintaxe e recarregar
# sshd -t && systemctl reload sshd

SSH config local (~/.ssh/config)

Simplifique a conexão com múltiplas VPS no seu computador:

bash
# ~/.ssh/config

Host runstack-prod
    HostName 203.0.113.10
    User deploy
    IdentityFile ~/.ssh/id_ed25519_runstack
    Port 22
    ServerAliveInterval 60

Host runstack-staging
    HostName 203.0.113.20
    User deploy
    IdentityFile ~/.ssh/id_ed25519_runstack

Host *
    AddKeysToAgent yes
    IdentitiesOnly yes

# Uso:
# ssh runstack-prod
# scp arquivo runstack-prod:/opt/app/

Auditar acessos SSH

Monitore quem acessou e tentativas de login:

bash
# Últimos logins
last -n 20

# Tentativas com falha
lastb | head -20

# IPs com mais tentativas de brute force (últimas 24h)
journalctl -u ssh --since "24 hours ago" | \
  grep "Invalid user\|Failed password" | \
  grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | \
  sort | uniq -c | sort -rn | head -10

# Ver chaves autorizadas (remover as desconhecidas)
cat ~/.ssh/authorized_keys

Túnel SSH para serviços internos

Acesse serviços expostos apenas no loopback via túnel SSH seguro:

bash
# Acessar PostgreSQL na VPS sem expor a porta 5432 publicamente
ssh -L 5432:localhost:5432 deploy@IP_DA_VPS
# psql -h localhost -p 5432 -U user db

# Túnel para painel web interno (ex: Grafana na porta 3000)
ssh -L 3000:localhost:3000 deploy@IP_DA_VPS
# Abrir: http://localhost:3000

# Túnel persistente em background
ssh -fNL 3000:localhost:3000 deploy@IP_DA_VPS

# Via jump host (bastion)
ssh -J deploy@bastion.dominio.com deploy@192.168.1.10

Não quer configurar manualmente?

Implante o VPS em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

Ed25519 é a recomendação atual: menor, mais rápida e matematicamente mais segura. Use RSA-4096 apenas para compatibilidade com sistemas muito antigos (OpenSSH < 6.5, de 2014). GitHub, GitLab e todos os serviços modernos suportam Ed25519.

Edite ~/.ssh/authorized_keys na VPS e remova a linha da chave comprometida. Para múltiplos servidores: use Ansible ou script de sincronização. Após revogar, verifique os logs (last, lastb) para identificar se a chave foi usada indevidamente.

Acesse via console web do provedor (VNC/KVM), não precisa de SSH. Pelo console, adicione nova chave pública ao authorized_keys. Ou reinicie em modo rescue (boot de imagem de recuperação) para montar o disco. Por isso: guarde backup da chave privada offline.

Sim, especialmente se precisar manter PasswordAuthentication. Configure com libpam-google-authenticator: apt install libpam-google-authenticator; google-authenticator; edite /etc/pam.d/sshd e sshd_config para habilitar AuthenticationMethods publickey,keyboard-interactive.

Use chave SSH sem passphrase dedicada para o CI/CD (diferente da sua chave pessoal), com AllowUsers restrito. No GitHub Actions/GitLab CI: armazene a chave privada como secret e use ssh-agent no workflow. Nunca use a mesma chave do CI para acesso humano.