1. 程式人生 > >Linux網路篇,ssh原理及應用

Linux網路篇,ssh原理及應用

一、對稱加密與非對稱加密

    對稱加密: 加密和解密的祕鑰使用的是同一個.
    非對稱加密: 非對稱加密演算法需要兩個金鑰:公開金鑰(publickey)和私有金鑰;簡稱公鑰和私鑰

對稱加密

 

 



對稱加密的密碼強度高、較難破解。但是祕鑰的儲存成為了一個重要的問題,特別是如果機群龐大的時候,一旦某個客戶端暴露了祕鑰,會給整個系統帶來嚴重的安全問題

非對稱加密

 

 



公鑰加密後的密文,只能通過對應的私鑰進行解密。而通過公鑰推理出私鑰的可能性微乎其微。私鑰是Server端獨有,而且私鑰並不會在網路中進行傳輸,這一定程度上保證了資料的安全性,充分利用了非對稱加密的特性


非對稱加密的過程:

① 客戶端向伺服器傳送請求,並得到伺服器傳來的公鑰

②-④ 客戶端利用從伺服器得到公鑰對登入資料(使用者名稱和密碼或其他驗證資料)進行加密;然後將加密後的資料傳給伺服器

⑤-⑦ 伺服器利用私鑰將從客戶端收到的資料進行解密。並將解密後的資料與正確資料(資料庫中儲存的使用者名稱和密碼或其他)進行校驗,根據得到校驗結果允許或拒絕此次登入請求;並將最後結果通知客戶端
二、非對稱加密的安全性問題

從上面的分析中,我們得知了非對稱加密確實解決了一定的安全問題,那麼它就一定安全了嗎?答案是絕對否定的。因為通過上面的分析,我們得知客戶端對於伺服器方是沒有認證的。而這時如果一個假冒的伺服器方將自己的公鑰發給了客戶端,它可以很簡單的把客戶端的加密資料進行解密,因為公鑰和私鑰都是它自己的啊。這樣客戶端的資料就被竊取了。這種攻擊方式叫做中間人攻擊。其原理如下:

 

 



三、SSH原理

因為非對稱加密體質非常耗費系統資源,因此SSH僅將非對稱加密用於登入連線過程,而連線後的資料互動採用了對稱加密。我們通過上面得知,即使是非對稱加密也存在一個問題——如何解決中間人攻擊?

https中針對中間人攻擊採取了公證機制——通過CA來進行公證,可是SSH的公鑰和私鑰都是自己生成的,沒法公證。只能通過Client端自己對公鑰進行確認。

因此,SSH引入了known_hosts檔案。客戶端的每次連線請求,伺服器都會將相關資訊與known_hosts檔案中的資訊進行匹配,如果是第一次連線,伺服器會將相關資訊儲存在known_hosts檔案中,在這個過程中,伺服器會請求客戶端的使用者進行確認;拿什麼確認呢?公鑰指紋!什麼是公鑰指紋?


因為公鑰很長,長達1024位甚至2048位或更長,如果比較這麼長的資料會很耗費系統資源。所以這裡的公鑰指紋是指利用MD5演算法對公鑰進行加密後形成的128位的一個數據;客戶端利用這個從伺服器獲取到的公鑰加密後的公鑰指紋和真正伺服器的公鑰(需提前獲取)加密後的公鑰指紋進行比較,如果一致的話,使用者需要輸入yes確認此次認證,如果不一致的話,有可能遭到了中間人攻擊,使用者需要輸入no對此次認證進行中斷,防止資料洩露。如圖:

 

 



如果不是第一次連線,客戶端(登入方)會將自己的known_hosts檔案中的公鑰指紋與伺服器傳來的公鑰指紋進行對比,如果一致,連線會繼續,客戶端輸入使用者名稱和密碼直接登入就可以。如果不一致,客戶端會判定此次連線遭到了中間人攻擊,並阻止此次連線,如圖:

 

 



