1. SSH是什么
簡單說,SSH是一種網絡協議,用于計算機之間的遠程加密登錄。
SSH 為 Secure Shell的縮寫扣甲,由 IETF 的網絡小組(Network Working Group)所制定,SSH 為建立在應用層基礎上的安全協議齿椅。SSH 是目前較可靠琉挖,專為遠程登錄會話和其他網絡服務提供安全性的協議。利用 SSH 協議可以有效防止遠程管理過程中的信息泄露問題媒咳。SSH最初是UNIX系統(tǒng)上的一個程序粹排,后來又迅速擴展到其他操作平臺。SSH安裝容易涩澡、使用簡單顽耳,而且比較常見,一般的Unix系統(tǒng)妙同、Linux系統(tǒng)射富、FreeBSD系統(tǒng)都附帶有支持SSH的應用程序包。Windows如果需要使用SSH粥帚,可以安裝PuTTY或者Cygwin胰耗。
2. SSH原理
非對稱加密技術
SSH 服務基于非對稱加密(public-key cryptography,也稱公開密鑰加密)技術實現數據加密傳輸芒涡。該技術會生成一對數學相關的密鑰柴灯,其中一個用于對數據進行加密,而且只能用于加密费尽,而另一個只能用于解密赠群。使用加密密鑰加密后的數據,只能用對應的解密密鑰才能解密旱幼。而且查描,只知道其中一個密鑰,無法計算出另一個。因此冬三,如果公開了一對密鑰中的一個匀油,并不會危害到另一個的秘密性質。通常把公開的密鑰稱為公鑰(public key)勾笆,而不公開的密鑰稱為私鑰(private key)敌蚜。
一般來說,非對稱加密的應用場景有兩個:
- 公鑰是用來解密的匠襟。比如A給B發(fā)送消息钝侠,B使用A的公鑰驗證A發(fā)布的數據或文件的完整性、準確性酸舍,以防止數據篡改。相應的密鑰稱為數字簽名(數字證書)里初。
- 公鑰是用來加密的啃勉。比如A給B發(fā)送消息,A使用B的公鑰給消息加密双妨,以防被劫持后泄漏淮阐。SSH服務基于該場景實現。
與對稱密鑰加密相比刁品,非對稱加密的優(yōu)點在于不存在共享的通用密鑰泣特。由于解密用的私鑰無需發(fā)送給任何用戶,所以可以避免密鑰被劫持或篡改挑随。而加密用的公鑰即便被劫持或篡改状您,如果沒有與其匹配的私鑰,也無法解密數據兜挨。所以膏孟,截獲的公鑰是沒有任何用處的。
當前拌汇,SSH主要采用 RSA 算法(協議 V2 默認算法)和 DSA 算法(協議 V1 僅支持該算法)來實現非對稱加密技術柒桑。
3. SSH連接交互過程
SSH連接時,整個交互過程如上圖噪舀。魁淳,主要可以分為三個階段
服務端準備階段
服務端在每次啟動 SSH 服務時,都會自動檢查 /etc/ssh/ 目錄下相關密鑰文件的有效性与倡。如果相關文件檢查發(fā)現異常界逛,則會導致服務啟動失敗,并拋出相應錯誤信息蒸走。 如果文件相關不存在仇奶,則會自動重新創(chuàng)建。
默認創(chuàng)建的相關文件及用途說明如下:
ll /etc/ssh/
-rw-------. 1 root root 125811 Aug 13 2015 moduli → 用于 DH-GEX 算法
-rw-r--r--. 1 root root 2047 Aug 13 2015 ssh_config → SSH 客戶端配置文件
-rw-------. 1 root root 3879 Aug 13 2015 sshd_config → SSH 服務配置文件
-rw-------. 1 root root 672 May 20 14:22 ssh_host_dsa_key → DSA 算法私鑰
-rw-r--r--. 1 root root 590 May 20 14:22 ssh_host_dsa_key.pub → DSA 算法公鑰
-rw-------. 1 root root 963 May 20 14:22 ssh_host_key → SSH V1 版RSA 算法私鑰
-rw-r--r--. 1 root root 627 May 20 14:22 ssh_host_key.pub → SSH V1 版 RSA 算法公鑰
-rw-------. 1 root root 1675 May 20 14:22 ssh_host_rsa_key → SSH V2 版 RSA 算法私鑰
-rw-r--r--. 1 root root 382 May 20 14:22 ssh_host_rsa_key.pub → SSH V2 版 RSA 算法公鑰
非對稱加密協商
當服務器SSH服務啟動,客戶端也安裝了SSH后该溯,就可以進行連接了岛抄。
- 客戶端向服務端發(fā)送連接請求。
客戶端連接服務器有兩種方式:1. 密碼登錄狈茉。2. 密鑰登錄夫椭。
客戶端通過SSH工具連接服務端。相關信息通過明文發(fā)送氯庆,發(fā)送的請求包括IP地址和用戶名蹭秋,服務器識別對應的客戶端公鑰(保存在$HOME/.ssh/authorized_keys
中),找到該公鑰后堤撵,服務器通過公鑰加密一段隨機字符串仁讨,并使用共享密鑰加密后發(fā)送給客戶端。如果未找到公鑰实昨,則需要輸入密碼洞豁。
- 客戶端向服務端發(fā)送連接請求。
- 服務端返回公鑰信息
根據客戶端所使用的服務協議版本及算法設置,返回相應公鑰信息荒给。比如丈挟,默認情況下,客戶端通過 SSH V2 版協議志电,基于 RSA 算法建立連接曙咽,則服務端將ssh_host_rsa_key.pub
文件中的內容返回客戶端。相關信息通過明文發(fā)送挑辆。
- 服務端返回公鑰信息
- 客戶端對服務端公鑰信息進行比對和確認
客戶端接收到服務端公鑰信息后例朱,會進行如下比對,并讓用戶對相關信息進行確認之拨。- 如果是首次連接服務端茉继,客戶端會收到類似如下信息,讓用戶確認公鑰指紋的有效性:
The authenticity of host '192.168.0.1 (192.168.0.1)' can't be established. RSA key fingerprint is c2:49:d9:43:74:d5:ed:bc:28:9b:d2:7b:63:94:cf:bc. Are you sure you want to continue connecting (yes/no)?
- 如果用戶輸入 no 蚀乔,則連接中斷并報錯(Host key verification failed)烁竭。
- 如果用戶輸入 yes,則會將相應的公鑰信息吉挣,保存到當前用戶家目錄下 .ssh 目錄內的 known_hosts 文件中派撕。 比如:
cat ~/.ssh/known_hosts
# IP 明文顯示: 192.168.0.1 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA3sdlboGEgY9buZpkPuygPw0NxAvmxYd0mc3fo2MgP+JqgFC9/9ZXOgDXKJrjE2HKBieJZSPKGncIh+zLxTvmykeJQBXv7i1GiUjW+H3VY69Ge3AdGfCd+XF+Cvi1e+j18zhHnjSzvIBoNpT5cBWWNbw7mNHCwTb0sHAVUkWR4Ck/LM5/rQ09A+m6BLfZJL8CRNGxKTbyINi6o812S+Cy64WqDs1nTpIXp2Bkcpjclb36bFSs9Z/tWNuJl7A//7HNtxMgFGBnE07Ykvvy8s06DUmkyFy8GcXGBpnfdg9utLodfQLFQnKflCQZ110BpQaCWlWPjU9dc4w3XLJ/XQOP4w== # IP 加密處理: 3efXAZ4sNHcUcHamBy4gDriblc8=|8idBhLq9aLl2sfh4KswMsk4sPFI= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwS4DE3hok8RCkxYlTxsexNrNa62e05UGSkoP7ie26DDWjG1Aoc74cCsE4is9p7lEfFUYYlAzeYhPqE/yGf5YxRZUOU2IeFI4cEqo8YZr7edVYpgAq2f2J0zMwk1syenD12lmUPkYA4mMB6it3jxXR5k+H0HZh9YA7mRXkiTjlkAMWirBcnUvtKYRv9LRIr3ikUiPy2gfZO291Ae9zuTsWwEtHQxIpiBgk3vwF2gCUFlX9y//IsMjdQq5prk7x3BjXhUorqgJO1gt1VHW8Xxx9Oe50YF1hi9DuE6VXwyh4xfHTmauRQybwsYafdA3HxrA2od6x9l19D9EH7xHAjDa5w==
- 如果服務端因重裝系統(tǒng)等因素導致公鑰指紋出現變化,則會直接導致連接失敳腔辍(報錯Host key verification failed)终吼,則需要刪除已保存的條目后再重新連接。
- 如果之前已經成功連接氯哮,而且公鑰指紋對比一致际跪,則會繼續(xù)下一步操作。
- 客戶端對服務端公鑰信息進行比對和確認
- 客戶端生成臨時密鑰對
服務端公鑰校驗及確認后,客戶端會生成一對臨時密鑰用于客戶端加密姆打。該密鑰對不會存儲到文件良姆,而是記錄在內存中。每次連接都會重新生成臨時密鑰對幔戏。
- 客戶端生成臨時密鑰對
- 客戶端發(fā)送公鑰信息
客戶端向服務端玛追,發(fā)送前述生成的臨時密鑰對中的公鑰信息。相關信息通過明文發(fā)送闲延。
- 客戶端發(fā)送公鑰信息
后續(xù)數據交互過程
后續(xù)登錄校驗及正常的數據傳輸痊剖,都會通過雙向加密方式進行。相關交互說明如下:
- 如果服務端需要發(fā)送數據給客戶端:
- 服務端使用所持有的客戶端公鑰垒玲,對需要傳輸的數據進行加密陆馁,再發(fā)送給客戶端。
- 客戶端收到信息后侍匙,使用所持有的自身私鑰解密后獲取數據氮惯。
- 反之,如果客戶端需要發(fā)送數據給服務端想暗,也是類似的流程:
- 客戶端使用所持有的服務端公鑰,對需要傳輸的數據進行加密帘不,再發(fā)送給服務端说莫。
- 服務端收到信息后,使用所持有的自身私鑰解密后獲取數據寞焙。
3. SSH相關文件
從這個連接過程中储狭,可以看出,主要使用到兩個文件夾下的內容:
- ~/.ssh/
這里主要是客戶端連接信息和密鑰存儲的敵方捣郊。這個文件夾下的內容可以使用命令ssh-keygen
生成辽狈,執(zhí)行這個命令后,會生成兩個文件呛牲,id_rsa
和id_rsa.pub
刮萌。第一個是私鑰文件,第二個是公鑰文件娘扩。但是這都是針對當前登錄用戶的着茸。也就是說,只對當前用戶有效琐旁。 - /etc/ssh/
這個主要是ssh配置和服務器密鑰存儲的地方涮阔。由SSH服務啟動時生成。
在連接中的兩個過程:
- 客戶端存儲服務器的公鑰到本地
也就是上面的第二步灰殴。服務器返回回來的公鑰是/etc/ssh
下的敬特,比如
服務器下的/etc/ssh
ssh_host_ecdsa_key.pub
之所以有多組密鑰,是因為使用了不同的加密算法。
客戶端接收到之后伟阔,會存儲在~/.ssh/known_hosts
文件里辣之,查看這個文件,可以看到有一行與服務器ssh_host_ecdsa_key.pub
內容一致减俏。
- 客戶端將公鑰存儲到服務器中
在請求連接過程中召烂,如果使用密鑰的方式登錄,那么就需要先把客戶端的公鑰存儲到服務器中娃承。
首先需要通過ssh-keygen
生成當前賬戶的私鑰奏夫。然后將公鑰傳送到遠程主機host上面:
$ ssh-copy-id user@host
其實,它是將客戶端的~/.ssh/id_rsa.pub
文件內容追加到服務器文件~/.ssh/authorized_keys
中历筝。
所以酗昼,~/.ssh/authorized_keys
里表示本機可以被哪些機器訪問
~/.ssh/known_hosts
里表示本機訪問過哪些機器
4. SSH相關配置
SSH配置文件有兩個,一個是ssh_config
,一個是sshd_config
梳猪。前者是客戶端配置麻削,后者是服務器配置。也就是說春弥,如果本機是作為客戶端呛哟,那么就修改第一個配置,如果本機是作為服務器匿沛,那么就修改第二個配置扫责,
一般來說,和密鑰登錄的配置有關的有以下幾個逃呼,如果密鑰配置好后無法登錄鳖孤,嘗試配置以下三項。
RSAAuthentication yes
PubkeyAuthentication yes # 如果為yes抡笼,則無法使用密碼登錄
AuthorizedKeysFile .ssh/authorized_keys
其他
passwordAuthentication no # 只能通過私鑰訪問
4. SSH安全
中間人攻擊
傳統(tǒng)的網絡服務程序苏揣,如FTP、Pop和Telnet在傳輸機制和實現原理上是沒有考慮安全機制的推姻,其本質上都是不安全的平匈。因為它們在網絡上用明文傳送數據、用戶帳號和用戶口令拾碌,別有用心的人通過竊聽等網絡攻擊手段非常容易地就可以截獲這些數據吐葱、用戶帳號和用戶口令。而且校翔,這些網絡服務程序的簡單安全驗證方式也有其弱點弟跑,那就是很容易受到"中間人"(man-in-the-middle)這種攻擊方式的攻擊。
所謂"中間人"的攻擊方式防症,就是"中間人"冒充真正的服務器接收你的傳給服務器的數據孟辑,然后再冒充你把數據傳給真正的服務器哎甲。服務器和你之間的數據傳送被"中間人"一轉手做了手腳之后,就會出現很嚴重的問題饲嗽。中間人能夠攻擊炭玫,主要原因在于他能認識截取的信息,也能發(fā)出讓接受者認識的信息貌虾。
使用SSH吞加,你可以把所有傳輸的數據進行加密,這樣"中間人"這種攻擊方式就不可能實現了尽狠,而且也能夠防止DNS欺騙和IP欺騙衔憨。使用SSH熔脂,還有一個額外的好處就是傳輸的數據是經過壓縮的正驻,所以可以加快傳輸的速度车份。SSH有很多功能占遥,它既可以代替Telnet,又可以為FTP腿宰、Pop稠肘、甚至為PPP提供一個安全的"通道"常潮。
最初的SSH是由芬蘭的一家公司開發(fā)的斥黑。但是因為受版權和加密算法的限制揖盘,現在很多人都轉而使用OpenSSH。OpenSSH是SSH的替代軟件包锌奴,而且是免費的扣讼,可以預計將來會有越來越多的人使用它而不是SSH。