1. 程式人生 > >Linux SSH建立連線過程分析

Linux SSH建立連線過程分析



SSH建立連線的過程主要分為下面幾個階段:

  1. SSH協議版本協商階段。SSH目前包括SSH1SSH2兩個大版本。
  2. 金鑰和演算法協商階段,SSH支援多種加密演算法,雙方根據自己和對端支援的演算法進行協商,最終決定要使用的演算法。
  3. 認證階段,伺服器對客戶端進行身份驗證。
  4. 會話請求階段,完成認證後,客戶端會向伺服器端傳送會話請求。
  5. 互動會話階段,會話請求通過後,伺服器端和客戶端進行資訊的互動。

1)SSH協議版本協商階段:

  1. 客戶端通過TCP三次握手與伺服器的SSH埠建立TCP連線。
  2. 伺服器通過建立好的連線向客戶端傳送一個包含SSH版本資訊的報文,格式為“SSH-<SSH協議大版本號>.<SSH
    協議小版本號>-<軟體版本號>”,軟體版本號主要用於除錯。
  3. 客戶端收到版本號資訊後,如果伺服器使用的協議版本號低於自己的,但是客戶端能夠相容這個低版本的SSH協議,則就使用這個版本進行通訊。否則,客戶端會使用自己的版本號。
  4. 客戶端將自己決定使用的版本號發給伺服器,伺服器判斷客戶端使用的版本號自己是否支援,從而決定是否能夠繼續完成SSH連線。
  5. 如果協商成功,則進入金鑰和演算法協商階段。

2)金鑰和演算法協商階段:

  1. 伺服器端和客戶端分別傳送演算法協商報文給對端,報文中包含自己支援的公鑰演算法列表,加密演算法列表,MACMessage Authentication Code,訊息驗證碼)演算法列表,壓縮演算法列表等。
  2. 和版本協商階段類似,伺服器端和客戶端根據自己和對端支援的演算法來決定最終要使用的各個演算法。
  3. 伺服器端和客戶端利用Diffie-Hellman金鑰交換演算法,主機金鑰對等引數,生成共享金鑰和會話ID。會話金鑰用於在後續的通訊過程中兩端對傳輸的資料進行加密和解密,而會話ID用於認證過程。

3)認證階段:

  1. 客戶端向伺服器端傳送認證請求,請求中包含使用者名稱,認證方法,密碼或金鑰。
  2. 伺服器端對客戶端進行認證,如果認證失敗,則向客戶端傳送失敗訊息,其中包含可以再次認證的方法列表。
  3. 客戶端再次使用支援的認證方法中的一種進行認證,直到達到認證次數上限被伺服器終止連線,或者認證成功為止。

SSH支援的兩種認證方式:

  1. 密碼認證:客戶端通過使用者名稱/密碼進行認證,將使用會話金鑰加密後的使用者名稱和密碼傳送給伺服器,伺服器解密後與系統儲存的使用者名稱和密碼進行對比,並向客戶端返回認證成功或失敗的訊息。
  2. 金鑰認證:採用數字簽名來進行認證,目前可以通過RSADSA兩種演算法實現數字簽名,客戶端通過使用者名稱,公鑰以及公鑰演算法等資訊來與伺服器完成驗證。

4)會話請求階段:

  1. 伺服器等待客戶端請求。
  2. 認證完成後,客戶端想伺服器傳送會話請求。
  3. 伺服器處理客戶端請求,完成後,會向客戶端回覆SSH_SMSG_SUCCESS報文,雙方進入互動會話階段。如果請求未被成功處理,則伺服器返回SSH_SMSG_FAILURE報文,表示請求處理失敗或者不能識別客戶端請求。

5)互動會話階段:

  1. 客戶端將要執行的命令加密傳送給伺服器。
  2. 伺服器收到後,解密命令,執行後將結果加密返回客戶端。
  3. 客戶端將返回結果解密後顯示到終端上。

下面我們通過客戶端(172.31.100.107)抓包來簡單說明金鑰認證的過程:

