Come disabilitare il login di root via SSH

Prima assicurati che un altro account possa entrare e usare sudo. Poi crea /etc/ssh/sshd_config.d/10-no-root.conf con la riga PermitRootLogin no, controllala con sudo sshd -T | grep -i permitrootlogin e ricarica con sudo systemctl reload ssh (sshd su Red Hat e Fedora). Le sessioni già aperte restano aperte, quindi prova un nuovo login di root da un'altra finestra prima di chiudere qualsiasi cosa.

Aggiornata il . Tutti i valori, l'ordine dei file e sshd -T sono stati provati con OpenSSH 10.0 su Debian 13, in un container usa e getta, con login reali sia con password sia con chiave.

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

ValorePasswordChiaveChiave con comando forzato
yesConsentitaConsentitaConsentita
prohibit-passwordRifiutataConsentitaConsentita
forced-commands-onlyRifiutataRifiutataConsentita
noRifiutataRifiutataRifiutata

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.

Fonti

Altro in Mettere in sicurezza un server

Tutte le guide