Guida alla risoluzione dei problemi di connessione con ssh
1 – Modifica delle chiavi di identificazione del server
Se il server a cui ci si deve collegare è stato reinstallato, è normale ricevere un avviso di pericolo quando ci si ricollega ad esso. Il programma utilizzato per la connessione (client) ci avvertirà che l’identità del server è mutata e non corrisponde a quella memorizzata in precedenza mediante le chiavi crittografiche di identificazione.
Se sappiamo che effettivamente c’è stata una modifica sul server, possiamo consentire al client di memorizzare le nuove chiavi di identificazione.
A seconda del programma utilizzato per la connessione, il messaggio di avviso e le modalità di accettazione delle nuove chiavi sono diverse. Vediamo i vari casi.
Connessione da linea di comando tramite ssh
Di solito quando le chiavi di identificazione sono cambiate, ssh rifiuta di collegarsi e mostra un messaggio come questo:
[alice@minipc ~]$ ssh alice@superpc.pd.infn.it
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:PiDF5OCsdmvJDRe0brmQXArcOl1wmtitS6pXg34hsYI.
Please contact your system administrator.
Add correct host key in /home/alice/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/alice/.ssh/known_hosts:3
RSA host key for superpc has changed and you have requested strict checking.
Host key verification failed.
In questo caso per accettare la nuova chiave di identificazione, bisogna eliminare manualmente la vecchia dal file “known_hosts“; il messaggio indica la il percorso del file (/home/alice/.ssh/known_hosts nell’esempio) e la riga da eliminare (la riga 3 nell’esempio).
Per eliminare la riga si può modificare manualmente il file oppure, più semplicemente, utilizzare il comando
ssh-keygen -R <nome server>
Nel nostro esempio quindi avremo
ssh-keygen -R superpc
A questo punto, quando riproveremo a collegarci, il programma ci avvertirà che l’identità del server è sconosciuta, ma ci consentirà di continuare la connessione e di accettare la nuova chiave.
Connessione con Bitvise SSH client oppure con MobaXterm
Bitvise e MobaXterm gestiscono automaticamente il cambiamento della chiave di identificazione del server: nel caso la chiave risulti modificata, apparirà una finestra con un avviso e l’opzione per accettare o rifiutare la connessione (vedi immagini). Accettando la connessione, la nuova chiave verrà memorizzata al posto della vecchia.
2 – Incompatibilità di algoritmi crittografici tra client e server
Nel corso degli anni alcuni degli algoritmi di crittografia utilizzati da ssh sono cambiati: i più vecchi sono risultati vulnerabili e sono stati sostituiti da nuovi algoritmi più resistenti. Può capitare quindi che client e server non riescano a negoziare un algoritmo di crittografia comune e pertanto la connessione non possa essere stabilita. Se il client usato per la connessione è più recente del server, allora in molti casi è possibile forzarlo ad usare uno degli algoritmi disponibili sul server. Viceversa quando è il server ad essere molto più recente del client, non c`è altra soluzione che aggiornare il client o utilizzare un server intermedio che accetti le connessioni dal client vecchio e sia in grado di connettersi al server desiderato.
Vediamo qualche esempio.
Client recente, server vecchio
[alice@nuovopc ~]$ ssh vecchiopc.pd.infn.it
Unable to negotiate with 192.168.0.100 port 22: no matching host key type found.
Their offer: ssh-rsa,ssh-dss
Qui si vede che il vecchio server supporta per la chiave dell’host solo gli algoritmi ssh-rsa e ssh-dss. Si può forzare il client ad usarli utilizzando l’opzione HostKeyAlgorithms:
[alice@nuovopc ~]$ ssh -o HostKeyAlgorithms=+ssh-rsa,ssh-dss vecchiopc.pd.infn.it
alice@vecchiopc.pd.infn.it's password:
In altri casi client e server non riescono a negoziare un metodo per scambiarsi le chiavi con cui crittografare la connessione:
[alice@nuovopc ~]$ ssh vecchissimopc
Unable to negotiate with 192.168.0.77 port 22: no matching key exchange method found.
Their offer: diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
Questa volta, tramite l’opzione KexAlgorithms possiamo forzare il client ad utilizzare uno degli algoritmi obsoleti supportati dal server:
[alice@nuovopc ~]$ ssh -o KexAlgorithms=+diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 vecchissimopc
Unable to negotiate with 192.168.0.77 port 22: no matching host key type found.
Their offer: ssh-rsa,ssh-dss
Qui si vede che abbiamo risolto il problema dello scambio delle chiavi crittografiche, ma ora si presenta il problema dell’incompatibilità del tipo di chiave dell’host, già visto nel caso precedente, che sappiamo risolvere con l’opzione HostKeyAlgorithms. Quindi usando entrambe le opzioni riusciamo a connetterci:
[alice@nuovopc ~]$ ssh -o KexAlgorithms=+diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 -o HostKeyAlgorithms=+ssh-rsa,ssh-dss vecchissimopc
alice@vecchissimopc.pd.infn.it's password:
Un altro tipico errore che si può riscontrare quando si utilizza un client recente per collegarsi ad un server vecchio è
Bad server host key: Invalid key length
Il motivo è che il server usa una chiave di identificazione di tipo RSA di lunghezza troppo piccola (generalmente 1024 bit invece di 2048 o superiori).
In questi casi si può usare l’opzione -o PubkeyAcceptedAlgorithms=ssh-dss per forzare il client ad usare chiavi di tipo DSS invece che RSA (sempre che il server le supporti). Oppure, solo sui client ssh di sistemi RedHat e derivati, si può usare l’opzione -o RSAMinSize=1024 per abbassare la lunghezza minima consentita della chiave ssh di tipo RSA.
Una volta trovate le opzioni necessarie per connettersi con un certo host, possiamo inserire tali opzioni nel file di configurazione ~/.ssh/config in modo da non doverle scrivere ogni volta. Nel file possiamo indicare le opzioni necessarie per ciascun host in questo modo:
Host vecchiopc.pd.infn.it
HostKeyAlgorithms +ssh-rsa,ssh-dss
Host vecchissimopc.pd.infn.it vecchissimopc altropc.miodominio.org
KexAlgorithms +diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
HostKeyAlgorithms +ssh-rsa,ssh-dss
Dopo la direttiva Host possono essere inseriti più nomi di host separati da spazi, o anche lo stesso host con e senza il dominio, in modo che la direttiva venga utilizzata indipendentemente da come scriviamo il nome dell’host sulla riga di comando.
Maggiori informazioni sulle opzioni disponibili da fornire al comando ssh o da inserire nel file di configurazione si possono trovare usando il comando “man ssh_config”.
Client vecchio, server nuovo
Può verificarsi anche la situazione inversa alla precedente, se utilizziamo un client datato per collegarci ad un server aggiornato con le ultime versioni di ssh:
[alice@vecchiopc ~]$ ssh nuovopc.pd.infn.it
no kex alg
In questo caso non abbiamo molte possibilità: il server rifiuta la connessione perché il nostro client utilizza algoritmi obsoleti. Normalmente non abbiamo modo di riconfigurare il server per consentire l’accesso anche con algoritmi vecchi e meno sicuri (cosa comunque non consigliabile). Quindi l’unico modo per risolvere il problema è aggiornare il client. Altrimenti, se ne abbiamo la possibilità, possiamo utilizzare un server intermedio che accetti la connessione dal nostro client vecchio e abbia a sua volta in dotazione un client abbastanza recente da essere accettato dal server sul quale vogliamo collegarci.