SSH funktioniert nach einem Server-Update nicht mehr? Was ist passiert?

9

Ich verwende seit über 10 Jahren PKI-basierte SSH-Verbindungen. Plötzlich, nach einem Server-Update, funktionierten einige Verbindungen nicht mehr. Ich verwende dieselben PKI-Schlüssel, die ich seit Jahren verwende (jeder Server hat seine eigenen Schlüssel, ich habe einen kleinen Satz persönlicher Schlüssel).

Arbeiten - sieht so aus:

C:\Users\michael>ssh2 -p 2222 [email protected] date
Authentication successful.
Fri Nov 25 10:30:42  2016

Nicht funktioniert sieht aus wie:

C:\Users\michael>ssh2 [email protected] date
warning: Authentication failed.
Disconnected; key exchange or algorithm negotiation failed (Algorithm negotiation failed.).

Was hat sich geändert?

Michael Filz
quelle
2
Wenn ich SSH aktualisiere oder neu konfiguriere, versuche ich im Allgemeinen sofort, eine andere SSH-Verbindung zu öffnen, während die aktuelle Verbindung zum Debuggen offen bleibt. Dieser Ansatz würde beim Debuggen in Szenarien wie Ihren helfen. Haben Sie noch Zugriff auf den Server? Oder versuchen Sie, dies von der Clientseite aus zu debuggen, ohne Zugriff auf serverseitige Protokolle zu haben, bis Sie das Problem gelöst haben?
Kasperd
1
Zum Glück hatte ich immer Zugriff auf den Server. Im Allgemeinen versuche ich beim Anwenden von Updates, "auf der Konsole" zu sein - aus Gründen, die Sie erwähnen. Was ich hier zeigen wollte, ist, wie man debuggt, wenn es für einige (z. B. neuer Kitt) funktioniert, aber nicht für andere (z. B. 14 Jahre alter SSH-Client, der keine verbesserten Chiffren-, Kex- und Mac-Algorithmen kennt.
Michael Felt

Antworten:

14

Nach einem Update können Nebenwirkungen auftreten. Bei OpenSSH ändern sich die Standardeinstellungen häufig. OpenBSD (die OpenSSH warten / entwickeln) hat die Richtlinie von OpenBSD, sich keine Gedanken über die Abwärtskompatibilität zu machen. Dies kann Dinge "zerbrechen", die, wie gelesen, gut funktionieren.

Es gibt einen massiven Hinweis - dass ich nicht bemerkt habe, als mir das zum ersten Mal passiert ist (über die GUI-Oberfläche, und ich habe es einfach weggeklickt und war 'wütend' auf 'dummes Update - neue Version ist kaputt'. Es stellt sich heraus, dass die neue Version war nicht kaputt - aber OpenBSD / OpenSSH beginnt mit dem Ändern der Standardeinstellungen für den Schlüsselaustausch ab OpenSSH-6.7p1. Siehe: http://www.openssh.com/txt/release-6.7 , insbesondere:

Änderungen seit OpenSSH 6.6

Potenziell inkompatible Änderungen

  • sshd (8): Der Standardsatz von Chiffren und MACs wurde geändert,
    um unsichere Algorithmen zu entfernen. Insbesondere sind CBC-Chiffren und arcfour *
    standardmäßig deaktiviert.

    Der vollständige Satz von Algorithmen bleibt verfügbar, wenn er
    explizit über die Optionen ciphers und MACs sshd_config konfiguriert wird .

Mein Problem ist, dass ich einen alten Client habe, der keine der neuen Standardeinstellungen hat, sodass keine Verbindung hergestellt werden kann.

Zwei Lösungspfade: Fix / Patch des Servers oder - Fix / Patch des Clients.

Serverlösung: Bringen Sie "alte" Einstellungen zurück, damit "alte" Clients weiterhin eine Verbindung herstellen können, dh - freundlich zu vorhandenen Clients - bearbeiten Sie die Datei sshd_config und fügen Sie (genug) der alten Chiffren zurück.

Die wichtigsten Zeilen zum Ändern / Hinzufügen in sshd_config sind:

ciphers aes128-ctr,aes192-ctr,aes256-ctr,[email protected],aes256-cbc
KexAlgorithms  [email protected],diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
macs hmac-sha2-256,hmac-sha2-512,hmac-sha1-96,hmac-sha1

Einfach hinzufügen:

# Ciphers
# The dafaults starting with OpenSSH 6.7 are:
# aes128-ctr,aes192-ctr,aes256-ctr,[email protected]
# older clients may need an older cipher, e.g.
# ciphers aes128-cbc,aes192-cbc,aes256-cbc,blowfish-cbc,arcfour
# only adding aes256-cbc as an "old" cipher

ciphers aes128-ctr,aes192-ctr,aes256-ctr,[email protected],aes256-cbc

# KEX Key Exchange algorithms
# default from openssh 6.7 are:
# [email protected],diffie-hellman-group-exchange-sha256,\
#  diffie-hellman-group14-sha1
# an older kex are: none,KexAlgorithms diffie-hellman-group1-sha1

# only adding diffie-hellman-group-sha1  as an "old" KEX
# and this should be deleted ASAP as it is clearly "one of the problems" with SSL based encryption
KexAlgorithms  [email protected],diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1

# MAC message authentification code
# the new defaults are:
# [email protected],[email protected],
# [email protected],hmac-sha2-512-
# [email protected],
# [email protected],[email protected],
# hmac-sha2-256,hmac-sha2-512

# older defaults (still supported) are:
# macs hmac-sha1,hmac-md5

# consider removing hmac-sha1-96,hmac-sha1,hmac-md5 "Soon!"
macs hmac-sha2-256,hmac-sha2-512,hmac-sha1-96,hmac-sha1

Lösung 2 - Reparieren / Ersetzen des Clients

Eine einfache Möglichkeit, um festzustellen, welche Chiffren Ihr aktueller Client unterstützt (unter der Annahme einer CLI), besteht darin, ssh -hfestzustellen, ob dies Folgendes bietet:

Supported ciphers:
  3des-cbc,aes256-cbc,aes192-cbc,aes128-cbc,blowfish-cbc,twofish-cbc,twofish256-cbc,twofish192-cbc,twofish128-cbc,[email protected],cast128-cbc,[email protected],arcfour,none
Supported MAC algorithms:
  hmac-md5,hmac-md5-96,hmac-sha1,hmac-sha1-96,[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],[email protected],none

Ein weiterer nützlicher Befehl ist: ssh -V

ssh2: SSH Secure Shell 3.2.9 Windows Client
Product: SSH Secure Shell for Workstations
License type: none (non-commercial)

Meiner - war - ein sehr alter Client - für meinen Desktop. Wenn Sie oben schauen, können Sie sehen, dass es keinen der - 15 Jahre später - bevorzugten Algorithmen unterstützt, nicht einmal einen -cbr (rotierend), nur -cbc (Blockkopie).

Wenn Ihr Client keine Option zur Bereitstellung der unterstützten Schlüssel usw. hat (OpenSSH sollte die Option haben -Q), stellen Sie einfach eine Verbindung zu sich selbst her, z. B. ssh -v localhostund es gibt Zeilen wie diese, die Ihnen mitteilen, dass bekannt ist:

debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug2: kex_parse_kexinit: ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-grousha1,diffie-hellman-group1-sha1
debug2: kex_parse_kexinit: [email protected],[email protected],[email protected],[email protected]@openssh.com,[email protected],[email protected],ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-rsa,ssh-dss
debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,[email protected]
...

Und was gefunden (und verwendet) wurde:

debug2: mac_setup: found hmac-sha1
debug1: kex: server->client aes128-ctr hmac-sha1 none
debug2: mac_setup: found hmac-sha1
debug1: kex: client->server aes128-ctr hmac-sha1 none

Extra: Debug-Informationen von einer fehlgeschlagenen Verbindung - weitere Details

Oder was versucht, aber verpasst wurde.

debug: OpenSSH: Major: 7 Minor: 3 Revision: 0
debug: Ssh2Transport: All versions of OpenSSH handle kex guesses incorrectly.
debug: Ssh2Transport: Algorithm negotiation failed for c_to_s_cipher: client list: aes128-cbc,3des-cbc,twofish128-cbc,cast128-cbc,twofish-cbc,blowfish-cbc,aes192-cbc,aes256-cbc,twofish192-cbc,twofish256-cbc,arcfour vs. server list : [email protected],aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected]
debug: Ssh2Transport: Algorithm negotiation failed for s_to_c_cipher: client list: aes128-cbc,3des-cbc,twofish128-cbc,cast128-cbc,twofish-cbc,blowfish-cbc,aes192-cbc,aes256-cbc,twofish192-cbc,twofish256-cbc,arcfour vs. server list : [email protected],aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected]
debug: Ssh2Transport: lang s to c: `', lang c to s: `'
debug: Ssh2Transport: Couldn't agree on kex or hostkey alg. (chosen_kex = NULL, chosen_host_key = ssh-rsa)
debug: Ssh2Common: DISCONNECT received: Algorithm negotiation failed.

