ssh兩種認證方式的原理介紹
SSH是一種加密的網路傳輸協議,可在不安全的網路中為網路服務提供安全的傳輸環境。SSH通過在網路中建立安全隧道來實現SSH客戶端與伺服器之間的連線。雖然任何網路服務都可以通過SSH實現安全傳輸,SSH最常見的用途是遠端登入系統,人們通常利用SSH來傳輸命令列介面和遠端執行命令。ssh 協議互動過程如下:
SSH以非對稱加密方式實現身份驗證,主要有以下兩種:
-
基於密碼的安全驗證
-
基於金鑰的安全驗證
下面就對這兩種方法展開介紹:
- 基於密碼的安全驗證
是使用自動生成的公鑰-私鑰對來簡單地加密網路連線,隨後使用密碼認證進行登入。具體過程如下:
1、客戶端傳送登入請求,ssh [email protected]
2、伺服器接受請求,將伺服器的公鑰 ser_rsa.pub 傳送給客戶端
3、客戶端輸入密碼,密碼使用 ser_rsa.pub 加密後傳送給伺服器(敏感資訊保安傳輸)
4、伺服器接受加密後的密碼,使用伺服器私鑰 ser_rsa 解密,匹配認證密碼是否合法(如果合法!登入成功)
至此,身份認證通過,然後是交換會話金鑰(對稱加密)
5、客戶端生成會話資料加密 sess_key,使用 ser_rsa.pub 加密後傳輸給伺服器(會話金鑰)
6、伺服器獲取到後使用 ser_rsa 解密,得到sess_key
使用會話金鑰對之後傳遞的資料進行加密。注
7、客戶端和伺服器通過 sess_key 進行會話資料安全傳輸
但是,這種認證方式無法避免“中間人”攻擊,可能會有別的伺服器在冒充真正的伺服器。
如圖所示,如果有人截獲了登入請求,然後冒充伺服器,將偽造的公鑰發給客戶端,那麼客戶端很難辨別真偽。因為不像https協議,SSH協議的公鑰是沒有證書中心(CA)公證的,也就是說,都是自己簽發的。可以設想,如果攻擊者插在客戶端與伺服器之間,用偽造的公鑰,獲取使用者的登入密碼。再用這個密碼登入遠端主機,那麼SSH的安全機制就蕩然無存了。
所以一般在首次登入伺服器時,系統會出現下面的提示:
$ ssh [email protected]
The authenticity of host 'host (192.168.100.1)' can't be established.
RSA key fingerprint is 2d:37:16:58:4d:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?
確認之後,就可以登入(其實在實際生活中並沒有什麼用啊?誰會去手動比對fingerprint~)
當遠端主機的公鑰被接受以後,它就會被儲存在檔案$HOME/.ssh/known_hosts之中。下次再連線這臺伺服器,系統就會認出它的公鑰已經儲存在本地了,從而跳過警告部分,直接提示輸入密碼。
- 基於金鑰的安全驗證
客戶端生成一對公鑰和私鑰,並將自己的公鑰儲存在伺服器上。客戶端請求登入的時候,伺服器會向客戶端傳送一段隨機字串,客戶端用自己的私鑰加密後,再發回來。伺服器用事先儲存的公鑰進行解密,如果成功,就證明使用者是可信的,直接允許登入,不再要求密碼。從而避免了“中間人”攻擊。具體過程如下:
基於金鑰的安全驗證簡單的描述如圖中所示。但在實際傳輸過程中所有的資料都是需要加密以保證資料傳輸安全,即同樣會生成會話金鑰,使用會話金鑰對傳輸資料進行加密的過程。詳細過程如下:
Ac:客戶端公鑰
Bc:客戶端私鑰
As:伺服器公鑰
Bs:伺服器私鑰
***在認證之前,客戶端需要將公鑰 Ac 放到伺服器上。***
1、客戶端傳送登入請求,ssh [email protected]
2、伺服器接受請求,將伺服器的公鑰 As 傳送給客戶端
伺服器生成會話ID(session id),設為 p,傳送給客戶端。
3、客戶端生成會話金鑰(session key),設為 q,並計算 r = p xor q。
客戶端將 r 用 As 進行加密,結果傳送給伺服器。
4、伺服器用 Bs 進行解密,獲得 r。
伺服器進行 r xor p 的運算,獲得 q。
至此,伺服器和客戶端都知道了會話金鑰q,以後的傳輸資料都將被 q 加密。
5、伺服器生成隨機數 x,並用 Ac 加密後生成結果 S(x),傳送給客戶端
6、客戶端使用 Bc 解密 S(x) 得到 x
客戶端計算 q + x 的 md5 值 n(q+x),q為上一步得到的會話金鑰
客戶端將 n(q+x) 傳送給伺服器
7、伺服器計算 q + x 的 md5 值 m(q+x)
伺服器比較 m(q+x) 和 n(q+x),兩者相同則認證成功。
至此,伺服器和客戶端認證通過,可以使用會話金鑰進行加密和解密傳輸
8、客戶端和伺服器通過 q 進行會話資料安全傳輸
風險點:在將客戶端公鑰Ac放置到伺服器這一步,核實Ac的來源至關重要,因為SSH只驗證客戶端是否擁有與公鑰相匹配的私鑰,只要接受公鑰且私鑰匹配伺服器就會授予許可。這樣的話,一旦接受了惡意攻擊者的公鑰,那麼系統也會把攻擊者視為合法使用者。
ps:文中提到了非對稱加密(金鑰對)和對稱加密(會話金鑰),需要自行查詢資料進行了解。
參考連結:
https://my.oschina.net/sallency/blog/1547785
https://blog.csdn.net/marywang56/article/details/78784608