Como proteger uma VPS Ubuntu: o básico que evita 99% dos ataques
Um servidor novo começa a receber tentativas de login em questão de minutos. Não é nada pessoal: são robôs varrendo faixas de IP inteiras testando root com senhas comuns.
As quatro medidas deste guia resolvem a esmagadora maioria dos casos. Nenhuma delas é complicada, e todas levam menos de vinte minutos somadas.
Antes de começar
- VPS com Ubuntu 22.04 ou 24.04 e acesso root.
- Um par de chaves SSH na sua máquina. Se não tiver, gere com
ssh-keygen -t ed25519.
Crie um usuário comum
Entrar como root todo dia é pedir para um erro de digitação virar um problema sério. Trabalhe com um usuário normal e use sudo quando precisar.
adduser --gecos '' deploy
usermod -aG sudo deploy
rsync --archive --chown=deploy:deploy ~/.ssh /home/deploy/
Troque a senha pela chave SSH
Senha pode ser adivinhada; chave, não. Copie a sua chave pública para o servidor e teste antes de desativar a senha.
# na SUA máquina, não no servidor
ssh-copy-id deploy@IP-DA-SUA-VPS
# teste: deve entrar sem pedir senha
ssh deploy@IP-DA-SUA-VPS
Só siga para o próximo passo depois que o login por chave funcionar. Desativar a senha sem ter a chave no lugar deixa você trancado do lado de fora.
Endureça o SSH
Com a chave funcionando, recuse senha e bloqueie login direto de root.
cat > /etc/ssh/sshd_config.d/99-seguranca.conf <<'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
EOF
sshd -t && systemctl restart ssh
# confirme que a configuração está valendo
sshd -T | grep -E 'permitrootlogin|passwordauthentication'
Mantenha a sessão atual aberta e teste o acesso numa segunda janela. Se algo saiu errado, você ainda tem a primeira para corrigir.
Feche o firewall
Regra simples: bloqueia tudo, libera o que você usa.
ufw default deny incoming
ufw default allow outgoing
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enable
ufw status verbose
Instale o fail2ban
O fail2ban lê os logs e bane o IP que erra a autenticação várias vezes. Mesmo com senha desativada, ele corta o ruído das varreduras.
apt install -y fail2ban
cat > /etc/fail2ban/jail.local <<'EOF'
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
backend = systemd
[sshd]
enabled = true
EOF
systemctl enable --now fail2ban
fail2ban-client status sshd
Se o status reclamar que não encontra o log, troque backend = systemd por logpath = /var/log/auth.log — depende de como a distribuição registra o SSH.
Ligue as atualizações automáticas
A maior parte das invasões explora falha conhecida e já corrigida. Deixe o sistema aplicar as correções de segurança sozinho.
apt install -y unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades
# confirme que está ativo
systemctl status unattended-upgrades --no-pager | head -5
cat /var/log/unattended-upgrades/unattended-upgrades.log | tail -5
Confira o resultado
Um teste rápido para ver se o que você configurou está de fato valendo.
# senha deve ser recusada
sshd -T | grep passwordauthentication
# portas abertas para o mundo
ss -tulpn | grep LISTEN
# banimentos até agora
fail2ban-client status sshd
No ss, o que aparece com 0.0.0.0 ou [::] está exposto. Banco de dados nessa lista é problema: bancos devem escutar só em 127.0.0.1 ou na rede interna do Docker.
Se algo não funcionar
Fiquei trancado fora do servidor
Use o console do painel da VPS, que acessa a máquina por fora do SSH. Por lá, corrija o arquivo em /etc/ssh/sshd_config.d/ e reinicie o serviço.
Baniram o meu próprio IP
Pelo console, remova o banimento e adicione o seu endereço à lista de ignorados:
fail2ban-client set sshd unbanip SEU.IP.AQUI
# para não repetir, acrescente em /etc/fail2ban/jail.local:
# ignoreip = 127.0.0.1/8 SEU.IP.AQUI
Se algo der errado no SSH, o console do painel entra por fora e você resolve sem abrir ticket.
Perguntas frequentes
Mudar a porta do SSH ajuda?
Reduz o ruído nos logs, porque a maioria das varreduras só testa a 22. Não é segurança de verdade: quem faz um scan de portas acha a nova em segundos. Vale como conveniência, nunca como substituto da chave e do fail2ban.
Preciso de fail2ban se já desativei a senha?
Ele deixa de ser essencial para o SSH, mas continua útil: corta o volume de tentativas que enche o log e pode proteger outros serviços, como o painel de uma aplicação web.
O firewall do Ubuntu protege os contêineres Docker?
Nem sempre. O Docker escreve as próprias regras no iptables e, ao publicar uma porta, pode contornar o UFW. Por isso, nos guias deste site os bancos nunca publicam porta — conversam pela rede interna do Compose, e só o proxy fica exposto.
Continue por aqui
Como instalar o Docker em uma VPS Ubuntu
Base para qualquer serviço auto-hospedado: Docker, Compose, usuário sem root e limpeza automática de imagens.
Como instalar o n8n em uma VPS com Docker e HTTPS
Sobe o n8n com banco PostgreSQL e certificado automático, em uma VPS Ubuntu com acesso root.
Como instalar o Uptime Kuma para monitorar seus sites
Monitor de disponibilidade com alerta no WhatsApp, Telegram ou e-mail, e página de status pública.