Il file authorized_keys spiegato

~/.ssh/authorized_keys elenca le chiavi pubbliche autorizzate ad accedere a quell'account, una per riga. Ogni riga ha opzioni facoltative, il tipo di chiave, la chiave e un commento. Il file non deve essere scrivibile da altri, e nemmeno ~/.ssh o la home, altrimenti sshd lo ignora. Le modifiche valgono dal login successivo, senza riavvio.

Aggiornata il . Ogni comportamento qui sotto è stato verificato con OpenSSH 10.0 su Debian 13, in un container usa e getta.

Il formato

# Deploy key, added for the release job
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINH9eelf0P7eT5ue6SualUXFrh1c9p3Maaem93iZtC2Q you@laptop
from="203.0.113.10",restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINxDNsPpUAbI52nc1OduztL+ backup-job

Leggendo una riga da sinistra a destra:

  1. Opzioni, facoltative. Separate da virgole, senza spazi a meno che siano tra virgolette doppie.
  2. Tipo di chiave, come ssh-ed25519 o ssh-rsa.
  3. La chiave, una lunga stringa in base64.
  4. Un commento, facoltativo. Serve solo a te.

Le righe vuote e quelle che iniziano con # vengono ignorate. Una riga senza senso viene saltata e le righe successive funzionano comunque.

Questi errori ti fanno perdere la chiave senza avvisi, e vedi solo Permission denied:

  • Una chiave spezzata su due righe, di solito incollando in un editor che manda a capo il testo. Ogni chiave deve stare su una sola riga.
  • Una chiave senza il tipo all'inizio.
  • Uno spazio dopo una virgola nelle opzioni, come in from="203.0.113.10", restrict.

Ti serve una chiave da mettere lì? Vedi come generare una chiave SSH Ed25519.

Opzioni utili

OpzioneEffetto
restrictDisattiva l'inoltro di porte, agent e X11, i terminali e ~/.ssh/rc.
command="..."Esegue questo comando qualunque cosa abbia chiesto il client.
from="..."Il login deve arrivare da uno di questi indirizzi o nomi. Funzionano CIDR e pattern.
permitopen="host:port"Limita ssh -L a questa destinazione.
expiry-time="20991231"La chiave smette di funzionare dopo questa data.
cert-authorityLa riga è una autorità di certificazione, non una chiave utente. Vedi certificati SSH.
verify-requiredPer le chiavi FIDO: ogni firma deve includere un PIN o un controllo simile.

Per esempi funzionanti, vedi come limitare una chiave a un solo comando.

Permessi

Le impostazioni sicure, eseguite come utente sul server:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Se li hai creati come root, correggi anche il proprietario:

sudo chown -R user:user /home/user/.ssh

Ecco cosa è successo nelle nostre prove e cosa diceva il log del server:

ImpostazioneRisultato
authorized_keys con modo 600 o 644Funziona
authorized_keys con modo 666Rifiutato: Authentication refused: bad ownership or modes for file /home/user/.ssh/authorized_keys
~/.ssh con modo 700 o 755Funziona
~/.ssh con modo 777Rifiutato: Authentication refused: bad ownership or modes for directory /home/user/.ssh
File di proprietà di root, modo 644Funziona, perché l'utente può leggerlo
File di proprietà di root, modo 600Rifiutato: Could not open user 'user' authorized keys '/home/user/.ssh/authorized_keys': Permission denied

Il controllo si chiama StrictModes ed è attivo per impostazione predefinita. Lascialo attivo. Una home con modo 775 ha passato il controllo sul nostro sistema Debian, dove il gruppo contiene solo quell'utente, ma è una modifica di Debian, quindi altri sistemi possono rifiutarla. Il client vede solo Permission denied, quindi leggi sempre il log del server. Vedi come fare il debug di una connessione SSH.

Quale riga vince

Quando una chiave compare più volte, sshd legge dall'alto in basso e usa la prima riga che lascia passare il login. Si applicano solo le opzioni di quella riga. Ne derivano due conseguenze da conoscere:

  • Una riga semplice sopra una con restrizioni la vanifica. Con la chiave elencata prima senza opzioni e poi con command="...", il login ottiene una sessione normale e senza restrizioni.
  • Una riga la cui condizione fallisce non interrompe la ricerca. Se la prima riga ha un from= che non corrisponde, o un expiry-time nel passato, la riga successiva con la stessa chiave può comunque far passare il login. Per escludere una chiave, elimina tutte le sue righe.

Cambiare dove si trova il file

L'impostazione del server AuthorizedKeysFile indica dove cercare. Vedi il valore attuale con:

sudo sshd -T | grep -i authorizedkeysfile

Il valore predefinito è .ssh/authorized_keys .ssh/authorized_keys2, quindi funziona anche una chiave in un authorized_keys2 dimenticato. Controlla se ce n'è uno quando rimuovi un accesso.

Una modifica comune è tenere i file fuori dalle home, dove solo root può modificarli:

# /etc/ssh/sshd_config.d/10-keys.conf
AuthorizedKeysFile /etc/ssh/authorized_keys/%u

%u è il nome utente e %h la home. I percorsi relativi partono dalla home. Ogni utente deve poter leggere il proprio file, per esempio con modo 644 e root come proprietario. Crea quei file prima di ricaricare sshd e tieni aperta una sessione mentre provi.

Per prendere le chiavi da un'altra fonte, come un servizio di directory, usa AuthorizedKeysCommand. Vedi sshd_config(5).

Vedere cosa c'è nel file

ssh-keygen -lf ~/.ssh/authorized_keys

Stampa un'impronta per ogni chiave. Su una riga con opzioni, il testo delle opzioni compare dove ti aspetteresti il commento, per esempio 256 SHA256:NxFS... restrict,command="/usr/local/bin/ssh-allow" (ED25519). L'impronta resta comunque corretta.

Domande

Dove si trova il file authorized_keys?

Di base in ~/.ssh/authorized_keys, nella home dell'account con cui entri. L'impostazione AuthorizedKeysFile del server può indicare un altro percorso; controllala con sudo sshd -T | grep -i authorizedkeysfile.

Devo riavviare sshd dopo aver modificato authorized_keys?

No. sshd legge il file a ogni accesso, quindi la modifica vale dalla connessione successiva.

Perché SSH chiede ancora la password dopo che ho aggiunto la chiave?

Di solito i permessi sono troppo aperti, la chiave è spezzata su due righe o è finita nell'account sbagliato. Il log del server indica il motivo; il client mostra solo la richiesta di password o Permission denied.

Fonti

Altro in Chiavi e accesso

Tutte le guide