<marco />
← Tutti gli articoli
4 min di lettura

Hardening SSH

linuxsshsicurezzaguida

Nella guida sul login SSH senza password abbiamo configurato l'autenticazione con chiave. Ma di per sé non mette in sicurezza il server: se l'accesso con password resta attivo, l'attaccante può ancora ignorare la tua chiave e provare a indovinare le credenziali. Vediamo le diverse opzioni di difesa.

Tutte le modifiche riguardano la configurazione del server SSH in /etc/ssh/sshd_config. Dopo ogni modifica va ricaricato il servizio:

Terminal
sudo systemctl reload sshd

Tieni aperta una seconda sessione
Prima di toccare la configurazione SSH, apri una seconda connessione al server e lasciala attiva. Se sbagli qualcosa e ti blocchi fuori, quella sessione ti permette di rimediare senza perdere l'accesso.

Disabilitare l'autenticazione con password

Una volta verificato che il login con chiave funziona, l'accesso con password diventa solo una superficie d'attacco. Disabilitalo in /etc/ssh/sshd_config:

text
PasswordAuthentication no
PubkeyAuthentication yes

Per ubuntu server
È probabile che il file /etc/ssh/sshd_config.d/50-cloud-init.conf riscriva la configurazione di PasswordAuthentication, in questo caso bisogna creare un file xx-nome.conf (xx < 50) contenente la stringa "PasswordAuthentication no" per sovrascriverlo a sua volta.

Da questo momento solo chi possiede una chiave autorizzata può entrare: i brute-force sulle password diventano inutili.

Disabilitare il login di root

L'utente root esiste su ogni sistema, quindi è il bersaglio numero uno dei tentativi automatici. Conviene impedirne il login diretto e usare un utente normale con sudo:

text
PermitRootLogin no

Assicurati di avere già un utente non-root con privilegi sudo e la tua chiave installata, altrimenti rischi di non poter più amministrare la macchina.

Fermare i brute-force con fail2ban

Alternativamente all'approccio mostrato nella sezione precedente possiamo introdurre meccanismi per proteggere gli accessi con password. fail2ban legge i log di autenticazione e banna automaticamente gli IP che accumulano tentativi falliti.

Installazione (Debian/Ubuntu):

Terminal
sudo apt install fail2ban

Crea un file di configurazione locale (non modificare quello di default, che verrebbe sovrascritto dagli aggiornamenti):

Terminal
sudo nano /etc/fail2ban/jail.local
text
[sshd]
enabled = true
maxretry = 3
bantime = 1h
findtime = 10m

Con questa configurazione un IP che fallisce 3 volte in 10 minuti viene bannato per un'ora. Attiva il servizio:

Terminal
sudo systemctl enable --now fail2ban

Puoi controllare lo stato e gli IP bannati con:

Terminal
sudo fail2ban-client status sshd

Cambiare la porta: utile, ma non è sicurezza

Spostare SSH da 22 a una porta alta riduce drasticamente il rumore nei log, perché la maggior parte dei bot scansiona solo la 22, modificala in /etc/ssh/sshd_config:

text
Port 2222

Attenzione
È security through obscurity: nasconde, non protegge. Uno scanner di porte la trova comunque. Fallo per pulire i log, non al posto delle misure precedenti. E se usi un firewall, ricordati di aprire la nuova porta prima di riavviare il servizio.

Aggiungere un secondo fattore (MFA)

Per gli accessi più sensibili puoi richiedere, oltre alla password, un codice OTP (in questo esempio useremo Google Authenticator).

Terminal
sudo apt install libpam-google-authenticator

Esegui la configurazione con l'utente con cui ti colleghi: genererà un QR code da scansionare con l'app e dei codici di recupero da salvare.

Terminal
google-authenticator

Poi aggiungi la seguente riga in /etc/pam.d/sshd:

text
auth required pam_google_authenticator.so

E in /etc/ssh/sshd_config modifica:

text
KbdInteractiveAuthentication yes

Ora il login richiede la password e il codice a sei cifre.

L'MFA funziona con la combinazione di due o più fattori, in questo caso “ciò che sai” (la password) e “ciò che hai” (OTP).

L'hardening di SSH è difesa in profondità: queste precauzioni insieme riducono drasticamente la superficie d'attacco.

  • Solo chiavi niente brute-force sulle password.
  • No root login elimina il bersaglio più "ovvio".
  • fail2ban riduce il rumore e il pericolo dei bot.
  • Porta non standard log più puliti (non è un sistema di sicurezza).
  • MFA un secondo fattore che ti protegge in caso di password rubata.

Configurati una volta, questi controlli lavorano in background e trasformano un server esposto in un bersaglio molto poco interessante.