Come revocare una chiave SSH quando una persona se ne va

Ricava il fingerprint della chiave, cercalo in ogni file authorized_keys di ogni server e cancella quelle righe. Per bloccare la chiave ovunque possa nascondersi, aggiungila anche al file indicato da RevokedKeys in sshd_config. Le sessioni già aperte restano aperte, quindi chiudi anche quelle. Poi cambia ogni segreto condiviso che la persona conosceva, perché rimuovere una chiave non li copre.

Aggiornata il . Ricerca del fingerprint, rimozione, RevokedKeys con un file semplice e con una KRL, revoca e scadenza dei certificati, ed effetto di passwd -l, nologin e chage sono stati provati con OpenSSH 10.0 su Debian 13, in un container usa e getta.

Trovare la chiave dal fingerprint

Un commento come alice@laptop si può cambiare e non prova nulla, quindi cerca per fingerprint. Se hai la chiave pubblica:

ssh-keygen -lf alice.pub
256 SHA256:NxFS05Q+k1zf9LgrjGPL94UJfFS6B/89THkWACOEJgg alice@laptop (ED25519)

Se non ce l'hai, il log del server mostra quale chiave è stata usata a ogni login:

Accepted publickey for deploy from 203.0.113.10 port 33998 ssh2: ED25519 SHA256:NxFS05Q+k1zf9LgrjGPL94UJfFS6B/89THkWACOEJgg

Vedi come controllare i login SSH per sapere dove si trova quel log.

Cercare su un server

Esegui questo come root, perché ogni ~/.ssh è privata del suo proprietario:

