Il messaggio
Received disconnect from 203.0.113.10 port 22:2: Too many authentication failures
Disconnected from 203.0.113.10 port 22
Sul server, il log dice:
maximum authentication attempts exceeded for user from 203.0.113.20 port 47120 ssh2 [preauth]
Spesso non ti è mai stata chiesta una password. Nel nostro test, un account con una password funzionante è fallito con questo messaggio prima di qualsiasi richiesta, perché le chiavi avevano esaurito prima tutti i tentativi.
Controlla la causa
Conta le chiavi nel tuo agent:
ssh-add -l
Poi guarda cosa viene davvero offerto:
ssh -v user@server 2>&1 | grep -E 'Offering|Too many'
debug1: Offering public key: key1 ED25519 SHA256:...
debug1: Offering public key: key2 ED25519 SHA256:...
debug1: Offering public key: key3 ED25519 SHA256:...
debug1: Offering public key: key4 ED25519 SHA256:...
debug1: Offering public key: key5 ED25519 SHA256:...
debug1: Offering public key: key6 ED25519 SHA256:...
Received disconnect from 203.0.113.10 port 22:2: Too many authentication failures
Ogni chiave che il server non accetta conta come un fallimento, e il limite è MaxAuthTries, 6 per impostazione predefinita. Nel nostro test la sesta chiave ha avuto comunque il suo turno: con la chiave giusta al sesto posto il login ha funzionato, e con sei chiavi sbagliate davanti è fallito. Un server con un limite più basso fallisce prima.
La soluzione: di' a ssh quale chiave usare
Per un solo tentativo:
ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519_server user@server
Per renderlo permanente, aggiungi questo a ~/.ssh/config:
Host server
HostName 203.0.113.10
User user
IdentityFile ~/.ssh/id_ed25519_server
IdentitiesOnly yes
-i da solo non basta. L'abbiamo provato: senza IdentitiesOnly, le chiavi dell'agent andavano comunque per prime e tornava lo stesso errore. È IdentitiesOnly yes a limitare ssh alle chiavi che hai indicato.
Altre impostazioni per host sono in questi esempi di file ssh config.
Se la chiave esiste solo nell'agent
IdentityFile può puntare al file della chiave pubblica. ssh usa allora quel file per scegliere la chiave, e la firma la fa l'agent:
Host server
IdentityFile ~/.ssh/id_ed25519_server.pub
IdentitiesOnly yes
Se accedi con una password
Qui le chiavi sono solo d'intralcio, quindi disattivale per questo login:
ssh -o PubkeyAuthentication=no user@server
In un file di configurazione, è PubkeyAuthentication no nel blocco dell'host.
Altre opzioni
Tieni meno chiavi nell'agent
ssh-add -l # list
ssh-add -d ~/.ssh/old_key # remove one
ssh-add -D # remove all
Questo rimuove le chiavi solo dall'agent e lascia in pace i file. Se usi una chiave diversa per ogni server, l'elenco cresce in fretta, quindi la configurazione qui sopra è la risposta duratura.
Saltare l'agent per un host
Host server
IdentityAgent none
IdentityFile ~/.ssh/id_ed25519_server
Funziona anche questo, ma digiti la passphrase della chiave ogni volta, se ne ha una.
Impostare IdentitiesOnly per tutti gli host
Puoi mettere IdentitiesOnly yes sotto Host *. Senza un IdentityFile per un host, ssh prova i file predefiniti come ~/.ssh/id_ed25519 e ignora le altre chiavi nell'agent. Quindi gli host che si affidavano a una di quelle altre chiavi hanno bisogno di una propria riga IdentityFile.
Non alzare MaxAuthTries per questo
Puoi alzare il limite su un server che controlli, ma la causa è sul client. Ogni altro server a cui ti colleghi mantiene il suo limite, e un limite più alto dà a chiunque provi a indovinare più tentativi per ogni connessione.
I fallimenti ripetuti possono farti bannare
Se il server esegue fail2ban, ogni disconnessione come questa può contare contro il tuo indirizzo. Nel nostro test, una sola disconnessione di questo tipo ha aggiunto un fallimento al jail sshd. Se dopo qualche tentativo l'errore diventa Connection refused, potresti essere stato bannato. Vedi fail2ban per SSH.
Domande
Qual è il valore predefinito di MaxAuthTries?
6. Ogni chiave rifiutata dal server conta come un tentativo, quindi un agent con molte chiavi può esaurirli prima di arrivare a quella giusta.
Perché ssh -i non risolve?
Senza IdentitiesOnly yes, ssh offre comunque le chiavi dell'agent prima di quella indicata con -i.
Come vedo quali chiavi offre ssh?
Esegui ssh -v user@server e cerca le righe Offering public key.