Hai già configurato il tuo server Linux per consentire l'accesso tramite chiave SSH? Bene! Ora puoi fare un altro balzo in avanti enorme e innalzare drasticamente il livello di sicurezza disabilitando completamente l'accesso SSH tramite password: così facendo, chiunque non possieda una chiave SSH riconosciuta verrà immediatamente bloccato. L'operazione è efficace quanto semplicissima: basta modificare il file di configurazione e riavviare il servizio
Trattazione ampliata e semplificata nel 2021
Il risultato finale è esattamente quello mostrato nella grafica qui sopra. Dopo aver svolto la procedura descritta di seguito, l'unico modo per eseguire login al server Linux sarà tramite chiave asimmetrica (la cosiddetta "chiave SSH"). Chi non possieda il file-chiave autorizzato, non riceverà più l'invito a digitare la password nel terminale, come invece avviene di consueto. Al contrario: il server mostrerà l'errore Permission denied (public key)
, poi chiuderà bruscamente la connessione. Il potenziale aggressore non potrà fare altro.
Ho testato la procedura sia con Ubuntu Server, sia con CentOS, ma dovrebbe essere identica con qualsiasi altra distribuzione.
Il server così configurato rimane compatibile con qualsiasi client: potremo dunque continuare a connetterci via SSH sia da PC Windows, sia da Linux, Mac, Android eccetera... a patto di possedere una chiave SSH autorizzata, s'intende!
Svolgere questa operazione è vivamente raccomandato, e dovrebbe divenire un'abitudine per chiunque gestisca un qualsiasi tipo di server Linux.
Disattivare il login SSH con password, Passo "zero": Generare le chiavi, testare il login
Prima di svolgere l'operazione descritta di seguito, è imperativo aver generato la nostra chiave SSH ed aver correttamente configurato il server per accettarla. Abbiamo visto come procedere nell'approfondimento dedicato:
» Leggi: [guida] Come creare una chiave SSH da PC Windows, Linux, Mac e accedere ai server senza password
Raccomando inoltre di verificare con la massima attenzione che il login SSH con chiave stia effettivamente funzionando. Il segnale principale che ce lo rivela è proprio il fatto che non viene chiesta la password al momento della connessione.
Disattivare il login SSH con password, Passo 1: Aprire il file di configurazione
La configurazione si svolge, ovviamente, sul server. Colleghiamoci dunque in SSH al server e apriamo il file che contiene le opzioni:
sudo nano /etc/ssh/sshd_config
Attenzione a non confonderlo con il file ssh_config
! Quello di nostro interesse è sshd_config
, con una d
dopo la parola ssh
.
In caso dovessimo ricevere un errore "comando non trovato", installiamo l'editor Nano come descritto qui:
Disattivare il login SSH con password, Passo 2: PasswordAuthentication
Premere la combinazione da tastiera Ctrl+W
per aprire la ricerca. Nel campo proposto, digitare PasswordAuthentication
e battere Invio
.
L'editor troverà così la direttiva omonima. Ora basta modificare tale opzione di modo che si legga
PasswordAuthentication no
Una volta effettuata la modifica, premere nuovamente Ctrl+W
e cercare di nuovo la stessa opzione: può capitare, infatti, che sia presente presente più volte. Ogni volta che la incontriamo, vogliamo assicurarci che sia impostata allo stesso modo:
PasswordAuthentication no
Se così non è, modifichiamola ora.
Disattivare il login SSH con password, Passo 3: ChallengeResponseAuthentication
C'è una seconda opzione che potrebbe consentire l'accesso SSH tramite password. Si chiama ChallengeResponseAuthentication
. Premiamo dunque di nuovo Ctrl+W
all'interno del file per cercare questa stringa e assicurarci che sia impostata così:
ChallengeResponseAuthentication no
Ripetere la ricerca per assicurarsi che non vi siano altre occorrenze.
C'è da dire che, su Ubuntu Server, questa opzione è già correttamente valorizzata a no
. Ma, stando a questo documento di RedHat, il valore di default dovrebbe essere yes
. È dunque opportuno verificare esplicitamente quale valore sia impostato, e modificarlo se non è corretto.
Disattivare il login SSH con password, Passo 4: Salvare, chiudere, riavviare SSH
Concludiamo la modifica e usciamo dall'editor di testo premendo, in sequenza, Ctrl+X
, Y
, Invio
.
Ora riavviamo il servizio per rendere effettive le modifiche:
sudo service ssh restart
Disattivare il login SSH con password, Passo 5: Testare il servizio
È tutto pronto! Per assicurarci che la nuova configurazione funzioni come ci aspettiamo, proviamo a collegarci da un client qualsiasi utilizzando un nome utente inesistente:
ssh nessuno@mioserver.com
In situazioni "standard" ci verrebbe comunque richiesta la password, mentre ora dovremmo ricevere il messaggio Permission denied (publickey)
Se invece ci connetteremo utilizzando un nome utente corretto da un PC che possiede una chiave asimmetrica valida, potremo accedere come di consueto.
Una nota su UsePAM
Alcuni articoli che ho consultato mentre aggiornavo la presente guida suggeriscono di impostare anche un'altra opzione nel file di configurazione che abbiamo modificato poco fa :
UsePAM no
In verità, pare che questa modifica possa introdurre alcuni effetti collaterali indesiderati, senza nessun beneficio reale in merito alla disattivazione del login SSH con password. Non la consiglio.
Fonti e riferimenti
In questa guida abbiamo visto come disattivare il login tramite password di SSH, mantenendo quindi l'autenticazione tramite chiave come unica modalità di accesso.
La guida è frutto della mia esperienza diretta, ma ho comunque ri-verificato la correttezza del tutto consultando queste fonti:
- Three locks for your SSH door (ibm.com)
- Can someone explain the 'PasswordAuthentication'... (superuser.com)
- Sshd_config still allowing password authentication (askubuntu)
- The default value for the "ChallengeResponseAuthentication"... (redhat.com)
- SSH PasswordAuthentication vs ChallengeResponseAuthentication (tankywoo.com)
- What's the downside of disabling PAM in OpenSSH... (serverfault.com)
- What is PAM and why does AWS enable it by default? (askubuntu)