Quando prendi in consegna un VPS appena provisionato, hai tra le mani un sistema nudo. Nessun firewall, nessun utente dedicato, accesso root diretto e password temporanee. Se lo lasci in quello stato, i bot lo troveranno in meno di un’ora. Ho visto log di infrastrutture con 2.000 endpoint registrare tentativi di brute force a distanza di minuti dal primo boot.
Configurare un VPS Linux da zero richiede metodo. Non puoi improvvisare. Ogni passo dipende dal precedente. Se dimentichi il firewall, il servizio SSH resta esposto. Se trascuri gli aggiornamenti, una CVE nota apre la porta a privilege escalation. Questa è la checklist che uso per mettere in sicurezza qualsiasi server Ubuntu o Debian prima di installare un singolo servizio di produzione.
Accesso iniziale come root
Il provider ti invia l’IP pubblico e la password root temporanea. Connettiti subito. Usa l’IP, non un dominio, perché il DNS potrebbe non propagarsi ancora.
ssh root@IP_DEL_VPS
Se è la prima connessione, SSH ti chiede di confermare il fingerprint del server. Accetta. Cambia subito la password se il provider non ti costringe a farlo al primo login. Scegli una stringa lunga e complessa, anche se la disabiliteremo tra poco per l’accesso remoto.
Aggiornare il sistema
Il template del provider potrebbe avere pacchetti vecchi di mesi. Prima di esporre qualsiasi servizio, applica tutte le patch di sicurezza.
apt update && apt upgrade -y
Questo comando aggiorna l’indice dei pacchetti e installa le ultime versioni disponibili. Se il kernel viene aggiornato, pianifica un riavvio. Su un VPS appena configurato, un reboot non crea disservizi.
Creare un utente non-root con sudo
Lavorare sempre come root è un rischio. Un errore di battitura in un comando può cancellare l’intero filesystem. Crea un utente dedicato per le operazioni quotidiane.
adduser deploy
Il comando ti chiede la password e alcuni dati facoltativi. Assegna una password robusta. Ora aggiungi l’utente al gruppo sudo per consentirgli di eseguire comandi come root quando serve.
usermod -aG sudo deploy
Verifica che l’utente possa usare sudo. Passa all’utente e testa:
su - deploy
sudo whoami
L’output deve essere root.
Configurare SSH (chiave pubblica, disabilitare root, cambiare porta)
L’accesso SSH con password è il vettore di attacco più comune. I bot provano dizionari interi di credenziali sulla porta 22. Devi chiudere questa porta.
Genera una chiave SSH sulla tua macchina locale, non sul server:
ssh-keygen -t ed25519 -C "deploy@vps-prod"
Copia la chiave pubblica sul VPS. Usa ssh-copy-id specificando l’utente corretto:
ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@IP_DEL_VPS
Ora accedi senza password. Testa l’accesso, poi modifica la configurazione di SSH.
sudo nano /etc/ssh/sshd_config
Cerca e modifica questi parametri:
Port 2222
PermitRootLogin no
PasswordAuthentication no
Scegli una porta alta, come 2222 o 4422. Non usare la 22. Riavvia il demone SSH per applicare le modifiche:
sudo systemctl restart sshd
Prima di chiudere la sessione root corrente, apri un’altra finestra di terminale e verifica di poter accedere con il nuovo utente sulla nuova porta. Non chiudere mai la sessione originale finché non hai confermato che il nuovo accesso funziona. [Leggi anche: Hardening SSH su Linux: 10 Impostazioni Essenziali]
Configurare UFW
Il firewall è il tuo perimetro. Su Ubuntu, UFW semplifica la gestione delle regole iptables. Abilita solo il traffico che ti serve, partendo dall’SSH.
sudo ufw allow 2222/tcp
sudo ufw enable
Ricorda di permettere la porta SSH nuova. Se abiliti UFW senza permettere la tua porta, ti blocchi fuori. Verifica lo stato:
sudo ufw status
L’output deve mostrare la porta 2222 consentita. Più tardi, quando installerai Nginx o un database, aggiungerai le porte 80, 443 o 5432 allo stesso modo.
Installare fail2ban
Anche con le chiavi SSH, i bot contineranno a bussare. Fail2ban legge i log di sistema e banna gli IP dopo ripetuti tentativi di accesso falliti.
sudo apt install fail2ban -y
La configurazione di default su Ubuntu è sufficiente per iniziare. Il filtro legge il file di log di SSH e blocca gli IP dopo 5 tentativi falliti per 10 minuti. Verifica che il servizio sia attivo:
sudo systemctl status fail2ban
Se hai cambiato la porta SSH, assicurati che fail2ban legga i log corretti. La configurazione di default di Debian e Ubuntu rileva automaticamente la porta in ascolto.
Abilitare aggiornamenti automatici di sicurezza
Un server non aggiornato è un server violabile. Non puoi loggarti ogni giorno su ogni macchina per verificare le patch. Configura unattended-upgrades per installare solo gli aggiornamenti di sicurezza in automatico.
apt install unattended-upgrades -y
dpkg-reconfigure unattended-upgrades
Rispondi Yes alla richiesta di installazione automatica. Il sistema scaricherà e applicherà le patch di sicurezza ogni notte. Non installerà aggiornamenti di feature o librerie che potrebbero rompere la compatibilità. Controlla la documentazione ufficiale su wiki.debian.org/UnattendedUpgrades per personalizzare le origini dei pacchetti.
Configurare il fuso orario e l’hostname
I log sono inutili se il timestamp è sbagliato. Se il server segna l’ora di un altro fuso orario, correlare eventi tra sistemi diversi diventa un incubo. Imposta il fuso orario corretto:
timedatectl set-timezone Europe/Rome
Imposta anche un hostname descrittivo. Non lasciare il nome generico assegnato dal provider.
hostnamectl set-hostname mio-server
Aggiungi l’hostname al file /etc/hosts associandolo a 127.0.1.1 per evitare warning nei comandi sudo.
Sincronizzazione NTP
La deriva dell’orologio di sistema causa problemi con i certificati TLS, l’autenticazione Kerberos e la replica dei database. Abilita la sincronizzazione NTP.
sudo timedatectl set-ntp true
Verifica lo stato della sincronizzazione:
timedatectl status
Assicurati che il campo NTP synchronized riporti yes. Su Ubuntu 22.04 e 24.04, timesyncd gestisce la sincronizzazione in modo leggero senza bisogno di installare ntpd.
Checklist finale — verifica di tutto
Prima di dichiarare il VPS pronto, esegui un controllo incrociato. Verifica che ogni servizio critico sia attivo e che non ci siano accessi sospetti.
Controlla lo stato di SSH:
sudo systemctl status sshd
Controlla lo stato di fail2ban:
sudo systemctl status fail2ban
Verifica le regole del firewall:
sudo ufw status
Infine, controlla gli ultimi accessi al sistema. Questo comando mostra le ultime 10 sessioni registrate:
last -n 10
Devi vedere solo il tuo utente deploy e il tuo IP. Se vedi root o IP sconosciuti, indaga subito.
Prossimi passi (Nginx, database, app)
Il tuo VPS è ora solido e isolato dall’esterno. Hai una base sicura su cui costruire. Il prossimo passo dipende dal carico di lavoro. Se devi ospitare un’applicazione web, installa Nginx, apri le porte 80 e 443 su UFW, configura il blocco server e aggiungi Certbot per i certificati Let’s Encrypt. Se serve un database, installa PostgreSQL, vincola l’ascolto a 127.0.0.1 e imposta l’autenticazione scram-sha-256. Ogni nuovo servizio aggiunto richiede la sua configurazione di sicurezza specifica. Non saltare mai questo passaggio.