Scurce 4 42.159. 148.87 8 42.159. 148. 87 g 42.159. 148. 87 11 42.159. IAS. s 13 42. 159. IAS. s 14 172. 31.100.10 16 42.159. 148. 87 17 42.159. 148.87 18 172. 31.100.10 19 172. 31. 100. 107 20 42. 159. IAS. s 21 172. 31.100.10 23 42. 159. IAS. s 25 42. 159. IAS. s 42. 159. IAS. s 28 172. 31.100.10 29 172. 31. 100. 107 Destination 1 172. 31.100. 107 3 172. 31. 100. 107 42.159. 148. 87 172. 31. 100. 107 172. 31. 100.10 6 172. 31. 100. 107 Q. 159. 42.159. 148.87 172. 31.100. 107 172. 31. 100. 107 172. 31. 100. 107 15 Q. 159. 172. 31.100. 107 172. 31. 100. 107 Q. 159. 22 Q. 159. Q. 159. 30 42.159. 148.87 172. 31.100. 107 31 42.159. 148. 87 172. 31. 100. 107 32 42. 159. 148. 87 172. 31. 100. 107 172. 31. 100. 107 172. 31. 100. 107 42. 159. IAS. s 42.159. 148.8 42.159.148 172. 31. 100. 107 172. 31. 100. 107 42.159.148 42.159.148 172. 31. 100. 107 42.159.148 172. 31. 100. 107 172. 31. 100. 107 172. 31. 100. 107 42.159.148 172. 31. 100. 107 Prctcccl TCP TCP ssHv2 ssHv2 ssHv2 TCP TCP ssHv2 ssHv2 ssHv2 ssHv2 ssHv2 TCP ssHv2 ssHv2 ssHv2 ssHv2 ssHv2 ssHv2 ssHv2 ssHv2 ssHv2 TCP ssHv2 ssHv2 ssHv2 Length 66 54 75 103 100 60 8 94 902 118 60 118 54 1 so 54 102 IIS 166 118 60 118 166 155 Infc 53193 > ssh seq=o win-8192 Len-o MSS=1460 ws=256 53193 > ssh CACK] seq=l Ack=l win-66048 Len-o server protocol: SSH-2. 0-0penssH_5. client protocol: SSH-2. O-nssst72_5. O. 0038 Netsar ang computer , client: Key Exchange Init ssh > 53193 CACK] seq=22 Ack=50 win-14720 Len-o 60 ssh > 53193 CACK] seq=22 Ack=1426 win-17536 Len-o server: Key Exchange Init server: ciffie-He11man Key Exchange Reply server: ciffie-He11man GE_x Reply O client: Nev.' Keys Encryoted request packet len=64 ssh > 53193 CACK] seq=lggo Ack=1802 win-20352 Len-o Encrypted response packet len=64 53193 > ssh CACK] seq=1802 Ack=2054 Len-o Encrypted request packet len=80 Encrypted response packet len=96 53193 > ssh CACK] seq=1882 Ack=2150 win-66048 Len-o Encrypted request packet len=384 Encrypted response packet len=336 Encrypted response packet len=4S Encrypted response packet len=64 Encrypted request packet len=112 Encryoted request packet len=64 ssh > 53193 CACK] seq=2598 Ack=3178 win-25856 Len-o Encrypted response packet len=64 Encrypted response packet len=112 Encrypted response packet len=112 Inc.

報文1-3:可以看到前三個包是客戶端與伺服器端三次握手的過程

報文4:在建立連線後,伺服器端將自己支援的SSH版本傳送給客戶端

報文5:客戶端返回給伺服器自己要使用的SSH版本,如果伺服器端不支援這個版本,則到此就終止了SSH連線

報文6:客戶端將自己支援的公鑰演算法列表,加密演算法列表,MACMessageAuthentication Code,訊息驗證碼)演算法列表,壓縮演算法列表等傳送給伺服器

