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