關於SSH加密和連接的若干事兒

來自專欄蟲蟲搜奇1 人贊了文章

概述

SSH全稱secure shell,是一種網路傳輸協議,是最常用的安全管理遠程伺服器的協議和工具集。SSH協議中使用多種加密技術保證在用戶終端和伺服器之間建立加密安全連接,連接雙方通過互相握手驗證,並通過加密的通道傳遞管理命令和執行結果。本文中,蟲蟲將以此為話題和大家一起學習下SSH協議中涉及的基礎加密技術以及怎麼利用這些技術構建安全的通訊。此信息可用於瞭解各種常見的加密技術,SSH加密層、安全連接構建步驟以及雙方互相驗證步驟能內容。

SSH演算法

SSH為了確保信息的安全傳輸,從連接發起到完成各階段的各個點SSH協議採用了許多不同類型的數據加密技術,包括可逆的對稱加密,非對稱加密以及不可逆的哈希散列。

對稱加密

加密和解密數據的時候相互對應的關係決定了加密方案是對稱加密還是非對稱的加密。最常見的加密方法是對稱加密,對稱加密是一種加密類型,在加密和解密時候使用同一個密鑰。所以,在對稱加密中,任何人都可以利用該密鑰加密消息和解密任何使用它加密的消息。這種加密方法通常也稱為"共享密鑰"加密或"密鑰"加密。通常只有一個密鑰用於所有加解密操作,或者使用一對密鑰,但是這對密鑰可以互相簡單推算出彼此。

SSH數據傳輸時候基本上所有過程都是使用對稱密鑰來加密。只有在剛開始創建連接階段和身份認證握手階段才使用非對稱加密。客戶端和伺服器都通過協商一致的演算法生成密鑰,並互相通過可信通道交換密鑰,這個過程叫密鑰交換。通過密鑰交換伺服器和客戶端可共享某些公共數據結合自己隱祕數據通過演算法各自獲得相同的共享密鑰。後面第二部分蟲蟲會對此過程進行詳細解釋。此過程創建的對稱加密密鑰是基於會話的,然後通過該會話在伺服器和客戶端之間發送的加密數據。會話一旦創建,此後所有數據數據都通過共享密鑰加密。在對稱加密過程中最重要的是加密演算法。SSH中支持各種不同的加密演算法,主要有AES,Blowfish,3DES,CAST128和Arcfour等等。伺服器和客戶端可以根據優先順序協商其支持的密碼列表。伺服器上可用的客戶端列表中的第一個選項就是密碼演算法。

在蟲蟲的Centos 中,openssh7.4是默認的演算法為在連接github的git服務過程中,ssh協商的演算法為:

[email protected],aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc這樣連接協商後的結果會使用[email protected]做認證密碼,共享加密演算法為aes256-ctr。

我們注意到加密演算法使用了ChaCha20-Poly1305,它是由Google 推出新的加密套件並,具有以下優勢:ChaCha20-Poly1305 避開了現有發現的所有安全漏洞和攻擊;Poly1305 的輸出是 16 位元組,而 HMAC-SHA1 是 20 位元組,可以節省 16% 的 overhead 消耗。

非對稱加密

非對稱加密與對稱加密的不同之處在於,為了在單個方向上發送數據,需要兩個相關的一組密鑰。其中一個密鑰稱為私鑰,而另一個稱為公鑰。公鑰可以公開共享。私鑰與之配,無法通過公鑰計算出公鑰。公鑰和私鑰之間從數學的特性保證公鑰加密的信息只能由私鑰解密,私鑰加密的信息也不能用公鑰解密。

非對稱加密中是用最廣泛RSA演算法就用到了利用大素數方便生成大整數(2048),但是該大素數則幾乎無法分解的特性。最近熱門的阿蒂亞老教授宣佈證明《黎曼猜想》,就是用關於大素數分佈的規律,如果該證明有效,能發現大素數的分佈規律,則可能會影響大素數分解,讀廣泛使用的RSA演算法可能產生影響。

有意思的是RSA演算法曾暴露過一醜聞,數學家們發現,演算法中曾經使用的一個隨機函數DUAL_EC_DRBG被NSA做了手腳,植入了後門,可以過這個這個演算法來推算密鑰。NSA利用該演算法監控和竊取一些加密信息。

我們知道密鑰對中的私鑰唯一用來解密消息的密鑰,所以私鑰要絕對保密,不能泄露給任何人。實踐中除了保證私鑰的存放外,SSH中用來進行系統認證的私鑰蟲蟲建議應該對其設置密碼,防止萬一泄露,沒有密碼別人也用不了。如果是系統之間做自動程序和訪問git操作的密鑰,為了方便可以不設置密碼。SSH在建立對稱加密(用於加密會話)的初始密鑰交換過程中,使用了非對稱加密。在該階段,雙方都生成臨時密鑰對並互相交換公鑰,以便產生將用於對稱加密的共享密鑰。SSH還通過使用非對稱加密的來進行SSH密鑰的身份驗證:客戶端創建密鑰對,然後將公鑰配置到遠程伺服器上,具體為用戶帳戶目錄的~/.ssh目錄下名為authorized_keys文件,每一行對應一個公鑰。收到用戶請求後,伺服器端利用authorized_keys中公鑰比對證書指紋,找到用戶公鑰加密一個消息,並對消息生成哈希串附加到消息後返回給客戶端。如果客戶端能利用自己私鑰解密消息,並用自己手中伺服器端的公鑰加密驗證串給伺服器,服務用自己私鑰解密消息完成認證,這樣證書交換和身份認證過程完成(密鑰交換過程中各自獨立計算出了對稱加密的共享密鑰),開始進行加密數據傳輸。

