Un server con un indirizzo IP pubblico riceve tentativi di accesso automatici pochi minuti dopo essere stato acceso. Non serve essere un bersaglio interessante: programmi automatici scandiscono continuamente Internet alla ricerca di password deboli e servizi non aggiornati. Le prime operazioni dopo la creazione di un server sono quindi le più importanti, e richiedono meno di un'ora. Gli esempi che seguono si riferiscono a una distribuzione basata su Debian o Ubuntu.
1. Aggiornare subito il sistema
L'immagine da cui nasce il server può avere settimane o mesi. Il primo comando è sempre l'aggiornamento completo dei pacchetti:
apt update && apt full-upgrade -y
Se viene aggiornato il kernel, serve un riavvio perché la nuova versione entri in funzione.
2. Creare un utente personale
Lavorare come root rende ogni errore potenzialmente distruttivo e lascia tracce poco chiare nei registri. Si crea un utente con nome proprio e lo si autorizza a usare sudo per le operazioni amministrative:
adduser mario
usermod -aG sudo mario
Se più persone gestiscono il server, ciascuna deve avere il proprio utente. Così si sa chi ha fatto cosa, e quando qualcuno lascia il progetto basta disattivare il suo account.
3. Accedere con le chiavi SSH
L'autenticazione con chiave è molto più robusta della password. Sul tuo computer generi una coppia di chiavi, preferibilmente di tipo Ed25519, e copi quella pubblica sul server:
ssh-keygen -t ed25519
ssh-copy-id mario@indirizzo-del-server
La chiave privata resta sul tuo computer, protetta da una passphrase. Molti provider permettono di inserire la chiave pubblica già al momento della creazione del server, ed è la scelta migliore.
4. Chiudere le porte d'ingresso più deboli
Verificato che l'accesso con chiave funziona, da una seconda sessione aperta, si modifica la configurazione del server SSH in /etc/ssh/sshd_config:
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
Poi si ricarica il servizio. Tenere aperta la sessione originale finché non hai verificato il nuovo accesso evita di chiuderti fuori per un errore di battitura.
Cambiare la porta di SSH dalla 22 a un'altra riduce il rumore nei log, ma non è una misura di sicurezza vera: con le password disattivate, i tentativi automatici falliscono comunque.
5. Attivare un firewall
Il principio è semplice: tutto chiuso, tranne ciò che serve. Con ufw, il firewall semplificato di Ubuntu:
ufw default deny incoming
ufw default allow outgoing
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
Se il provider offre anche un firewall di rete esterno al server, conviene usarlo in aggiunta: filtra il traffico prima che arrivi alla macchina e resta attivo anche se la configurazione interna viene modificata per errore.
Un'avvertenza per chi usa Docker: le porte pubblicate dai container possono aggirare le regole di ufw, perché Docker gestisce direttamente le proprie regole di rete. Per i servizi interni, come un database, conviene pubblicare la porta solo sull'indirizzo locale o non pubblicarla affatto.
6. Aggiornamenti di sicurezza automatici
Nessuno si ricorda di aggiornare un server ogni settimana. Il pacchetto unattended-upgrades installa automaticamente le correzioni di sicurezza:
apt install unattended-upgrades
dpkg-reconfigure --priority=low unattended-upgrades
Puoi configurarlo per riavviare il server a un orario prestabilito quando un aggiornamento lo richiede. Per i server più critici si può preferire una notifica e un riavvio manuale, ma la scelta va fatta consapevolmente.
7. Controllare cosa è in ascolto
Il comando ss -tulpn mostra tutti i servizi che accettano connessioni e su quale indirizzo. Ogni riga deve avere una ragione d'essere. Un database in ascolto su tutti gli indirizzi, invece che solo su quello locale, è uno degli errori più frequenti e più gravi.
8. Rallentare i tentativi di accesso
Strumenti come fail2ban leggono i log e bloccano temporaneamente gli indirizzi che falliscono ripetutamente l'accesso. Con le password disattivate il rischio è già basso, ma fail2ban è utile anche per proteggere altri servizi esposti, come il pannello di amministrazione di un'applicazione.
9. Pensare subito a backup e monitoraggio
La sicurezza non riguarda solo gli attacchi. Prima di mettere dati importanti sul server, attiva:
- backup automatici con almeno una copia fuori dal provider;
- un controllo di raggiungibilità esterno che ti avvisi se il servizio non risponde;
- un avviso sullo spazio disco, perché un disco pieno blocca database e log.
10. Scrivere tutto
Ogni operazione fatta sul server va annotata, o meglio ancora trasformata in uno script o in un playbook di configurazione. Il prossimo server sarà pronto in pochi minuti, identico al primo, e saprai sempre com'è stato configurato.
In sintesi
- Aggiorna il sistema appena creato il server e attiva gli aggiornamenti di sicurezza automatici.
- Usa un utente personale con
sudoe accedi solo con chiavi SSH, disattivando password e login di root. - Attiva un firewall che chiuda tutto tranne i servizi necessari, attento alle porte pubblicate da Docker.
- Verifica con
ss -tulpncosa è in ascolto e non esporre mai i database su Internet. - Prepara backup, monitoraggio e documentazione prima di mettere in produzione dati importanti.