Um servidor web novo é varrido minutos depois de ficar online. A maior parte desse tráfego é automatizada e inofensiva se você fez o básico. Este guia vai um passo além do reforço de segurança em 15 minutos e cobre um firewall, a proteção contra força bruta com o fail2ban e uma configuração mais segura do Nginx.
Passo 1: um firewall com bloqueio por padrão usando o UFW
Permita apenas o que você precisa e bloqueie o resto. Adicione o SSH primeiro para não ficar de fora.
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
Se você usa uma porta SSH fora do padrão, permita essa porta em vez de OpenSSH.
Passo 2: fail2ban para falhas repetidas
O fail2ban vigia os logs e bane endereços IP que continuam falhando no login.
sudo apt install -y fail2ban
sudo tee /etc/fail2ban/jail.local > /dev/null <<'CONF'
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
[nginx-http-auth]
enabled = true
[nginx-botsearch]
enabled = true
CONF
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
Use chaves SSH e desative também o login por senha. Veja chaves SSH explicadas.
Passo 3: oculte a versão do Nginx e adicione cabeçalhos seguros
Em /etc/nginx/nginx.conf, dentro do bloco http:
server_tokens off;
No bloco server do seu site:
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Só adicione o cabeçalho HSTS quando o HTTPS funcionar para o seu domínio e para todos os subdomínios que você usa.
Passo 4: limite requisições abusivas
A limitação de taxa retarda tentativas de força bruta em páginas de login:
# in the http block
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
# in your server block
location = /wp-login.php {
limit_req zone=login burst=5 nodelay;
# ...your usual PHP handling
}
Teste e aplique com sudo nginx -t && sudo systemctl reload nginx.
Passo 5: mantenha tudo atualizado
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades
As atualizações automáticas de segurança fecham brechas conhecidas sem que você faça nada.
O que monitorar
- Verifique os banimentos com
sudo fail2ban-client status sshd. - Revise
/var/log/nginx/error.logde vez em quando. - Se você está atrás de um proxy ou CDN, garanta que o fail2ban leia o IP real do cliente, ou você pode banir o seu próprio proxy.