如果是使用者主動重新部署了SSH伺服器,並且確認此次連線無誤的話,使用者需要在客戶端(登入方)的known_hosts檔案中刪除與該地址對應的公鑰資料,重新進行SSH連線認證即可
四、SSH免密登入原理

基於口令的認證方式每次登入都需要輸入密碼,這是比較麻煩的一件事情,為此,SSH引入了基於公鑰認證的登入方式,這也是SSH免密登入的依據,那麼基於公鑰認證的登入方式具體步驟是怎樣的呢?

 

 



1.登入端A生成公鑰和私鑰,並(手動)將公鑰追加到被登入端B的 authorized_key 檔案中

2.登入端A向被登入端B傳送連線請求,並將公鑰傳送給被登入端B

3.被登入端B接受登入端A發來的公鑰,並將該公鑰與自己的 authorized_key 檔案中的所有儲存的公鑰進行比較,如果並未發現有此公鑰存在,則登入端A需要進行口令認證與被登入端B進行連線。如果在 authorized_key 檔案中找到了與登入端A傳送的公鑰相同的公鑰,則生成隨機數R,並利用公鑰加密該隨機數得到 publickey(R),最後被登入端B將 publickey(R) 傳給登入端A

4.登入端A利用私鑰對 publickey(R) 進行解密得到R,登入端A和被登入端B通訊時會產生一個會話ID(sessionKey)。登入端A利用MD5演算法將R和ID進行加密,並將加密後的資料傳給被登入端B

5.被登入端B也利用MD5演算法對R(被登入端B在第3步中隨機生成的)和會話ID(二者的會話屬於同一會話,因此會話ID sessionKey是相同的)進行加密。並將加密後的資料與第四步登入端傳來的加密資料進行比較,如果相同,則允許此次登入端A的連線請求,並與之建立連線。如果不同,則二者繼續進行基於口令認證的連線請求

注意:

免密登入的任何一個環節出現不匹配時,登入端A和被登入端B的連線將會被轉換為基於口令的認證連線
五、用生活例項來演示免密登入

老闆Boss在伺服器B上建立了一個userb使用者,可是他回到家後想用客戶機A使用userb使用者連線伺服器B

首先,老闆在自己辦公室的客戶機A上建立了祕鑰,包括公鑰和私鑰。老闆把公鑰傳到公司的伺服器S上;可是這個老闆不可能把公司的所有事情都包了,那樣太累了,於是他在公司的伺服器S上做了一個允許訪問該伺服器的  "電腦編號-各級部門經理賬號"  認證列表,該認證列表中包含了公司的所有部門經理的辦公電腦的MAC地址和其對應的不同級別的使用者賬號。只有被該列表包含的   "電腦編號-各級部門經理賬號"   才有資格免密登入此伺服器進行辦公

有一天老闆想要統計公司今年的盈虧狀況,所以要檢視公司的賬單,老闆在客戶機A上使用SBoss登入伺服器S;當伺服器S收到老闆的連線請求後,伺服器B上的   "電腦編號-各級部門經理賬號"   會判斷自己裡邊是否有與客戶機A通過SBoss登入伺服器的認證,如果沒有的話,老闆還得輸入SBoss在伺服器B上的密碼進行登入;如果有的話,伺服器B會發送一個用客戶機A上的公鑰加密的隨機數給客戶機A,客戶機A用私鑰解密這個隨機數,並用MD5演算法對該隨機數和當前會話ID組合的資料進行加密,然後將加密後的資料傳送給伺服器S,伺服器S也利用MD5演算法對該隨機數和當前會話ID進行加密,並與客戶機A傳來的加密資料進行對比。根據對比結果決定是否允許此次免密登入請求

上文中的抽象事物與ssh相關檔案對應關係如下:

老闆 ===> 操作計算機使用者的相關管理人員

伺服器S ===> SSH服務端

客戶端A ===> SSH客戶端

SBoss ===> SSH服務端管理員賬號

公鑰 ===> SSH客戶端的 id_rsa.pub 檔案