C] Frame 6: 1430 bytes on wire (11440 bits), 1430 bytes captured (11440 bits) C] Ethernet 11, Sr c: Flextron_d6:d2:07 (00:21 Dst: 5c:dd:70:91:ca:aO Tr ansmission control protocol, src Port: 53193 (53193), ost Port: ssh (22), seq: 50, Ack: 22, Len: 1376 C:] ssH protocol D SSH version 2 (encryption: aes128-cbc mac : hmac-sha2-256-etmaopenssh. com compression: none) packet Length: 1372 padding Length: g D Key Exchange Msg code: Key Exchange Init (20) [S Algorithms cookie: 00007c4400002cb700005370000064fb kex_algorithms length: 183 kex_algorithms string: ecdh-sha2-ni stp256, ecdh-sha2-nistp384 , ecdh-sha2-nistp521 , dif fie-hellman-group-exchange-sha256, server host key _ algorithms length: 35 server host key _ algorithms string: ssh-rsa, ssh-dss , ecdsa-sha2-nistp256 encrypti on_al gor i thms_c 1 i ent_to_server length: 251 encrypti on_al gor i thms_c 1 i ent_to_server string C truncated]: aes128-cbc , 3des-cbc , blowfish-cbc , cast128-cbc , arcfour , aes19 encrypti on_al gor i 1 i ent length: 251 encrypti on_al gor i 1 i ent string C truncated]: aes128-cbc , 3des-cbc , blowfish-cbc , cast128-cbc , arcfour , aes19 ent_to_server length: 286 ent_to_server stri ng C truncated]: hmac-sha2-256-etnaopenssh. com,hmac-sha2-512-etnaopenssh. com,hmac- mac_algorithms_server_to_client length: 286 mac_algorithms_server_to_client stri ng C truncated]: hmac-sha2-256-etnaopenssh. com,hmac-sha2-512-etnaopenssh. com,hmac- ent_to_server length: stri ng : compression_algorithms_server_to_client length: compression_algorithms_server_to_client stri ng : languages_cli length: O languages_server_to_client length: O KEX First packet Follows: O Reserved: 00000000 padding stri ng: b8b548egca17e22f34 4 none 4 none

報文7,8:伺服器返回ACK報文

報文9:伺服器將自己支援的公鑰演算法列表,加密演算法列表,MACMessageAuthentication Code,訊息驗證碼)演算法列表,壓縮演算法列表等傳送給客戶端

