OffshoreVps
Sicurezza27 set 20266 min di letturaDi il team di OffshoreVps

Metti in sicurezza un web server: UFW, fail2ban e impostazioni di Nginx

Un firewall con blocco predefinito, jail di fail2ban, header Nginx più sicuri, limitazione della frequenza e aggiornamenti automatici per un VPS che ospita un sito web.

Un web server appena messo online viene scansionato nel giro di pochi minuti. Gran parte di quel traffico è automatico e innocuo se hai fatto le basi. Questa guida fa un passo oltre l’hardening in 15 minuti e copre un firewall, la protezione dalla forza bruta con fail2ban e una configurazione Nginx più sicura.

Finestra del terminale su un VPS che mostra i comandi usati per mettere in sicurezza un web server con UFW, fail2ban e Nginx, a partire da “sudo ufw default deny incoming”
Il tipo di comandi che eseguirai sul tuo server in questa guida.

Passo 1: un firewall con blocco predefinito con UFW

Consenti solo ciò che ti serve e blocca il resto. Aggiungi SSH per primo per non chiuderti fuori.

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 usi una porta SSH non standard, consenti quella porta invece di OpenSSH.

Passo 2: fail2ban per i fallimenti ripetuti

fail2ban controlla i log e banna gli indirizzi IP che continuano a fallire l’accesso.

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

Usa le chiavi SSH e disattiva anche l’accesso con password. Leggi le chiavi SSH spiegate.

Passo 3: nascondi la versione di Nginx e aggiungi header sicuri

In /etc/nginx/nginx.conf, dentro il blocco http:

server_tokens off;

Nel blocco server del tuo sito:

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;

Aggiungi l’header HSTS solo quando HTTPS funziona per il tuo dominio e per tutti i sottodomini che usi.

I passaggi di questa guida in ordine: 1. un firewall con blocco predefinito con UFW; 2. fail2ban per i fallimenti ripetuti; 3. nascondi la versione di Nginx e aggiungi header sicuri; 4. limita le richieste abusive; 5. mantieni tutto aggiornato; 6. Cosa tenere d’occhio
I passaggi di questa guida, in ordine.

Passo 4: limita le richieste abusive

La limitazione della frequenza rallenta i tentativi di forza bruta sulle pagine di 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
}

Testa e applica con sudo nginx -t && sudo systemctl reload nginx.

Passo 5: mantieni tutto aggiornato

sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades

Gli aggiornamenti di sicurezza automatici chiudono le falle note senza che tu faccia nulla.

Cosa tenere d’occhio

  • Controlla i ban con sudo fail2ban-client status sshd.
  • Controlla ogni tanto /var/log/nginx/error.log.
  • Se sei dietro un proxy o una CDN, assicurati che fail2ban legga il vero IP del client, altrimenti potresti bannare il tuo stesso proxy.