SSH原理以及使用方式

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文件的話可以新建一個。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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