C] Frame g: 894 bytes on wire (7152 bits), 894 bytes captured (7152 bits) C] Ethernet 11, src: 5c:dd:70:91:ca:aO (5c:dd:70:91:ca:aO), Dst: Flextron_d6:d2:07 (00:21 C:] Internet protocol version 4, src: 42.159.148. 87 (42.159.148. 87), DSt: 172. 31.100.107 (172. 31.100.107) Transmission control protocol, src Port: ssh (22), Dst Port: 53193 (53193), seq: 22, Ack: 1426, Len: 840 C:] ssH protocol C] SSH version 2 (encryption: aes128-cbc mac : hmac-sha2-256-etnaopenssh. com compression: none) packet Length: 836 padding Length: 10 Key Exchange Msg code: Key Exchange Init (20) [S Algorithms cookie: 058ab618a9830f104bb10c37f00ef55e kex_algorithms length: 126 kex_algorithms string: dif fie-hellman-group-exchange-sha256,diffie-he11man-group-exchange-sha1 , dif fie-hellman-grou server host key _ algorithms length: 15 server host key _ algorithms string: ssh-rsa, ssh-dss encrypti on_al gor i thms_c 1 i ent_to_server length: 157 encrypti on_al gor i thms_c 1 i ent_to_server stri ng: aes128-ctr , aes192-ctr , aes256-ctr , arcfour256, arcfour128, aes128-cbc , 3 encrypti on_al gor i 1 i ent length: 157 encrypti on_al gor i 1 i ent stri ng: aes128-ctr , aes192-ctr , aes256-ctr , arcfour256, arcfour128, aes128-cbc , 3 ent_to_server length: 133 stri ng : hmac-md5 , hmac-shal , umac-64aopenssh. com , hmac-sha2-256 , hmac-sha2-512 , hmac-ri mac_algorithms_server_to_client length: 133 mac_algorithms_server_to_client stri ng : hmac-md5 , hmac-shal , umac-64aopenssh. com , hmac-sha2-256 , hmac-sha2-512 , hmac-ri compr essi on_al gor i thms_c 1 i ent_to_server compr essi on_al gor i thms_c 1 i ent_to_server compr essi on_al gor i 1 i ent compr essi on_al gor i 1 i ent languages_cli length: O languages_server_to_client length: O KEX First packet Follows: O Reserved: 00000000 padding string: 00000000000000000000 1 ength: stri ng : 1 ength: stri ng : 21 none , zl i baopenssh. com 21 none , zl i baopenssh. com

這裡在雙方協商的原則是以客戶端支援的協議為主,客戶端支援的協議從左向右優先順序依次遞減,從優先順序高的協議開始匹配,如果客戶端支援的第一個協議,伺服器也支援,則雙方就使用這個協議,如果伺服器不支援,則在匹配第二個客戶端支援的協議,直到匹配到最後一個客戶端支援的協議,如果伺服器都不支援,則雙方協商失敗。

報文10:客戶端開始與伺服器進行通訊的共享金鑰的協商,由於前面使用的是SSH2.0的協議,所以這裡使用的是Diffie-Hellman-Group-Exchange-SHA演算法(關於DH-GEX-SHA演算法的原理,可以參考http://blog.csdn.net/lee244868149/article/details/51790397),在這個報文中,客戶端限制了金鑰交換引數MinNumbers of BitsMax

C:] Frame 10: 78 C:] Ethernet 11, Tr ansmn SSI on C:] ssH protocol bytes on wire (624 bits), 78 bytes captured (624 bits) Sr c: Flextron_d6:d2:07 (00:21 Dst: 5c:dd:70:91:ca:aO (5c:dd:70:91:ca:aO) control protocol, src Port: 53193 (53193), ost Port: ssh (22), seq: 1426, Ack: 862, Len: 24 D SSH version 2 (encryption: aes128-cbc mac : hmac-sha2-256-etmaopenssh. com compression: none) packet Length: 20 padding Length: 6 Key Exchange Msg code: Diffi e-He11man GEX Request (34) DH GEX Min: 00000400 DH GEX Numbers of Bits: 00000800 DH GEX Max: 00002000 padding stri ng: e7be12bbaOac

報文11:伺服器端收到客戶端DH請求後,將用於生成公鑰的PG傳送給客戶端,P是一個大素數,滿足客戶端在報文10中的限制,G是大於1的數,不需要特別大,通常取2或者5

C] Frame 11: 334 bytes on wire (2672 bits), 334 bytes captured (2672 bits) C] Ethernet 11, src: 5c:dd:70:91:ca:aO (5c:dd:70:91:ca:aO), Dst: Flextron_d6:d2:07 (00:21 C:] Internet protocol version 4, src: 42.159.148. 87 (42.159.148. 87), DSt: 172. 31.100.107 (172. 31.100.107) Transmission control protocol, src Port: ssh (22), ost Port: 53193 (53193), seq: 862, Ack: 1450, Len: 280 C:] ssH protocol SSH version 2 (encryption: aes128-cbc mac : hmac-sha2-256-etnaopenssh. com compression: none) packet Length: 276 padding Length: 8 C] Key Exchange Msg code: Diffi e-He11man Key Exchange Reply (31) Multi precision Integer Length: 257 DH modulus (p): ooc038282de061be1ad34f31325efe9b1d8520db14276ceb. Multi precision Integer Length: 1 DH base (G): 02 padding string: 0000000000000000

報文12:客戶端收到PG後,自己生成私鑰a,並根據私鑰a計算出自己的公鑰e,將e傳送給伺服器端

C] Frame 12: 326 bytes on wire (2608 bits), 326 bytes captured (2608 bits) C] Ethernet 11, src: Flextron_d6:d2:07 (00:21 Dst: 5c:dd:70:91:ca:aO Transmission control protocol, Sr c Port: 53193 (53193), ost Port: ssh (22), seq: 1450, Ack: 1142, Len: C:] ssH protocol C] SSH version 2 (encryption: aes128-cbc mac : hmac-sha2-256-etnaopenssh. com compression: none) packet Length: 268 padding Length: 6 Key Exchange Msg code: Diffi e-He11man GEX Init (32) Multi precision Integer Length: 256 DH client e: 689fa3f136ac896e913f39963bf7cc8986e292adcc760802. padding string: bb430c1d5c66 272

