Gần đây chúng tôi đã áp dụng một bản vá do nhà cung cấp cung cấp cho OpenSSH. Bản vá này đã vô hiệu hóa một vài giao thức trao đổi quan trọng để đối phó với cuộc tấn công Logjam gần đây. Sau khi áp dụng bản vá này, chúng tôi có một vài nhà cung cấp mà chúng tôi không thể trao đổi các tệp qua sftp vì việc đàm phán kết nối không thành công (có thể do thuật toán trao đổi khóa không dùng nữa).
Tôi chỉ muốn xác minh một vài điều chúng ta đang thấy trước khi nói chuyện với các nhà cung cấp của chúng tôi. Đây là phiên SSH mẫu với một trong những nhà cung cấp có vấn đề (đã thêm số dòng):
# ssh -vv user@host.domain.com
01 OpenSSH_6.2p2, OpenSSL 0.9.8j-fips 07 Jan 2009
02 debug1: Reading configuration data /etc/ssh/ssh_config
03 debug1: /etc/ssh/ssh_config line 20: Applying options for *
04 debug2: ssh_connect: needpriv 0
05 debug1: Connecting to host.domain.com [1.2.3.4] port 22.
06 debug1: Connection established.
07 debug1: permanently_set_uid: 0/0
08 debug1: identity file /root/.ssh/id_rsa type -1
09 debug1: identity file /root/.ssh/id_rsa-cert type -1
10 debug1: identity file /root/.ssh/id_dsa type -1
11 debug1: identity file /root/.ssh/id_dsa-cert type -1
12 debug1: identity file /root/.ssh/id_ecdsa type -1
13 debug1: identity file /root/.ssh/id_ecdsa-cert type -1
14 debug1: Enabling compatibility mode for protocol 2.0
15 debug1: Local version string SSH-2.0-OpenSSH_6.2
16 debug1: Remote protocol version 2.0, remote software version GXSSSHD_Comments
17 debug1: no match: GXSSSHD_Comments
18 debug2: fd 3 setting O_NONBLOCK
19 debug1: SSH2_MSG_KEXINIT sent
20 debug1: SSH2_MSG_KEXINIT received
21 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-group14-sha1,diffie-hellman-group1-sha1
22 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.com,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
23 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@lysator.liu.se
24 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@lysator.liu.se
25 debug2: kex_parse_kexinit: hmac-md5-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-ripemd160-etm@openssh.com,hmac-sha1-96-etm@openssh.com,hmac-md5-96-etm@openssh.com,hmac-md5,hmac-sha1,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96
26 debug2: kex_parse_kexinit: hmac-md5-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-ripemd160-etm@openssh.com,hmac-sha1-96-etm@openssh.com,hmac-md5-96-etm@openssh.com,hmac-md5,hmac-sha1,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96
27 debug2: kex_parse_kexinit: none,zlib@openssh.com,zlib
28 debug2: kex_parse_kexinit: none,zlib@openssh.com,zlib
29 debug2: kex_parse_kexinit:
30 debug2: kex_parse_kexinit:
31 debug2: kex_parse_kexinit: first_kex_follows 0
32 debug2: kex_parse_kexinit: reserved 0
33 debug2: kex_parse_kexinit: diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256
34 debug2: kex_parse_kexinit: ssh-dss,ssh-rsa
35 debug2: kex_parse_kexinit: aes128-cbc,3des-ctr,aes128-ctr,3des-cbc,blowfish-cbc,arcfour,arcfour128
36 debug2: kex_parse_kexinit: aes128-cbc,3des-ctr,aes128-ctr,3des-cbc,blowfish-cbc,arcfour,arcfour128
37 debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,hmac-md5-96,hmac-sha1-96,hmac-sha256,hmac-sha256@ssh.com
38 debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,hmac-md5-96,hmac-sha1-96,hmac-sha256,hmac-sha256@ssh.com
39 debug2: kex_parse_kexinit: none,zlib
40 debug2: kex_parse_kexinit: none,zlib
41 debug2: kex_parse_kexinit:
42 debug2: kex_parse_kexinit:
43 debug2: kex_parse_kexinit: first_kex_follows 0
44 debug2: kex_parse_kexinit: reserved 0
45 debug2: mac_setup: found hmac-md5
46 debug1: kex: server->client aes128-ctr hmac-md5 none
47 debug2: mac_setup: found hmac-md5
48 debug1: kex: client->server aes128-ctr hmac-md5 none
49 debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1536<3072<8192) sent
50 debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
51 DH_GEX group out of range: 1536 !< 1024 !< 8192`
Vì vậy, trong quá trình đàm phán trao đổi khóa, khách hàng và máy chủ trao đổi danh sách các thuật toán được hỗ trợ của họ (dòng 21 và 33). Họ đồng ý sử dụng trận đấu đầu tiên được tìm thấy trong hai danh sách, trong trường hợp này diffie-hellman-group-exchange-sha1
. Theo tôi hiểu, thuật toán này hỗ trợ một phạm vi độ dài bit mà máy khách và máy chủ sau đó phải thương lượng. Trong những trường hợp bình thường, client và server đồng ý trên một chiều dài bit và phím trao đổi cách sử dụng một thủ DH từ moduli
tập tin, ví dụ /etc/ssh/moduli
(Tôi biết tuyên bố cuối cùng này là rất "speak cư sĩ tại gia", nhưng đó là xấp xỉ dài và ngắn nó).
Trong trường hợp này, những gì tôi nghĩ rằng tôi đang thấy là cuộc đàm phán dài bit đang thất bại. Trên dòng 49, ứng dụng khách (tôi) đang nói "Tôi hỗ trợ độ dài bit trong khoảng từ 1536 đến 8192 và muốn sử dụng 3072 bit". Tuy nhiên, máy chủ trả lời lại và nói "Tôi chỉ hỗ trợ 1024 bit." Tại thời điểm đó, khách hàng bỏ cuộc và nói "Tôi không thể nói chuyện với bạn." Đây có phải là một mô tả hợp lý về những gì đang xảy ra ở đây?
Theo tôi hiểu, vấn đề hoàn toàn nằm ở phần cuối máy chủ vào thời điểm này (giả sử chúng ta không đàm phán một thuật toán yếu hơn như thế nào diffie-hellman-group1-sha1
). Máy chủ sẽ phải được sửa đổi để hỗ trợ độ dài bit lớn hơn trong quá trình trao đổi khóa.
Tôi muốn chắc chắn rằng tôi hiểu chính xác điều này trước khi tiếp tục. Đầu vào được đánh giá cao.