¿SSH dejó de funcionar después de una actualización del servidor? ¿Que pasó?

9

He estado usando conexiones SSH basadas en PKI por más de 10 años. De repente, después de una actualización del servidor, algunas de las conexiones dejaron de funcionar. Estoy usando las mismas claves PKI que he usado durante años (cada servidor tiene sus propias claves, tengo un pequeño conjunto de claves personales).

Trabajando - se ve así:

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

No funciona parece que:

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

¿Qué cambió?

Michael sintió
fuente
2
Cada vez que actualizo o vuelvo a configurar SSH, generalmente intento inmediatamente abrir otra conexión SSH mientras dejo la conexión actual abierta para la depuración. Ese enfoque ayudaría con la depuración en escenarios como el suyo. ¿Todavía tienes acceso al servidor? ¿O está intentando depurar esto desde el lado del cliente sin acceso para mirar los registros del lado del servidor hasta que haya resuelto el problema?
kasperd el
1
Siempre he tenido acceso al servidor, afortunadamente. En general, cuando aplico actualizaciones trato de estar 'en la consola', por razones como usted menciona. Lo que traté de mostrar aquí es cómo depurar cuando funciona para algunos (p. Ej., Masilla reciente), pero no para otros (p. Ej., Cliente ssh de 14 años que no conoce cifrados mejorados, algoritmos kex y mac.
Michael Felt

Respuestas:

14

Después de una actualización, los efectos secundarios pueden entrar en juego. Con OpenSSH, los valores predeterminados cambian con frecuencia. OpenBSD (que mantiene / desarrolla OpenSSH) tiene una política de OpenBSD para no preocuparse por la compatibilidad con versiones anteriores. Esto puede "romper" las cosas que, según leyeron, funcionan bien.

Hay una pista masiva: que no me di cuenta cuando esto me sucedió por primera vez (usando la interfaz GUI, y simplemente hice clic y 'estaba enojado' con 'actualización estúpida: la nueva versión está rota'. Resulta que la nueva versión no estaba roto, pero OpenBSD / OpenSSH comenzó a cambiar los valores predeterminados de intercambio de claves a partir de OpenSSH-6.7p1, consulte: http://www.openssh.com/txt/release-6.7 , notablemente:

Cambios desde OpenSSH 6.6

Cambios potencialmente incompatibles

  • sshd (8): el conjunto predeterminado de cifrados y MAC se ha modificado para
    eliminar algoritmos inseguros. En particular, los cifrados CBC y arcfour *
    están deshabilitados por defecto.

    El conjunto completo de algoritmos permanece disponible si se configura
    explícitamente a través de las opciones Ciphers y MAC sshd_config.

Mi problema es que tengo un cliente antiguo que no tiene ninguno de los nuevos valores predeterminados, por lo que no se puede conectar.

Dos vías de solución: arreglar / parchar el servidor o - arreglar / parchar el cliente.

Solución de servidor: recupere la configuración "antigua" para que los clientes "antiguos" puedan continuar conectándose, es decir, amigable con los clientes existentes, edite el archivo sshd_config y agregue (suficiente) los cifrados antiguos.

Las líneas clave para cambiar / agregar en sshd_config son:

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

Solo agrega:

# 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

Solución n. ° 2: arreglar / reemplazar el cliente

Una manera fácil de ver qué cifrados admite su cliente actual (suponiendo CLI) ssh -hy ver si eso proporciona algo como:

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

Otro comando útil es: ssh -V

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

El mío era un cliente muy antiguo para mi escritorio. Mirando arriba, puede ver que no admite ninguno de los algoritmos preferidos, 15 años después, ni siquiera uno -cbr (rotativo), solo -cbc (copia en bloque).

Si su cliente no tiene una opción para proporcionar las claves, etc. compatibles (OpenSSH debería tener la opción -Q), simplemente inicie una conexión con usted mismo, por ejemplo, ssh -v localhosty hay líneas como esta para decirle que se sabe qué:

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]
...

Y lo que se encontró (y se usó):

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: información de depuración de una conexión fallida - más detalles

O, lo que se intentó, pero falló.

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.

Editar: agregado 02-ene-2017

Nueva sección: ¿qué pasa con las teclas que dejan de funcionar?

En mi servidor tengo un cliente 'antiguo' y el cliente 'más reciente' instalados, y obtengo un comportamiento diferente al conectarse a un servidor. Aquí el problema no son los errores de coincidencia de cifrado, sino el uso de un par PKI arcaico , basado en DSA.

En resumen, openssh-7 (.3) ya no envía (por defecto, tal vez en absoluto) claves públicas DSA.

A continuación, comparo el resultado de dos versiones de openssh
/ usr / bin / ssh (versión anterior, lado izquierdo) y
/ opt / bin / ssh (nueva versión, lado derecho): el comando es:

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

A medida que escanea a través de la salida a continuación, espero que note que los pasos y los mensajes son generalmente los mismos. La diferencia clave viene después de la cadena SSH2_MSG_SERVICE_ACCEPT

Lo que quiero que note es que la versión anterior ofrece (y es aceptada por el servidor 'antiguo', el par de claves basado en DSA, mientras que el nuevo servidor nunca ofrece la clave basada en DSA.

Nota: la 'solución' para esto es agregar (al menos uno de) los pares PKI basados ​​en rsa, ecdsa o ed25519.

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 sintió
fuente
También tuve usuarios aquí quejándose de claves con protocolos obsoletos cuando actualicé a Debian 8.
Rui F Ribeiro
1
Me olvidé de mencionar - que por mis ventanas que me pasa a masilla (ssh.com sólo vende a las empresas) - habría quedado con ssh2si me habrían aceptado - principalmente para la facilidad de hacer scptransferencias desde la misma ventana quessh
Michael sintió
1
Actualice su cliente en lugar de usar clientes antiguos y habilitar algoritmos posiblemente rotos.
Jakuje el
1
Consulte ¡ Actualice sus claves SSH! para más detalles, pero como dice @Jakuje, es una mala idea mantener claves antiguas, clientes antiguos y algoritmos antiguos.
Stephen Kitt el
La edad de la clave no es un problema, en mi opinión, sino el tipo y el tamaño. "DSA" está fuera, "RSA" al menos 2048 bits. 'Mejor' es ecdsa. Como @Jakuje menciona, y de qué se trata este Q&A, actualiza a los clientes, pero también actualiza los valores predeterminados. Como cliente, puede 'exigir' que un servidor use mejores algoritmos al no ofrecer los débiles (peor rotos).
Michael sintió el