How to use ssh to connect server?
最近和朋友討論到了如何使用ssh連接服務器,一時興起,感覺自己也確實只會用其中一些簡單的命令,所以就抽空整理了下該篇文章,該文章參考了許多網(wǎng)上的資源,最后以我自認為比較簡單明了的方式作出此文,時間原因,后面會補充一個過程圖。
一、ssh是什么?
SSH 為 Secure Shell的縮寫,由 IETF 的網(wǎng)絡(luò)小組(Network Working Group)所制定;SSH 為建立在應用層基礎(chǔ)上的安全協(xié)議。SSH 是較可靠,專為遠程登錄會話和其他網(wǎng)絡(luò)服務提供安全性的協(xié)議。利用 SSH 協(xié)議可以有效防止遠程管理過程中的信息泄露問題。SSH最初是UNIX系統(tǒng)上的一個程序,后來又迅速擴展到其他操作平臺。SSH在正確使用時可彌補網(wǎng)絡(luò)中的漏洞。SSH客戶端適用于多種平臺。幾乎所有UNIX平臺—包括HP-UX、Linux、AIX、Solaris、Digital、 UNIX、Irix,以及其他平臺,都可運行SSH。
二、ssh可以做什么?
傳統(tǒng)的網(wǎng)絡(luò)服務程序,如:ftp、pop和telnet在本質(zhì)上都是不安全的,因為它們在網(wǎng)絡(luò)上用明文傳送口令和數(shù)據(jù),別有用心的人非常容易就可以截獲這些口令和數(shù)據(jù)。而且,這些服務程序的安全驗證方式也是有其弱點的, 就是很容易受到“中間人”(man-in-the-middle)這種方式的攻擊。所謂“中間人”的攻擊方式, 就是“中間人”冒充真正的服務器接收你傳給服務器的數(shù)據(jù),然后再冒充你把數(shù)據(jù)傳給真正的服務器。服務器和你之間的數(shù)據(jù)傳送被“中間人”一轉(zhuǎn)手做了手腳之后,就會出現(xiàn)很嚴重的問題。通過使用SSH,你可以把所有傳輸?shù)臄?shù)據(jù)進行加密,這樣"中間人"這種攻擊方式就不可能實現(xiàn)了,而且也能夠防止DNS欺騙和IP欺騙。使用SSH,還有一個額外的好處就是傳輸?shù)臄?shù)據(jù)是經(jīng)過壓縮的,所以可以加快傳輸?shù)乃俣取SH有很多功能,它既可以代替Telnet,又可以為FTP、PoP、甚至為PPP提供一個安全的"通道" 。
三、ssh的原理
3.1 驗證方式
從客戶端的角度來說,ssh提供兩種級別的安全驗證,分別是基于口令的安全驗證和基于密鑰的安全驗證。
-
基于口令的安全驗證
? 口令,也就是一般來講我們說的密碼,只要知道服務ip、賬號以及密碼,就可以登錄遠程主機。所有的傳輸?shù)臄?shù)據(jù)都會被加密,但是不能保證你正在連接的服務器就是你想連接的服務器??赡軙袆e的服務器在冒充真正的服務器,也就是受到“中間人”這種方式的攻擊。
-
基于密鑰的安全驗證
? 需要依靠密鑰,也就是你必須為自己創(chuàng)建一對密鑰,并把公用密鑰(公鑰)放在需要訪問的服務器上。如果你要連接到SSH服務器上,客戶端軟件就會向服務器發(fā)出請求,請求用你的密鑰進行安全驗證。服務器收到請求之后,先在該服務器上你的主目錄下(.ssh)尋找你的公用密鑰,然后把它和你發(fā)送過來的公用密鑰進行比較。如果兩個密匙一致,服務器就用公用密鑰加密“質(zhì)詢”(challenge)并把它發(fā)送給客戶端軟件??蛻舳塑浖盏健百|(zhì)詢”之后就可以用你的私人密鑰解密再把它發(fā)送給服務器。
用這種方式,你必須知道自己密匙的口令。但是,與第一種級別相比,第二種級別不需要在網(wǎng)絡(luò)上傳送口令。
第二種方式不僅加密所有傳送的數(shù)據(jù),而且“中間人”這種攻擊方式也是不可能的(因為他沒有你的私人密匙),但是整個登錄的過程可能需要10秒。
3.2 驗證過程
ssh的登錄過程分為5個階段
1、版本號協(xié)商階段
2、密鑰和算法協(xié)商階段
3、認證階段
4、會話請求階段
5、會話交互階段
主要就如下三個階段:
-
1、版本號協(xié)商階段
- 服務端打開端口22,等待客戶連接。
- 客戶端向服務端發(fā)起TCP連接,連接建立后,服務端向客戶端發(fā)送第一個報文,包括版本標志字符串,格式為“協(xié)議版本號 次協(xié)議版本號 軟件版本號”。
- 客戶端收到報文后,解析協(xié)議版本號,如果服務端的協(xié)議版本號比自己的低,且客戶端能支持服務端的低版本,就使用服務端的協(xié)議號,否則使用自己的協(xié)議版本號。
- 客戶端回復服務端一個報文,包含了客戶端決定使用的協(xié)議版本號。
- 服務端比較客戶端發(fā)過來的版本號,決定是否能同客戶端交互。
- 如果協(xié)商成功,就進入密鑰和算法協(xié)商階段。否則服務端斷開TCP連接。
-
2、密鑰和算法協(xié)商階段
- 服務端和客戶端分別發(fā)送算法協(xié)商報文給對方,報文中包含自己支持的公鑰算法列表、加密算法列表、消息驗證碼算法列表、壓縮算法列表等。
- 服務端和客戶端根據(jù)對方和自己支持的算法得出最終使用的算法。
- 服務端和客戶端利用DH交換(Diffie-Hellman Exchange)算法、主機密鑰對等參數(shù),生成會話密鑰和會話ID。
- c公 客戶端公鑰
- c密 客戶端密鑰
- s公 服務端公鑰
- s密 服務端密鑰
- 在版本號協(xié)商階段完成后:
- 服務端將 s公 發(fā)送給客戶端。
- 服務端生成會話ID ,設(shè)為 id ,發(fā)送給客戶端。
- 客戶端生成會話密鑰,設(shè)為 key ,并計算 res = (id 異或 key)。
- 客戶端將 res 用 s公 進行加密,將結(jié)果發(fā)送給服務端。
- 服務端用 s密 進行解密,得到 res。
- 服務器計算 res 異或 id,得到 key。
- 至此服務端和客戶端都知道了會話密鑰和會話ID,以后的數(shù)據(jù)傳輸都使用這個會話密鑰進行加密和解密。
-
3、認證階段
-
基于賬號和口令的驗證方式:
客戶端使用密鑰和算法協(xié)商階段生成的會話密鑰加密賬號、認證方法、口令,將結(jié)果發(fā)送給服務器。
服務端使用獲得的會話密鑰解密報文,得到賬號和口令。
服務端對這個賬號和口令進行判斷,如果失敗,向客戶端發(fā)送認證失敗報文,其中包含了可以再次認證的方法列表。
客戶端從認證方法列表中選擇一種方法進行再次認證。
這個過程反復進行,直到認證成功或者認證次數(shù)達到上限,服務端關(guān)閉本次TCP連接。
-
基于公鑰和私鑰的驗證方式:
使用ssh-keygen程序生成公鑰 id_dsa.pub 和私鑰 id_dsa,一般是在客戶端上生成,然后把 id_dsa.pub 通過某種方式發(fā)送給服務端。
服務端放在將要遠程登錄過來的那個賬號的目錄的.ssh目錄下面。
客戶端使用密鑰和算法協(xié)商階段生成的會話密鑰加密賬號、認證方法、id_dsa.pub,將結(jié)果發(fā)送給服務端。
服務端使用會話密鑰解密報文,得到賬號、id_dsa.pub。
服務端在這個賬號的目錄的.ssh目錄下找對應的公鑰,如果沒有找到,發(fā)送失敗消息給客戶端,如果找到,比較客戶發(fā)送過來的這個公鑰和找到的公鑰,如果內(nèi)容相同,服務端生成一個隨機的字符串,簡稱“質(zhì)詢”,然后使用找到的公鑰加密這個質(zhì)詢,然后使用會話密鑰再次加密。
服務端把這個雙重加密的數(shù)據(jù)發(fā)送給客戶端。
客戶端使用會話密鑰解密報文,然后使用id_dsa再次解密數(shù)據(jù),得到質(zhì)詢。
客戶端使用會話密鑰加密質(zhì)詢,發(fā)送給服務端。
服務端使用會話密鑰解密報文,得到質(zhì)詢,判斷是不是自己生成的那個質(zhì)詢,如果不相同,發(fā)送失敗消息給客戶端,如果相同,認證通過。
-
四、ssh的命令使用
4.1 簡單的基于口令的驗證
ssh user@remote [-p port]
4.2 簡單的基于密鑰的驗證
ssh -i secretkey user@remote [-p port]
4.3 配置別名來認證
? 如果服務器比較多的時候,我們就可以配置別名來連接服務器。
在客戶端下的 ~/.ssh/config 文件中追加下服務器相關(guān)內(nèi)容,
* 格式:
Host serverName
HostName remote-ip
[IdentityFile secrePath]
User userName
Port port
* 解釋:
Host 服務器別名
HostName 遠程ip地址
[IdentityFile 密鑰文件地址(如果使用密鑰來驗證的話)]
User 賬號名稱
Port 端口號
* 例如:
Host centos
HostName xxx.xxx.xxx.xxx
User user
Port port
保存之后就可以直接使用 ssh centos來登錄。
注:如果沒有config文件的話可以新建一個。