sudo bash -c '
FP="SHA256:NxFS05Q+k1zf9LgrjGPL94UJfFS6B/89THkWACOEJgg"
for f in /root/.ssh/authorized_keys* /home/*/.ssh/authorized_keys*; do
  [ -f "$f" ] && ssh-keygen -lf "$f" | grep -F "$FP" && echo "  found in $f"
done'

Controlla gli account di servizio con la home altrove e un eventuale AuthorizedKeysFile diverso:

sudo sshd -T | grep -i authorizedkeysfile
getent passwd | cut -d: -f1,6

Cercare su tutti i server

Salva la ricerca di prima come script su ogni server, oppure lanciala con un ciclo dal tuo computer. L'elenco degli host lo fornisci tu, e sudo qui non deve chiedere la password:

while read -r host; do
  echo "== $host"
  ssh -n "$host" sudo /usr/local/bin/find-ssh-key
done < hosts.txt

Non dimenticare le macchine che non sono server in senso stretto: hosting Git, dispositivi di rete, jump host, runner CI e destinazioni di backup.

Perché in quel ciclo serve -n lo spiega come eseguire un comando via SSH.

Rimuovere la chiave

Cerca la chiave stessa, non il commento, e tieni un backup:

KEY=$(cut -d' ' -f2 alice.pub)
f=/home/deploy/.ssh/authorized_keys
sudo cp -p "$f" "$f.bak"
sudo grep -vF "$KEY" "$f.bak" | sudo tee "$f" > /dev/null

Cancella il backup quando hai verificato che gli altri riescono ancora a fare login. La stessa chiave può comparire su più righe, e questo comando le toglie tutte.

Bloccarla con RevokedKeys

Togliere le righe risolve ciò che hai trovato. RevokedKeys blocca la chiave anche su qualsiasi account dove non l'hai trovata o dove viene rimessa. La forma più semplice è un file di chiavi pubbliche:

sudo cp alice.pub /etc/ssh/revoked_keys
sudo chmod 644 /etc/ssh/revoked_keys
# /etc/ssh/sshd_config.d/10-revoked.conf
RevokedKeys /etc/ssh/revoked_keys
sudo sshd -t && sudo systemctl reload ssh

Sui sistemi Red Hat e Fedora il servizio si chiama sshd. Un login con quella chiave ora fallisce, e il log dice:

Authentication key ED25519 SHA256:NxFS05Q+k1zf9LgrjGPL94UJfFS6B/89THkWACOEJgg revoked by file /etc/ssh/revoked_keys

Crea il file prima di aggiungere l'impostazione. Se manca o non è leggibile, sshd rifiuta i login con chiave pubblica per tutti gli utenti. Nella nostra prova il log diceva Error checking authentication key ... in revoked keys file. Un file vuoto va bene.

Una KRL per molte chiavi

Una Key Revocation List è una versione binaria compatta dello stesso file, e l'impostazione è la stessa. Creane una, e aggiungi altre chiavi con -u. Senza -u, sostituisce ciò che c'era:

sudo ssh-keygen -k -f /etc/ssh/revoked_keys alice.pub
sudo ssh-keygen -k -u -f /etc/ssh/revoked_keys bob.pub

Controlla una chiave rispetto alla lista:

ssh-keygen -Q -f /etc/ssh/revoked_keys alice.pub
alice.pub (alice@laptop): REVOKED

Una chiave che non è nella lista mostra ok. Il codice di uscita è 1 quando una chiave è revocata e 0 quando non lo è, comodo negli script. Puoi elencare il contenuto di una KRL con ssh-keygen -Q -l -f /etc/ssh/revoked_keys.

Chiudere le sessioni già aperte

Una chiave revocata ferma solo i nuovi login. Nella nostra prova, una sessione aperta prima della rimozione della chiave ha continuato a girare ed è terminata normalmente. Cerca le sessioni aperte con who e, se si tratta dell'account personale di quella persona, chiudile:

sudo pkill -KILL -u alice

Questo uccide tutto ciò che quell'account sta eseguendo, quindi non usarlo su un account condiviso senza guardare prima.

Chiudere l'account

Alcuni comandi comuni fanno meno di quanto ci si aspetti. Li abbiamo provati tutti con una chiave funzionante:

ComandoLa chiave riesce ancora a fare login?
passwd -l aliceSì. Blocca solo la password.
usermod -s /usr/sbin/nologin aliceNon ottiene una shell, ma i tunnel ssh -L funzionano ancora.
chage -E 0 aliceNo. Il log dice Access denied for user alice by PAM account configuration.

Usa chage -E 0 per bloccare subito l'account, e cancellalo più avanti con userdel quando sai che nulla dipende da lui.

Tutto il resto che la persona conosceva

Se la persona aveva accesso a un account condiviso o al root di un server, la chiave può essere solo una parte del problema. Controlla:

  • Account condivisi: sostituisci le loro chiavi e password.
  • Chiavi private che poteva leggere, come le deploy key: sostituiscile e revoca le vecchie.
  • Crontab e file sudoers che la nominano.
  • Chiavi aggiunte sotto altri account. Confronta il contenuto di ogni file authorized_keys con quello che ti aspetti di trovarci.

Rendere tutto più facile la prossima volta: certificati a breve durata

Con i certificati SSH non c'è un elenco di chiavi su ogni server. Il server si fida di una certificate authority, e ogni certificato scade da solo. Questo comando firma una chiave per otto ore, per l'account deploy:

ssh-keygen -s user_ca -I alice@example.com -n deploy -V +8h -z 1001 alice.pub

Quando qualcuno se ne va, smetti di firmare per lui. L'ultimo certificato smette di funzionare da solo, e il log dice Certificate invalid: expired. Per tagliare un certificato prima, revocalo per identità o per numero di serie. Scrivi un piccolo file chiamato spec:

id: alice@example.com
serial: 1001
sudo ssh-keygen -k -u -f /etc/ssh/revoked_keys -s user_ca.pub spec

Vedi i certificati SSH spiegati per la configurazione.

Domande

Eliminare un utente Linux toglie l'accesso SSH?

Eliminare l'account con userdel blocca gli accessi a quell'account. Bloccare solo la password con passwd -l no: una chiave entra lo stesso. La sua chiave può anche trovarsi in altri account, quindi cerca per impronta.

Le sessioni SSH aperte si chiudono quando si toglie una chiave?

No. Togliere o revocare una chiave blocca solo i nuovi accessi. Chiudi le sessioni già aperte, per esempio con pkill sull'account della persona.

Cos'è una KRL di OpenSSH?

Una Key Revocation List: un file binario compatto di chiavi e certificati revocati, creato con ssh-keygen -k e indicato da RevokedKeys in sshd_config.

Fonti

Altro in Mettere in sicurezza un server

Tutte le guide