私鑰 ===> SSH客戶端號的 id_rsa 檔案

"電腦編號-各級部門經理賬號" ===> SSH服務端的 authorized_keys 檔案
六、SSH免密登入實戰
單向免密登入方法一

1.客戶端A執行以下命令,生成祕鑰

    ssh-keygen -t rsa
     
     
    注意:一路回車即可

2.客戶端A執行以下命令,將公鑰傳給服務端B

ssh-copy-id [伺服器B的IP地址]

3.客戶端A執行以下命令(注意:先不要執行它,若B出現登入不了A的狀況再執行)

ssh-add id_rsa

4.伺服器A執行以下命令驗證

    ssh [服務端B IP地址]
    或
    ssh [服務端B上的使用者名稱]@[服務端B IP地址]

5.如果出錯的話,可能是以下幾種原因

    1.兩臺機器均設定相應的免密登入
    2.
    chmod 700 /home/[使用者名稱]/.ssh/
    chmod 600 /home/[使用者名稱]/.ssh/authorized_keys
    3.修改/etc/ssh/ssh_config配置檔案如下關鍵字
    GSSAPIAuthentication no

單向免密登入方法二

1.客戶端A生成公鑰和祕鑰

    ssh-keygen -t rsa
     
     
    注意:
    一路回車即可

2.客戶端A將公鑰傳給服務端B

scp id_rsa.pub [email protected]:~/.ssh/

3.服務端B將A的公鑰追加到自己的 authorized_keys 檔案中(如果沒有該檔案,則先新建再追加)

    touch authorized_keys
    cat id_rsa.pub >> authorized_keys

4.客戶端A執行以下命令(注意:先不要執行它,若B出現登入不了A的狀況再執行)

ssh-add id_rsa

5.客戶端A登入服務端B

ssh [email protected]

雙向免密登入
 

1..編輯主機A和主機B的sshd配置檔案   vim /etc/ssh/ssh_config

    RSAAuthentication yes
    PubkeyAuthentication yes
    AuthorizedKeysFile   .ssh/authorized_keys

2.重啟 sshd 服務

service sshd restart

3.主機A新建使用者usea,主機B新建使用者userb

    主機A的操作:
    useradd usera
    passwd usera
     
     
    主機B的操作:
    useradd userb
    passwd userb

4.主機A使用usera使用者登入,建立ssh祕鑰

    su usera
     
    ssh-keygen -t rsa   (一直回車)

5.主機B使用userb使用者登入,建立ssh祕鑰

    su userb
    ssh-keygen -t rsa   (一直回車)

6.主機A使用usera在  ~/.ssh/ 目錄下新建authorized_keys檔案,並且將usera和userb的公鑰(id_rsa.pub)複製到該檔案中

    cd ~/.ssh/
    touch authorized_keys
     
     
     
     
    將主機A的usera公鑰複製進主機A的usera的目錄下的 authorized_keys 檔案
     
    cat id_rsa.pub > authorized_keys
     
     
     
    將主機B的userb公鑰追加到主機A的usera的目錄下的 authorized_keys 檔案
     
    ssh userb@[主機B的IP地址] cat /home/userb/.ssh/id_rsa.pub >> authorized_keys

7.主機A使用usera使用者執行以下命令

    chmod 700 /home/usera/.ssh/
    chmod 600 /home/usera/.ssh/authorized_keys

8.將主機A的使用者usera的~/.ssh目錄下的兩個配置檔案 authorized_keys、known_hosts 複製到主機B的userb使用者的~/.ssh目錄下

scp authorized_keys known_hosts userb@[主機B的IP地址]:~/.ssh/

9.主機B使用userb使用者設定指定檔案許可權

    chmod 700 /home/userb/.ssh/
    chmod 600 /home/userb/.ssh/authorized_keys

10.到此,主機A和B就可以通過usera和userb通過ssh免密登入了

    ssh userb@[主機B的IP地址]
    ssh usera@[主機A的IP地