什么是 SSH 视卢?
Secure Shell(縮寫為 SSH),是創(chuàng)建在應(yīng)用層和傳輸層基礎(chǔ)上的安全協(xié)議莉测。目前主要用于遠程登錄會話和其他網(wǎng)絡(luò)服務(wù)。
為什么 SSH 較為安全柔袁?
傳統(tǒng)的通信協(xié)議呆躲,如 HTTP、FTP瘦馍、Telnet 等歼秽,大多在通信過程中使用明文傳送用戶帳號和用戶口令等信息,所以其本質(zhì)上是不安全的情组。因為這種方式很容易受到中間人攻擊(Man-in-the-Middle Attack燥筷,簡稱 “MITM攻擊”),就是入侵者通過各種手段將其控制的一臺計算機虛擬放置在網(wǎng)絡(luò)連接中的兩臺通信計算機之間院崇,以達到竊取信息的目的肆氓。而 SSH 會對所有傳輸?shù)臄?shù)據(jù)進行非對稱加密,所以較為安全底瓣。
SSH 服務(wù)連接交互過程
什么是 OpenSSH谢揪?
OpenSSH 是對 SSH 協(xié)議的一種實現(xiàn)。以下將針對 OpenSSH 闡述 SSH 的兩種登錄驗證方式捐凭。
SSH 基于口令的登錄驗證
登錄的交互過程:
1. 客戶端向ssh服務(wù)端發(fā)出登錄請求拨扶。相關(guān)信息通過明文發(fā)送;
2. 根據(jù)客戶端所使用的服務(wù)協(xié)議版本及算法設(shè)置茁肠,返回相應(yīng)公鑰信息患民;
3. 客戶端接收到服務(wù)端公鑰信息后,會進行比對垦梆,并讓用戶對相關(guān)信息進行確認匹颤;
4. 服務(wù)端公鑰校驗及確認后,客戶端會生成一對臨時密鑰用于客戶端加密托猩;
5. 客戶端向服務(wù)端印蓖,發(fā)送前述生成的臨時密鑰對中的公鑰信息。相關(guān)信息通過明文發(fā)送京腥。
公鑰信息的比對:
- 當客戶端第一次請求登錄服務(wù)端時:
$ ssh root@192.168.0.1
The authenticity of host '192.168.0.1 (192.168.0.1)' can't be established.
ECDSA key fingerprint is SHA256:iSQfep7qeb/qYXHsoYbPcsiqjlJcixm0QJojavfeR7g.
Are you sure you want to continue connecting (yes/no)?
無法確認 host 的真實性赦肃,它的公鑰指紋為 iSQfep7qeb/qYXHsoYbPcsiqjlJcixm0QJojavfeR7g,你確定要繼續(xù)連接嗎公浪?”
他宛。
這里的“公鑰指紋”,是指由于公鑰較長(這里采用 ECDSA 算法)因悲,為了方便比對,通過對其 SHA256 計算勺爱,生成一個 256 位的字符串晃琳。但是除非 ssh 服務(wù)器的公鑰已知,否則客戶端無法確定該公鑰的真實性,也就無法確定連接的服務(wù)器的真實性卫旱,這樣就可能遭到上文提到的MITM攻擊人灼。
- 輸入
no
:
Host key verification failed
- 輸入
yes
:
Warning: Permanently added host to the list of known hosts.
root@192.168.0.1 password:
公鑰和加密后的 Ip 地址一起被保存在文件 $~/.ssh/known_hosts
中。輸入密碼顾翼,密碼正確投放,即可登錄
- 如果服務(wù)端因重裝系統(tǒng)等因素導(dǎo)致公鑰指紋出現(xiàn)變化,則會直接導(dǎo)致連接失敗
Host key verification failed
适贸,則需要刪除已保存的條目后再重新連接灸芳; - 如果之前已經(jīng)成功連接,而且公鑰指紋對比一致拜姿,則會繼續(xù)下一步操作烙样。
SSH 基于密鑰的登錄驗證
準備階段:
1. 客戶端生成密鑰對;
2. 將公鑰信息寫入目標服務(wù)器、目標賬戶的配置文件蕊肥。該操作隱含表示了客戶端擁有對目標服務(wù)器的控制權(quán)谒获。
登錄的交互過程:
1. 客戶端向服務(wù)器發(fā)出登錄請求。在 SSH 服務(wù)啟用了密鑰驗證登錄方式后壁却,會優(yōu)先通過密鑰驗證方式進行登錄驗證批狱;
2. 服務(wù)器根據(jù) SSH 服務(wù)配置,在用戶對應(yīng)目錄及文件中讀取到有效的公鑰信息展东;
3. 服務(wù)器生成一串隨機數(shù)赔硫,然后使用相應(yīng)的公鑰對其加密;
4. 目標服務(wù)器將加密后的密文發(fā)回客戶端琅锻;
5. 客戶端使用默認目錄或 -i 參數(shù)指定的私鑰嘗試解密卦停;
6. 如果解密失敗,則會繼續(xù)嘗試密碼驗證等其它方式進行登錄校驗恼蓬。如果解密成功惊完,則將解密后的原文信息重新發(fā)送給目標服務(wù)器;
7. 目標服務(wù)器對客戶端返回的信息進行比對处硬。如果比對成功小槐,則表示認證成功,客戶端可以登錄荷辕。如果對比失敗凿跳,則表示認證失敗,則會繼續(xù)嘗試密碼驗證等其它方式進行登錄校驗疮方;
Linux 下 SSH 密鑰登錄的實現(xiàn)
- 需要知道:
- SSH 協(xié)議 v1 只支持 RSA 算法控嗜,而 SSH 協(xié)議 v2 對 RSA 算法和 DSA 算法都支持。OpenSSH 對兩種算法都支持骡显。本文以 RSA 算法為例疆栏。
- 生成密鑰對的時候曾掂,可以按需決定是否設(shè)置密碼。但需要注意的是壁顶,如果設(shè)置了密碼珠洗,還需結(jié)合
ssh-agent
代理和ssh-add
配置才能實現(xiàn)自動登錄。同時若专,相關(guān)配置只對ssh-agent
啟動的相應(yīng) shell 生效许蓖,用戶退出后重新登錄時還需重新配置。所以调衰,為簡便起見膊爪,本文以常見的、不配置密碼的情況進行說明窖式。
- 生成密鑰對
$ ssh-keygen -t rsa
Enter file in which to save the key (/home/calvin/.ssh/id_rsa):
# 密鑰保存路徑和文件名蚁飒,可自定義
Enter passphrase (empty for no passphrase):
# 密碼,按上文說明萝喘,無需設(shè)置
Enter same passphrase again:
Your identification has been saved in /home/calvin/.ssh/id_rsa.
Your public key has been saved in /home/calvin/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:DOlxtOHtHVKt7D7GCDWtjYk5p1iZEtCufhTH2X0w+1g calvin@calvin-ubuntu
The key's randomart image is:
+---[RSA 2048]----+
| . o .. |
| . .+ + .o . |
| o+.+oo+.= |
| .+=+.+o*.E |
| ..+S*.B.= |
| . o O = + . |
| . . + = + |
| . o . . = |
| . . . |
+----[SHA256]-----+
生成的密鑰對默認保存在當前用戶 home
目錄下的 .ssh
文件夾中淮逻,文件名默認為 id_rsa
(私鑰) 和 id_rsa.pub
(公鑰)。
- 將公鑰寫入服務(wù)端
$ cat ~/.ssh/id_rsa.pub | ssh root@192.168.0.1 'cat >> ~/.ssh/authorized_keys';
- 檢查服務(wù)端 SSH 的配置
SSH 配置文件默認為/etc/ssh/sshd_config
- 確保參數(shù)
RSAAuthentication
和PubkeyAuthentication
沒有顯示的置為no
阁簸,比如:
- 確保參數(shù)
RSAAuthentication yes
PubkeyAuthentication yes
- 確保
AuthorizedKeysFile
和公鑰寫入的文件一致爬早。
注:如果修改了參數(shù),需要重啟 ssh 服務(wù)启妹。
- 登錄
$ ssh root@192.168.0.1
# 如果自定義了私鑰路徑或文件名
$ sudo -i /path/to/my_rsa root@192.168.0.1
參考文章
SSH 維基百科
SSH原理與運用
云服務(wù)器 ECS Linux SSH 連接交互過程簡介
云服務(wù)器 ECS Linux SSH 基于密鑰交換的自動登錄原理簡介及配置說明