OpenSSH 6.6 이후 변경 사항

OpenSSH 6.6 이후 변경 사항

저는 10년 넘게 PKI 기반 SSH 연결을 사용해 왔습니다. 갑자기 서버 업데이트 후 일부 연결이 작동을 멈췄습니다. 저는 수년 동안 사용해 온 것과 동일한 PKI 키를 사용하고 있습니다(각 서버에는 자체 키가 있고 작은 개인 키 세트가 있습니다).

작업 중 - 다음과 같습니다.

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

작동하지 않는 모습은 다음과 같습니다.

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

무엇이 바뀌었나요?

답변1

업데이트 후 - 부작용이 발생할 수 있습니다. OpenSSH 사용 - 기본값이 자주 변경됩니다. OpenSSH를 유지/개발하는 OpenBSD에는 이전 버전과의 호환성을 고려하지 않는다는 OpenBSD 정책이 있습니다. 이는 잘 작동하는 것을 "중단"할 수 있습니다.

한 가지 중요한 팁 - 처음에는 이런 일이 발생했다는 사실을 눈치채지 못했습니다(GUI 인터페이스를 사용하여 방금 클릭했는데 "멍청한 업데이트 - 새 버전이 깨졌습니다"에 대해 "화가 났습니다". 알고 보니 새 버전이었습니다. 깨지지 않았지만 OpenBSD/OpenSSH는 OpenSSH-6.7p1부터 키 교환 기본값을 변경하기 시작했습니다. 다음을 참조하세요.http://www.openssh.com/txt/release-6.7, 주목할 가치가 있습니다.

OpenSSH 6.6 이후 변경 사항

잠재적으로 호환되지 않는 변경사항

  • sshd(8):
    안전하지 않은 알고리즘을 제거하기 위해 기본 암호 및 MAC 세트가 변경되었습니다. 특히 CBC 암호와 arcfour*는
    기본적으로 비활성화되어 있습니다.


    Ciphers 및 MAC sshd_config 옵션을 통해 명시적으로 구성된 경우 전체 알고리즘 세트를 계속 사용할 수 있습니다.

제 문제는 새로운 기본 설정이 전혀 없어 연결할 수 없는 오래된 클라이언트가 있다는 것입니다.

두 가지 솔루션 경로: 서버 복구/패치 또는 클라이언트 복구/패치.

서버 솔루션: "이전" 클라이언트가 계속 연결할 수 있도록 "이전" 설정을 복원합니다. 즉, 기존 클라이언트에 친숙합니다. sshd_config 파일을 편집하고 (충분한) 이전 비밀번호를 다시 추가합니다.

sshd_config에서 변경/추가할 주요 라인은 다음과 같습니다:

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

다음을 추가하세요.

# 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

해결 방법 #2 - 클라이언트 복구/교체

현재 클라이언트가 지원하는 암호(CLI 가정)를 확인하는 쉬운 방법은 ssh -h다음과 같은 것이 제공되는지 확인하는 것입니다.

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

또 다른 유용한 명령은 다음과 같습니다.ssh -V

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

내 것은 아주 오래된 클라이언트입니다. 내 데스크톱용입니다. 위를 보면 15년 동안 선호되는 알고리즘을 전혀 지원하지 않고 -cbr(회전)도 지원하지 않고 -cbc(블록 복사)만 지원한다는 것을 알 수 있습니다.

클라이언트가 지원되는 키(OpenSSH에는 options 가 있어야 함 -Q)와 같은 옵션을 제공하지 않는 경우 예를 들어 자신에 대한 연결을 시작 ssh -v localhost하고 다음과 같은 줄에서 이미 알고 있는 내용을 알려줍니다.

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

그리고 무엇을 발견하고 사용할 것인가:

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

추가: 실패한 연결의 디버그 정보 - 자세한 내용

또는 시도했지만 놓쳤습니다.

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.

편집: 2017년 1월 2일에 추가됨

새로운 섹션 - 작동하지 않는 키는 어떻게 해야 하나요?

내 서버에는 "이전" 클라이언트와 "최신" 클라이언트가 설치되어 있습니다. 서버에 연결할 때 동작이 다릅니다. 여기서 문제는 비밀번호가 일치하지 않는다는 것이 아닙니다.고대의DSA를 기반으로 하는 PKI 쌍입니다.

즉, openssh-7(.3)은 더 이상 DSA 공개 키를 보내지 않습니다(기본적으로 전혀 보내지 않을 수도 있음).


아래에서는 openssh /usr/bin/ssh(이전 버전, 왼쪽)와 /opt/bin/ssh(새 버전, 오른쪽)의 두 가지 버전의 출력을 비교했습니다
. 명령은 다음과 같습니다.

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

아래 출력을 살펴보면서 단계와 메시지가 일반적으로 동일하다는 것을 알 수 있기를 바랍니다. 주요 차이점은 문자열 뒤에 있다는 것입니다.SSH2_MSG_SERVICE_ACCEPT

제가 주목하고 싶은 점은 이전 버전에서는 DSA 기반 키 쌍을 제공했지만("이전" 서버에서 허용함) 새 서버에서는 DSA 기반 키를 제공하지 않는다는 것입니다.

참고: "해결책"은 rsa, ecdsa 또는 ed25519를 기반으로 PKI 쌍(중 하나 이상)을 추가하는 것입니다.

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

관련 정보