Passo 1: assicurati di avere un'altra via d'accesso
Entra come utente normale con la tua chiave, in una finestra che tieni aperta, e controlla che sudo funzioni:
ssh user@server
sudo -v
Se non hai ancora un account così, vedi come creare un utente SSH con sudo. Fallo per primo. È l'unico passo che ti protegge dal rischio di restare chiuso fuori.
Passo 2: cerca le impostazioni già presenti
sudo grep -ri permitrootlogin /etc/ssh/sshd_config /etc/ssh/sshd_config.d/
Per la maggior parte delle impostazioni di sshd, vince il primo valore letto, non l'ultimo. Su Debian e Ubuntu, sshd_config ha Include /etc/ssh/sshd_config.d/*.conf vicino all'inizio, quindi i file lì dentro vengono letti per primi, in ordine di nome. Nel nostro test, con 00-cloud.conf che diceva PermitRootLogin yes e 10-no-root.conf che diceva no, root è rimasto consentito.
L'immagine di un provider di hosting può contenere un file così, quindi rimuovi o cambia qualsiasi riga del genere. Senza una riga Include, modifica PermitRootLogin direttamente in sshd_config.
Passo 3: aggiungi l'impostazione
echo 'PermitRootLogin no' | sudo tee /etc/ssh/sshd_config.d/10-no-root.conf
Passo 4: controlla prima di ricaricare
sudo sshd -t
sudo sshd -T | grep -i permitrootlogin
sshd -t non stampa nulla quando è tutto a posto. Un errore di battitura produce un messaggio come unsupported option "maybe", e va corretto prima di proseguire. sshd -T mostra il valore che il server userà davvero:
permitrootlogin no
Passo 5: ricarica
# Debian and Ubuntu
sudo systemctl reload ssh
# Red Hat, Fedora and similar
sudo systemctl reload sshd
Un reload si applica alle nuove connessioni e la sessione aperta continua. L'abbiamo verificato: una sessione aperta prima della modifica ha continuato a funzionare, e un nuovo login ha seguito la nuova regola.
Passo 6: prova da una nuova finestra
ssh root@server
Dovresti vedere Permission denied, anche con la chiave giusta. Il log del server dice:
ROOT LOGIN REFUSED FROM 203.0.113.10 port 41288
Poi entra come utente normale da un'altra finestra nuova, ed esegui di nuovo sudo -v.
Cosa fa ogni valore
| Valore | Password | Chiave | Chiave con comando forzato |
|---|---|---|---|
yes | Consentita | Consentita | Consentita |
prohibit-password | Rifiutata | Consentita | Consentita |
forced-commands-only | Rifiutata | Rifiutata | Consentita |
no | Rifiutata | Rifiutata | Rifiutata |
Il valore predefinito è prohibit-password, da OpenSSH 7.0. Quindi su un sistema che non l'ha cambiato, root non può entrare con una password, ma una chiave di root funziona ancora. without-password è un vecchio nome dello stesso valore. sshd -T ha stampato without-password sul nostro server OpenSSH 10.0 quando l'impostazione era prohibit-password. La versione 10.1 l'ha cambiato per stampare il nome attuale.
Un comando forzato è command="..." in authorized_keys. forced-commands-only va bene per un job di backup che ha davvero bisogno di root per un solo comando fisso.
Eccezioni con Match
Per consentire le chiavi di root solo da un indirizzo di gestione, aggiungi questo allo stesso file, sotto la prima riga:
Match Address 203.0.113.10
PermitRootLogin prohibit-password
Un semplice sshd -T non mostra l'effetto di un blocco Match. Usa -C per descrivere una connessione e vedere cosa si applicherebbe. Questi due hanno dato risposte diverse nel nostro test:
sudo sshd -T -C user=root,host=server,addr=203.0.113.10 | grep -i permitrootlogin
sudo sshd -T -C user=root,host=server,addr=198.51.100.7 | grep -i permitrootlogin
Se resti davvero chiuso fuori
Usa la console del tuo provider di hosting, che non passa da SSH. Elimina il file che hai aggiunto e ricarica sshd.
Domande
Che differenza c'è tra PermitRootLogin no e prohibit-password?
no rifiuta root in ogni modo. prohibit-password, il valore predefinito, rifiuta la password di root ma accetta ancora una chiave di root.
Ricaricare sshd chiude la sessione aperta?
No. Il reload vale per le nuove connessioni, e le sessioni già aperte continuano.
E se resto chiuso fuori dopo aver disattivato root?
Usa la console web del provider, che non passa da SSH. Cancella il file che hai aggiunto e ricarica sshd.