O SSH parou de funcionar após uma atualização do servidor? O que aconteceu?


9

Uso conexões SSH baseadas em PKI há mais de 10 anos. De repente, após uma atualização do servidor - algumas das conexões pararam de funcionar. Estou usando as mesmas chaves PKI que utilizo há anos (cada servidor tem suas próprias chaves, tenho um pequeno conjunto de chaves pessoais).

Trabalhando - fica assim:

C:\Users\michael>ssh2 -p 2222 root@192.168.129.64 date
Authentication successful.
Fri Nov 25 10:30:42  2016

Não funcionar se parece com:

C:\Users\michael>ssh2 root@192.168.129.64 date
warning: Authentication failed.
Disconnected; key exchange or algorithm negotiation failed (Algorithm negotiation failed.).

O que mudou?


2
Sempre que atualizo ou reconfiguro o SSH, geralmente tento abrir outra conexão SSH imediatamente, deixando a conexão atual aberta para depuração. Essa abordagem ajudaria na depuração em cenários como o seu. Você ainda tem acesso ao servidor? Ou você está tentando depurar isso do lado do cliente sem acesso para examinar os logs do lado do servidor até resolver o problema?
kasperd

1
Eu sempre tive acesso ao servidor, felizmente. Geralmente, ao aplicar atualizações, tento estar 'no console' - por razões como você mencionou. O que tentei mostrar aqui é como depurar quando funciona para alguns (por exemplo, massa recente), mas não para outros (por exemplo, cliente ssh de 14 anos que não conhece algoritmos de cifras, kex e mac aprimorados.
Michael Felt

Respostas:


14

Após uma atualização - efeitos colaterais podem entrar em jogo. Com o OpenSSH - os padrões mudam frequentemente. O OpenBSD (que mantém / desenvolve o OpenSSH) possui uma política do OpenBSD para não se preocupar com a compatibilidade com versões anteriores. Isso pode "quebrar" coisas que, leram, estão funcionando bem.

Há uma dica enorme - que eu não percebi quando isso aconteceu comigo (usando a interface GUI, e apenas cliquei nela e 'fiquei brava' com 'atualização estúpida - nova versão está quebrada'. não foi quebrado - mas o OpenBSD / OpenSSH começou a alterar os padrões de troca de chaves começando com o OpenSSH-6.7p1, consulte: http://www.openssh.com/txt/release-6.7 , notadamente:

Alterações desde o OpenSSH 6.6

Alterações potencialmente incompatíveis

  • sshd (8): o conjunto padrão de cifras e MACs foi alterado para
    remover algoritmos não seguros. Em particular, cifras CBC e arcfour *
    são desativados por padrão.

    O conjunto completo de algoritmos permanece disponível se configurado
    explicitamente através das opções sshd_config de Ciphers e MACs.

Meu problema é que tenho um cliente antigo que não possui nenhum dos novos padrões e, portanto, ele não pode se conectar.

Dois caminhos de solução: conserte / conserte o servidor ou - conserte / conserte o cliente.

Solução de servidor: retorne as configurações "antigas" para que clientes "antigos" possam continuar se conectando, o que é amigável aos clientes existentes - edite o arquivo sshd_config e adicione novamente (o suficiente) as cifras antigas.

As principais linhas a serem alteradas / adicionadas no sshd_config são:

ciphers aes128-ctr,aes192-ctr,aes256-ctr,chacha20-poly1305@openssh.com,aes256-cbc
KexAlgorithms  curve25519-sha256@libssh.org,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

Basta adicionar:

# Ciphers
# The dafaults starting with OpenSSH 6.7 are:
# aes128-ctr,aes192-ctr,aes256-ctr,chacha20-poly1305@openssh.com
# 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,chacha20-poly1305@openssh.com,aes256-cbc

# KEX Key Exchange algorithms
# default from openssh 6.7 are:
# curve25519-sha256@libssh.org,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  curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1

# MAC message authentification code
# the new defaults are:
# umac-64-etm@openssh.com,umac-128-etm@openssh.com,
# hmac-sha2-256-etm@openssh.com,hmac-sha2-512-
# etm@openssh.com,
# umac-64@openssh.com,umac-128@openssh.com,
# 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

Solução 2 - corrigir / substituir o cliente

Uma maneira fácil de ver quais cifras o seu cliente atual suporta (assumindo a CLI) ssh -he ver se isso fornece algo como:

Supported ciphers:
  3des-cbc,aes256-cbc,aes192-cbc,aes128-cbc,blowfish-cbc,twofish-cbc,twofish256-cbc,twofish192-cbc,twofish128-cbc,des-cbc@ssh.com,cast128-cbc,rc2-cbc@ssh.com,arcfour,none
Supported MAC algorithms:
  hmac-md5,hmac-md5-96,hmac-sha1,hmac-sha1-96,hmac-sha256@ssh.com,hmac-sha256-96@ssh.com,hmac-ripemd160@ssh.com,hmac-ripemd160-96@ssh.com,hmac-tiger128@ssh.com,hmac-tiger128-96@ssh.com,hmac-tiger160@ssh.com,hmac-tiger160-96@ssh.com,hmac-tiger192@ssh.com,hmac-tiger192-96@ssh.com,none

Outro comando útil é: ssh -V

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

O meu - era - um cliente muito antigo - para o meu desktop. Olhando acima, você pode ver que ele não suporta nenhum dos algoritmos preferidos - 15 anos depois -, nem mesmo um -cbr (rotativo), apenas -cbc (cópia em bloco).

Se o seu cliente não tiver a opção de fornecer as chaves, etc. suportadas (o OpenSSH deve ter a opção -Q), basta iniciar uma conexão ssh -v localhostconsigo mesmo, por exemplo, e existem linhas como esta para informar o que você sabe:

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: ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.ssh-dss-cert-v01@openssh.com,ssh-rsa-cert-v00@openssh.com,ssh-dss-cert-v00@openssh.com,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,rijndael-cbc@lysatiu.se
...

E o que foi encontrado (e usado):

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: informações de depuração de uma conexão com falha - mais detalhes

Ou, o que foi tentado, mas errou.

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 : chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
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 : chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
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: adicionado 02/01/2017

Nova seção - e as chaves que param de funcionar?

No meu servidor, tenho um cliente 'antigo' e o cliente 'mais recente' instalado - e obtenho um comportamento diferente ao conectar-me a um servidor. Aqui, o problema não é uma correspondência incorreta de cifra - mas o uso de um par PKI arcaico - baseado no DSA.

Em resumo, o openssh-7 (.3) não envia mais (por padrão, talvez nem seja) chaves públicas DSA.

Abaixo, comparo a saída de duas versões do openssh
/ usr / bin / ssh (versão antiga, lado esquerdo) e
/ opt / bin / ssh (nova versão, lado direito) - o comando é:

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

À medida que você escaneia a saída abaixo, espero que você observe que as etapas e mensagens são geralmente as mesmas. A principal diferença ocorre após a sequência SSH2_MSG_SERVICE_ACCEPT

O que quero que você observe é que a versão antiga oferece (e é aceita pelo servidor 'antigo' - o par de chaves baseado em DSA, enquanto o novo servidor nunca oferece a chave baseada em DSA.

Nota: a 'solução' para isso é adicionar (pelo menos um) pares de PKI baseados em rsa, ecdsa ou 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 no-more-sessions@openssh.com               | padmin@x061's password:
debug1: Entering interactive session.                         |

Eu também tive usuários aqui reclamando sobre teclas com protocolos obsoletos por vez, o que eu atualizado para Debian 8.
Rui F Ribeiro

1
Esqueci de mencionar - que, para minhas janelas, mudei para massa (ssh.com só vende para empresas) - teria ficado com ssh2elas se me aceitassem - principalmente pela facilidade de fazer scptransferências da mesma janela quessh
Michael Felt

1
Atualize seu cliente em vez de usar anos de clientes antigos e ativar algoritmos possivelmente quebrados.
Jakuje 25/11/16

1
Consulte Atualize suas chaves SSH! para mais detalhes, mas como @Jakuje diz, é uma má idéia manter chaves antigas, clientes antigos e algoritmos antigos.
Stephen Kitt

a idade da chave não é um problema, imho - mas o tipo e tamanho. "DSA" está fora, "RSA" pelo menos 2048 bits. 'Melhor' é ecdsa. Como o @Jakuje menciona - e sobre o que é este Q&A - atualiza os clientes - mas também atualiza os padrões. Como cliente, você pode "exigir" que um servidor use algoritmos melhores, ao não oferecer algoritmos fracos (piores).
Michael Felt
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.