Errore SSH "Too many authentication failures": come risolvere

Il tuo client SSH ha offerto più chiavi di quante il server ne ammetta, di solito perché l'agent ne contiene molte, e ogni chiave sbagliata conta come un tentativo fallito. Il limite predefinito è 6. Collegati con ssh -o IdentitiesOnly=yes -i ~/.ssh/the_right_key user@server, poi metti IdentitiesOnly yes e IdentityFile in un blocco Host.

Aggiornata il . Riprodotto con OpenSSH 10.3 su macOS e un ssh-agent di prova separato con 8 chiavi, verso OpenSSH 10.0 su Debian 13 con il MaxAuthTries predefinito di 6 e con un valore più basso.

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.

Fonti

Altro in Messaggi di errore

Tutte le guide