SSH協(xié)議

SSH (Secure Shell,安全外殼協(xié)議)是一種為遠程登錄會話和其他網(wǎng)絡服務提供安全性的協(xié)議。傳統(tǒng)的網(wǎng)絡服務程序,如:ftp、pop和telnet在本質上都是不安全的,因為它們在網(wǎng)絡上用明文傳送口令和數(shù)據(jù),別有用心的人非常容易就可以截獲這些口令和數(shù)據(jù)或者進行中間人攻擊。通過使用SSH,你可以把所有傳輸?shù)臄?shù)據(jù)進行加密并且傳輸?shù)臄?shù)據(jù)是經(jīng)過壓縮的,所以可以加快傳輸?shù)乃俣?。SSH有很多功能,它既可以代替Telnet,又可以為FTP、PoP、甚至為PPP提供一個安全的"通道"。SSH 只是一種協(xié)議,存在多種軟件實現(xiàn),既有商業(yè)實現(xiàn),也有開源實現(xiàn)。比如OpenSSH,它是自由軟件,應用非常廣泛。

登錄

// 以用戶名user,登錄遠程主機host,使用默認端口22。
$ ssh user@host
// 如果本地用戶名與遠程用戶名一致,登錄時可以省略用戶名。
$ ssh host
// 如果ssh服務端沒有使用默認端口,可以通過-p選項指定端口參數(shù)。
$ ssh -p 2222 user@host

SSH 有兩種登錄方式,分別是口令登錄和公鑰登錄。

口令登錄

口令登錄就是在輸入上述的 SSH 登錄請求命令后,系統(tǒng)會要求輸入對應用戶的密碼,如果密碼正確就登錄成功。SSH 之所以能夠保證密碼的安全,是因為它采用了公鑰加密。即遠程主機收到用戶的登錄請求,把自己的公鑰發(fā)給用戶,用戶使用這個公鑰,將登錄密碼加密后,發(fā)送回去,遠程主機用自己的私鑰,解密登錄密碼,如果密碼正確,就同意用戶登錄。但這里存在的一個安全隱患是,SSH 并沒有數(shù)字證書的概念,即客戶端無法像HTTPS中那樣驗證遠程主機的公鑰,如果有中間人攻擊,截獲了客戶端的登錄請求,并返回給客戶端一個偽造的公鑰,這樣中間人就獲取了客戶端的密碼,并可以用其登錄真正的遠程主機。

SSH的解決辦法是,如果是第一次登錄遠程主機會出現(xiàn)提示

$ ssh user@host
The authenticity of host 'host (xxx.xxx.xxx.xxx)' can't be established.
RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?

意思是無法確認host主機的真實性,只知道它的公鑰指紋(對較長的公鑰進行散列后的字符串),需要登錄用戶自己進行驗證確認。用戶驗證的方法只能是通過其他途徑(比如官網(wǎng)等)拿到真正的公鑰并進行比對。

如果用戶確認公鑰是正確的,就輸入yes,之后會得到提示

Warning: Permanently added 'host,xxx.xxx.xxx.xxx' (RSA) to the list of known hosts.

然后,會要求輸入密碼。如果密碼正確,就登錄成功了。提示信息的意思是之前的公鑰已被確認,并保存到了$HOME/.ssh/known_hosts,即用戶自己的known_hosts。當下次再要遠程登錄該主機時,程序就可以自動使用known_hosts中的公鑰進行比對,用戶可以直接輸入密碼登錄了。

公鑰登錄

使用公鑰登錄可以免去輸入密碼,原理是將用戶自己的公鑰儲存在遠程主機上。登錄的時候,遠程主機會向用戶發(fā)送一段隨機字符串,用戶用自己的私鑰加密后,再發(fā)回來。遠程主機用事先儲存的公鑰進行解密,如果成功,就證明用戶是可信的,直接允許登錄shell,不再要求密碼。

用戶可以通過ssh-keygen生成自己的密鑰對,運行結束以后,在$HOME/.ssh/目錄下,會新生成兩個文件:id_rsa.pub和id_rsa。前者是你的公鑰,后者是你的私鑰。

$ ssh-keygen

將公鑰傳到遠程主機上(這次是需要輸入登錄密碼的),mac下可能需要先安裝ssh-copy-id命令brew install ssh-copy-id

$ ssh-copy-id user@host
// 可以通過-p指定非默認端口,如果用戶有多對密鑰對,可以通過-i指定公鑰文件
$ ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22222 user@host

使用上述命令,遠程主機實際上是將用戶的公鑰保存在登錄后的用戶主目錄的$HOME/.ssh/authorized_keys文件中。即使不使用ssh-copy-id命令也可以完成這一操作

ssh root@45.62.109.22 -p 26218 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
// ssh root@45.62.109.22 -p 26218:登錄遠程主機
// 單引號內(nèi)的內(nèi)容是登錄后要執(zhí)行的命令
// mkdir -p .ssh:如果用戶主目錄中的.ssh目錄不存在,就創(chuàng)建一個
// 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub:將本地的公鑰文件~/.ssh/id_rsa.pub,重定向追加到遠程文件authorized_keys的末尾。

登錄成功后,用戶就可以在本地shell中操作遠程主機了。

相關命令

如果客戶端本地有多個秘鑰對,可以通過密鑰管理器ssh-agent來管理,運行ssh-agent以后,使用ssh-add將私鑰交給ssh-agent保管,其他程序需要身份驗證的時候可以將驗證申請交給ssh-agent來完成整個認證過程。

// 運行ssh-agent
$ ssh-agent
// 把專用密鑰添加到 ssh-agent 的高速緩存中
ssh-add ~/.ssh/id_rsa
// 從ssh-agent中刪除密鑰
ssh-add -d ~/.ssh/id_xxx.pub
// 刪除ssh-agent中的所有密鑰
ssh-add -D
// 查看ssh-agent中的密鑰
ssh-add -l
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容