報文13:伺服器收到客戶端發來的e後,根據e和伺服器的私鑰b可以計算出雙方的共享金鑰K,同時伺服器通過私鑰b計算出客戶端計算K需要的引數f,將f發給客戶端

C] Frame 13: 902 bytes on wire (7216 bits), 902 bytes captured (7216 bits) C] Ethernet 11, src: 5c:dd:70:91:ca:aO (5c:dd:70:91:ca:aO), Dst: Flextron_d6:d2:07 (00:21 C:] Internet protocol version 4, src: 42.159.148. 87 (42.159.148. 87), DSt: 172. 31.100.107 (172. 31.100.107) Transmission control protocol, src Port: ssh (22), ost Port: 53193 (53193), seq: 1142, Ack: 1722, Len: ssH protocol SSH version 2 (encryption: aes128-cbc mac : hmac-sha2-256-etnaopenssh. com compression: none) packet Length: 828 padding Length: 10 D Key Exchange Msg code: Diffi e-He11man GEX Reply (33) KEX DH host key length: 277 KEX DH host key: 000000077373682d72736100000001230000010100c02433. Multi precision Integer Length: 256 DH server f: 7bOfbe76445704db065fcf87ceca711f96e2c13c17c68e1a. . KEX DH H signature length: 271 KEX DH H signature: 000000077373682d72736100000100be9d537a6be523c230. padding string: 00000000000000000000 MAC : ooooooocoal 500000000000000000000 848

此外,KEY DH host key為伺服器的主機公鑰,通常為RSA公鑰,KEY DH HSignature為伺服器用主機私鑰對計算出的雜湊值H進行簽名的結果。

H的計算方法為:H=hash(V_C||V_S||I_C||I_S||K_S||e||f||K)

其中的引數:

型別

說明

string

V_C

客戶端的初始報文(版本資訊:SSH-2.0-xxx,不含結尾的CRLF

string

V_S

伺服器的初始報文

string

I_C

客戶端 SSH_MSG_KEX_INIT的有效載荷(不含開頭的資料長度值)

string

I_S

伺服器的同上

string

K_S

主機祕鑰(dh gex reply33)過程伺服器傳送host key (RSA公鑰)

mpint

e

客戶端DH公鑰

mpint

f

伺服器DH公鑰

mpint

K

共同DH計算結果

客戶端收到伺服器發來的f後,根據f和自己的私鑰可以計算出K,進而計算出H,同時客戶端會利用伺服器傳送過來的主機公鑰K_S來驗證伺服器傳送過來的H的簽名是否有效,如果有效,則客戶端在報文14中向伺服器傳送New Keys報文,表示雙方金鑰交換成功,計算出的H則作為整個會話的會話ID

為了更直觀的理解,可以參考下面的計算過程:

服 務 器 將 G 發 送 拾 客 F 端 客F端生成私鑰@ 計 算 , 將 e 發 送 拾 服 務 器 e=C,amodP f=GbmodP K=ebmodP—GabmodP 服 務 器 牧 到 e 後 , 生 成 私 鑰 一 b , 計 算 K : 丆 。 讞 00 p 一 G 讞 od 尹 一 Gabmod p 矚 」 客 F 端 牧 到 f 後 , 計 算 , 將 f 發 送 拾 客 F 端

後面的資料報文都使用雙方協商的共享金鑰,所以在抓包結果中就看不到裡面的資訊了,這裡說明一下後續金鑰認證的大致過程:

  1. 客戶端向伺服器傳送登陸要使用的IP地址和使用者名稱,伺服器識別對應的客戶端公鑰(儲存在authorized_keys中),找到該公鑰後,伺服器通過公鑰加密一段隨機字串,並使用共享金鑰加密後傳送給客戶端。
  2. 客戶端首先使用共享金鑰解密得到使用自己的公鑰加密的字串,再使用自己的私鑰解密得到原始字串,再通過共享金鑰加密後傳送給伺服器。
  3. 伺服器通過共享金鑰解密得到字串,與之前自己用公鑰加密的那個字串進行對比,如果一致,則說明客戶端的私鑰與自己的公鑰對應,認證成功,否則認證失敗。