哈希散列

SSH協議中還用到了加密散列。哈希散列演算法是一種不可逆演算法,除非你知道原始值生成散列對比,否則你永遠無法通過散列算出原始值(但是可以通過哈希碰撞,就是利用可能字串或者構造彩虹表大量生成哈希進行對比,目前MD5和SSA1已經不再絕對安全)。散列演算法常用於創建信息 "簽名"或生成一組信息摘要,用來保證信息傳輸過程中沒有被人認為篡改。因為對數據的任何修改都會導致其哈希完全不一致。注意:目前對MD5和SHA-1可以通過大量計算生成利用精心設置的數據將數據內容修改,但是能保證哈希不變。下圖就是谷歌去年2月份的SHA-1碰撞的實驗,兩個背景完全不一樣的pdf,但是生成哈希完全一樣。

在SSH對稱加密協商的過程中,選擇消息認證碼(MAC)的生成演算法就是用的哈希演算法。協商發送的每條加密信息都會附加公開的該信息MAC作為消息的一部分,以便於另一方可以用它驗證數據包的完整性。 MAC根據對稱共享密鑰,消息的分組序列號和實際信息組成的內容算出來的。MAC作為數據包的最後部單獨發送。

常見加密演算法比較

下面參考網上資料,我們對常見加密演算法比較圖示:

常用的對稱加密演算法:

常用非對稱演算法比較

常用散列演算法比較

SSH工作原理

我們上面在第二部部分SSH演算法中概要提到了SSH的工作原理,本部分蟲蟲會詳細介紹下。SSH協議使用客戶端/伺服器(CS)模式來雙方認證並彼此加密傳輸數據。伺服器組件偵聽指定的埠(默認22),接受連接。伺服器端(SSHD)負責協商安全連接,驗證客戶端,並在完成認證後,初始化shell環境。客戶端負責開始與伺服器的初始TCP握手,協商安全連接,驗證伺服器的身份(記錄的信息匹配,~/.ssh/known_hosts中保存的證書,第一鏈接時候需要手動輸入Yes,確認鏈接該伺服器,並記錄域名,埠,IP和公鑰),以及提供身份驗證密碼(密鑰)。SSH會話分兩個階段建立:基於Diffie-Hellman演算法的密鑰交換過程和用戶認證階段。密鑰交換(Diffie-Hellman)當客戶端建立TCP連接時,伺服器會使用它支持的協議版本進行響應。如果客戶端可以匹配其中一個可接受的協議版本,則繼續連接。伺服器還提供其公共主機密鑰,客戶端可以使用該密鑰來檢查這是否是預期要訪問的主機。雙方使用稱為Diffie-Hellman演算法協商會話密鑰。該演算法使得每一方能夠將他們自己的私有數據與來自另一系統的公共數據組合以算出相同的共享會話密鑰。

該密鑰交換過程步驟如下:1、雙方約定一個大的素數,它將它作為隨機種子。2、雙方約定加密演算法(通常為AES),此後利用該演算法加密數據。3、會話雙方獨各生成另一個素數,該數字保密。該素數用用於雙發交互的臨時私鑰。4、利用各自私鑰,共享大素數和加密演算法生成公鑰,並與對方交換公鑰。5、接受方利用自己的私鑰,對方公鑰和原始共享素數來計算共享密鑰。雖然這個過程各自獨立,都使用自己私鑰和對方公鑰,所以能生成相同共享密鑰。7.然後使用共享密鑰加密此後的所有通信。生成的祕密是對稱密鑰,所以雙方都可以解密消息。該過程保證了,隨後數據通信位於一個加密隧道中。用戶認證

會話加密通道建立後,SSH開始進入用戶認證階段。該階段完成用戶驗證和訪問許可權確定。根據服務端的配置(sshd_config),可能使用一下幾種身份驗證方法:

1、密碼驗證:伺服器提示客戶端輸入用戶名和密碼。密碼通加密隧道發送,對外方是安全的。由於該方法存在暴力破解,以及容易泄密的可能較大,蟲蟲不建議使用此方法,尤其是直接使用root登陸,危害性更大。2、使用openssh密鑰對認證:

具體步驟如下:(1)、客戶端首先向伺服器發送要對其進行身份驗證的密鑰對的用戶名。(2)、伺服器檢查客戶端嘗試登錄用戶帳戶的下authorized_keys文件。(3)、如果在文件中找到具有匹配公鑰,則伺服器生成隨機數並使用公鑰加密該隨機數。並該加密消息發送給客戶端。

(4)、如果客戶端利用自己的私鑰解密消息(如果可以的話),從而顯示原始數。

(5)、客戶端將解密的原始數和用於加密通信的共享會話密鑰組合,計算他們的哈希值。客戶端將該哈希值發回伺服器,作為回應。(6)、伺服器使用相同的共享會話密鑰和此前(步驟4)發送給客戶端的原始編號來自行計算哈希值。將計算結果和客戶端發回的哈希值對比。如果這兩個值匹配,則證明客戶端擁有私鑰並且客戶端已經過身份驗證。3、它認證方法:比如結合ldap的認證,雙因子認證,以及更安全的Kerberos地獄狗認證以後有機會再做介紹,此處不再贅述

本文中,蟲蟲結合SSH過程,介紹常見的加密演算法,以及基於密鑰交換和用戶認證等,希望能幫助你理清SSH認證的過程。蟲蟲在此需要指出的是,類似的體系也在其他安全通訊中使用,比如用的比SSH更廣泛的HTTPS的SSL/TSL技術。
推薦閱讀:
查看原文 >>
相關文章