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:
| Comando | La chiave riesce ancora a fare login? |
|---|---|
passwd -l alice | Sì. Blocca solo la password. |
usermod -s /usr/sbin/nologin alice | Non ottiene una shell, ma i tunnel ssh -L funzionano ancora. |
chage -E 0 alice | No. 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
sudoersche la nominano. - Chiavi aggiunte sotto altri account. Confronta il contenuto di ogni file
authorized_keyscon 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.