Bearbeiten: hinzugefügt am 02. Januar 2017

Neuer Abschnitt - Was ist mit Schlüsseln, die nicht mehr funktionieren?

Auf meinem Server sind ein "alter" Client und der "neueste" Client installiert - und es wird ein anderes Verhalten beim Herstellen einer Verbindung zu einem Server angezeigt. Hier geht es nicht um Verschlüsselungsfehler, sondern um die Verwendung eines archaischen PKI-Paares - basierend auf DSA.

Kurz gesagt, openssh-7 (.3) sendet keine öffentlichen DSA-Schlüssel mehr (standardmäßig, möglicherweise überhaupt nicht).

Unten vergleiche ich die Ausgabe von zwei Versionen von openssh
/ usr / bin / ssh (alte Version, linke Seite) und
/ opt / bin / ssh (neue Version, rechte Seite) - der Befehl lautet:

${version}/ssh -v user@host date

Ich hoffe, Sie bemerken beim Durchsuchen der folgenden Ausgabe, dass die Schritte und Meldungen im Allgemeinen gleich sind. Der Hauptunterschied kommt nach der Zeichenfolge SSH2_MSG_SERVICE_ACCEPT

Ich möchte, dass Sie feststellen, dass die alte Version das DSA-basierte Schlüsselpaar bietet (und vom "alten" Server akzeptiert wird -, während der neue Server niemals den DSA-basierten Schlüssel anbietet.

Hinweis: Die "Lösung" hierfür besteht darin, (mindestens eines der) PKA-Paare auf der Basis von rsa, ecdsa oder ed25519 hinzuzufügen.

OpenSSH_6.0p1, OpenSSL 1.0.2h  3 May 2016                     | OpenSSH_7.3p1, OpenSSL 1.0.2h  3 May 2016
debug1: Reading configuration data /etc/ssh/ssh_config        | debug1: Reading configuration data /var/openssh/etc/ssh_confi
debug1: Failed dlopen: /usr/krb5/lib/libkrb5.a(libkrb5.a.so): <
        0509-026 System error: A file or directory in the pat <
                                                              <
debug1: Error loading Kerberos, disabling Kerberos auth.      <
debug1: Connecting to x061 [192.168.129.61] port 22.            debug1: Connecting to x061 [192.168.129.61] port 22.
debug1: Connection established.                                 debug1: Connection established.
debug1: identity file /home/michael/.ssh/id_rsa type 1          debug1: identity file /home/michael/.ssh/id_rsa type 1
                                                              > debug1: key_load_public: No such file or directory
debug1: identity file /home/michael/.ssh/id_rsa-cert type -1    debug1: identity file /home/michael/.ssh/id_rsa-cert type -1
debug1: identity file /home/michael/.ssh/id_dsa type 2          debug1: identity file /home/michael/.ssh/id_dsa type 2
                                                              > debug1: key_load_public: No such file or directory
debug1: identity file /home/michael/.ssh/id_dsa-cert type -1    debug1: identity file /home/michael/.ssh/id_dsa-cert type -1
debug1: identity file /home/michael/.ssh/id_ecdsa type 3        debug1: identity file /home/michael/.ssh/id_ecdsa type 3
                                                              > debug1: key_load_public: No such file or directory
debug1: identity file /home/michael/.ssh/id_ecdsa-cert type -   debug1: identity file /home/michael/.ssh/id_ecdsa-cert type -
debug1: Remote protocol version 2.0, remote software version  | debug1: key_load_public: No such file or directory
debug1: match: OpenSSH_6.0 pat OpenSSH*                       | debug1: identity file /home/michael/.ssh/id_ed25519 type -1
                                                              > debug1: key_load_public: No such file or directory
                                                              > debug1: identity file /home/michael/.ssh/id_ed25519-cert type
debug1: Enabling compatibility mode for protocol 2.0            debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.0              | debug1: Local version string SSH-2.0-OpenSSH_7.3
                                                              > debug1: Remote protocol version 2.0, remote software version
                                                              > debug1: match: OpenSSH_6.0 pat OpenSSH* compat 0x04000000
                                                              > debug1: Authenticating to x061:22 as 'padmin'
debug1: SSH2_MSG_KEXINIT sent                                   debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received                               debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none          | debug1: kex: algorithm: ecdh-sha2-nistp256
debug1: kex: client->server aes128-ctr hmac-md5 none          | debug1: kex: host key algorithm: ssh-rsa
                                                              > debug1: kex: server->client cipher: aes128-ctr MAC: umac-64@o
                                                              > debug1: kex: client->server cipher: aes128-ctr MAC: umac-64@o
debug1: sending SSH2_MSG_KEX_ECDH_INIT                          debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY                       debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: RSA 9f:0a:4d:a8:1b:ba:e6:d4:1a:b2:cd | debug1: Server host key: ssh-rsa SHA256:ORf5UVI7mRm/9MthM2qXM
debug1: Host 'x061' is known and matches the RSA host key.      debug1: Host 'x061' is known and matches the RSA host key.
debug1: Found key in /home/michael/.ssh/known_hosts:57          debug1: Found key in /home/michael/.ssh/known_hosts:57
debug1: ssh_rsa_verify: signature correct                     | debug1: rekey after 4294967296 blocks
debug1: SSH2_MSG_NEWKEYS sent                                   debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS                              debug1: expecting SSH2_MSG_NEWKEYS
                                                              > debug1: rekey after 4294967296 blocks
debug1: SSH2_MSG_NEWKEYS received                               debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server                         | debug1: Skipping ssh-dss key /home/michael/.ssh/id_dsa - not
debug1: SSH2_MSG_SERVICE_REQUEST sent                         <
debug1: SSH2_MSG_SERVICE_ACCEPT received                        debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password   debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey                   debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/michael/.ssh/id_rsa      debug1: Offering RSA public key: /home/michael/.ssh/id_rsa
debug1: Authentications that can continue: publickey,password   debug1: Authentications that can continue: publickey,password
debug1: Offering DSA public key: /home/michael/.ssh/id_dsa    | debug1: Offering ECDSA public key: /home/michael/.ssh/id_ecds
debug1: Server accepts key: pkalg ssh-dss blen 433            | debug1: Authentications that can continue: publickey,password
debug1: read PEM private key done: type DSA                   | debug1: Trying private key: /home/michael/.ssh/id_ed25519
debug1: Authentication succeeded (publickey).                 | debug1: Next authentication method: keyboard-interactive
Authenticated to x061 ([192.168.129.61]:22).                  | debug1: Authentications that can continue: publickey,password
debug1: channel 0: new [client-session]                       | debug1: Next authentication method: password
debug1: Requesting [email protected]               | padmin@x061's password:
debug1: Entering interactive session.                         |
Michael Filz
quelle
Ich hatte auch Benutzer hier, die sich über Schlüssel mit veralteten Protokollen beschwerten, als ich auf Debian 8 aktualisierte.
Rui F Ribeiro
1
Ich vergaß zu erwähnen - , dass für meine Fenster ich Kitt eingeschaltet (ssh.com verkauft nur an Unternehmen) - mit geblieben wäre , ssh2wenn sie mich akzeptiert hätten - vor allem für die Leichtigkeit des Tuns scpTransfer vom selben Fenster wiessh
Michael Felt
1
Aktualisieren Sie Ihren Client, anstatt jahrelange Clients zu verwenden und möglicherweise fehlerhafte Algorithmen zu aktivieren.
Jakuje
1
Siehe Aktualisieren Sie Ihre SSH-Schlüssel! Für weitere Details, aber wie @Jakuje sagt, ist es eine schlechte Idee, alte Schlüssel, alte Clients und alte Algorithmen beizubehalten.
Stephen Kitt
Das Alter des Schlüssels ist kein Problem, imho - sondern die Art und Größe. "DSA" ist aus, "RSA" mindestens 2048-Bit. "Besser" ist ecdsa. Wie @Jakuje erwähnt - und worum es in diesen Fragen und Antworten geht -, aktualisieren Sie Clients - aber aktualisieren Sie auch die Standardeinstellungen. Als Client können Sie verlangen, dass ein Server bessere Algorithmen verwendet, indem er keine schwachen (schlimmer kaputten) anbietet.
Michael Filz