OffshoreVps
Segurança27 set. 20266 min de leituraPor a equipe da OffshoreVps

Reforce a segurança de um servidor web: UFW, fail2ban e configurações do Nginx

Um firewall com bloqueio por padrão, jails do fail2ban, cabeçalhos mais seguros no Nginx, limitação de taxa e atualizações automáticas para um VPS que hospeda um site.

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.

Janela de terminal em um VPS mostrando os comandos usados para reforçar a segurança de um servidor web com UFW, fail2ban e Nginx, começando com “sudo ufw default deny incoming”
O tipo de comandos que você executará no servidor neste guia.

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.

Os passos deste guia em ordem: 1. um firewall com bloqueio por padrão usando o UFW; 2. fail2ban para falhas repetidas; 3. oculte a versão do Nginx e adicione cabeçalhos seguros; 4. limite requisições abusivas; 5. mantenha tudo atualizado; 6. O que monitorar
Os passos deste guia, em ordem.

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.log de 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.