介紹
SSH,或稱安全外殼協定,是一種安全協議,也是安全地管理遠程伺服器的最常見方式。SSH使用多種加密技術,提供了一種在兩個單方之間建立加密連接、對彼此進行身份驗證以及來回傳送指令和輸出的機制。
在本指南中,我們將探討SSH所使用的底層加密技術以及建立安全連接所使用的方法。這些信息有助於理解加密的各個層次以及形成連接並對雙方進行身份驗證所需的不同步驟。
理解對稱加密、非對稱加密和雜湊
為了保護信息的傳輸,SSH在交易的各個階段使用了多種不同類型的數據操作技術。這些包括對稱加密、非對稱加密和雜湊形式。
對稱加密
加密和解密數據的組件關係決定了加密方案是對稱的還是非對稱的。
對稱加密是一種加密類型,其中一個密鑰可以用於將消息加密給對方,也可以用於解密接收到的來自其他參與者的消息。這意味著持有密鑰的任何人都可以對任何持有密鑰的其他人進行加密和解密。
這種類型的加密方案通常被稱為“共享秘密”加密或“密鑰”加密。通常只有一個密鑰用於所有操作,或者一對密鑰,其中關係是可以發現的,並且很容易推導出對方的密鑰。
對稱密鑰被SSH用於加密整個連接。與一些用戶的假設相反,可以創建的公共/私有非對稱密鑰對僅用於身份驗證,而不是加密連接。對稱加密甚至可以保護密碼身份驗證免受窺探。
客戶端和伺服器都共同努力建立這個金鑰,而結果的密鑰永遠不會被外部方知曉。這個密鑰是通過一個稱為金鑰交換演算法的過程創建的。這種交換導致伺服器和客戶端通過共享某些公共數據並使用某些秘密數據對它們進行操作,最終獨立地得出相同的密鑰。這個過程稍後將會詳細解釋。
通過此程序創建的對稱加密金鑰是基於會話的,並且構成了在伺服器和客戶端之間傳送的數據的實際加密。一旦確定了這一點,剩下的數據必須使用這個共享的秘密進行加密。這是在對客戶端進行身份驗證之前完成的。
SSH 可以配置為使用各種不同的對稱加密系統,包括高級加密標準(AES)、Blowfish、3DES、CAST128 和 Arcfour。伺服器和客戶端都可以決定一個按偏好排序的支持的加密算法列表。客戶端列表中可在伺服器上使用的第一個選項將作為雙向的加密算法。
在 Ubuntu 20.04 上,客戶端和伺服器都默認配置如下:
[email protected]
aes128-ctr
aes192-ctr
aes256-ctr
[email protected]
[email protected]
這意味著如果兩台Ubuntu 20.04機器互相連接(在不通過配置選項覆蓋默認密碼的情況下),它們將始終默認使用[email protected]
加密其連接。
非對稱加密
非對稱加密與對稱加密不同,因為要將數據單向傳送,需要兩個相關聯的鍵。其中一個鍵被稱為私鑰,而另一個被稱為公鑰。
公鑰可以與任何一方自由共享。它與其配對的鍵相關聯,但私鑰不能從公鑰推導出來。公鑰與私鑰之間的數學關係允許公鑰加密僅能由私鑰解密的消息。這是單向能力,這意味著公鑰無法解密其編寫的消息,也無法解密私鑰可能發送的任何內容。
私鑰應該完全保密,絕不能與其他方共享。這是公鑰范式正常運作的關鍵要求。私鑰是唯一能夠解密使用相應公鑰加密的消息的組件。基於這個事實,任何能夠解密這些消息的實體都表明他們控制著私鑰。
SSH 在幾個不同的地方使用非對稱加密。在用於建立對稱加密(用於加密會話)的初始金鑰交換過程中,會使用非對稱加密。在此階段,雙方產生臨時金鑰對並交換公鑰,以產生用於對稱加密的共享秘密。
關於 SSH 的更多討論中,非對稱加密的應用來自 SSH 基於金鑰的身份驗證。SSH 金鑰對可用於將客戶端驗證到服務器。客戶端創建金鑰對,然後將公鑰上傳到它希望訪問的任何遠程服務器。這放置在遠程服務器上使用者帳戶家目錄中的 ~/.ssh
目錄中名為 authorized_keys
的文件中。
在建立用於安全通信的對稱加密後,客戶端必須進行身份驗證才能被允許訪問。服務器可以使用此文件中的公鑰將挑戰訊息加密給客戶端。如果客戶端能夠證明它能夠解密此訊息,則表明它擁有相應的私鑰。然後服務器可以為客戶端設置環境。
雜湊
SSH利用的另一种数据操作形式是加密散列。加密散列函数是创建一组信息的简洁“签名”或摘要的方法。它们的主要区别特征是它们永远不会被反转,它们几乎不可能被可预测地影响,并且它们实际上是独一无二的。
使用相同的散列函数和消息应该产生相同的散列;修改数据的任何部分应该产生完全不同的散列。用户不应该从给定的散列中产生原始消息,但他们应该能够判断给定消息是否产生了给定的散列。
基于这些属性,散列主要用于数据完整性和验证通信的真实性。在SSH中的主要用途是使用HMAC,或基于散列的消息认证码。这些用于确保接收到的消息文本是完整且未修改的。
作为之前概述的对称加密协商的一部分,将选择一种消息认证码(MAC)算法。通过处理客户端可接受的MAC选择列表来选择算法。服务器支持的列表中的第一个将被使用。
在加密协商之后发送的每个消息都必须包含一个MAC,以便对方可以验证数据包的完整性。MAC是从对称共享密钥、消息的数据包序列号和实际消息内容计算出来的。
MAC本身作为数据包的最后一部分发送到对称加密区域之外。研究人员通常建议先加密数据,然后计算MAC。
了解SSH的工作原理
您可能已经对SSH的工作原理有了基本的了解。SSH协议采用客户端-服务器模型来验证两个参与方并加密它们之间的数据。
服务器组件在指定的端口上监听连接。它负责协商安全连接、验证连接方的身份,并在凭据被接受时生成正确的环境。
客户端负责开始与服务器的初始传输控制协议(TCP)握手、协商安全连接、验证服务器身份是否与先前记录的信息匹配,并提供凭据进行身份验证。
SSH会话分为两个独立的阶段进行建立。第一阶段是达成一致并建立加密以保护未来的通信。第二阶段是验证用户并确定是否应该授予对服务器的访问权限。
協商會話加密
當客戶端建立TCP連接時,伺服器會回應支援的協議版本。如果客戶端能夠匹配其中一個可接受的協議版本,則連接會繼續進行。伺服器還會提供其公共主機金鑰,客戶端可以使用該金鑰來檢查是否為預期的主機。
此時,雙方將使用一種稱為Diffie-Hellman算法的版本來協商會話金鑰。該算法(及其變體)使每個派對能夠將自己的私有數據與來自其他系統的公共數據相結合,從而得到相同的秘密會話金鑰。
會話金鑰將用於加密整個會話。用於此部分程序的公鑰和私鑰對與用於將客戶端驗證為伺服器的SSH金鑰完全分開。
經典Diffie-Hellman程序的基礎是:
- 雙方同意一個大質數,該質數將作為種子值。
- 雙方同意一個加密生成器(通常為AES),該生成器將用於以預定方式操作值。
- 每個派對都獨立地想出另一個質數,該質數對其他派對保密。該數字用作此交互作用的私鑰(與用於驗證的私有SSH金鑰不同)。
- 生成的私鑰、加密產生器和共享質數用於生成由私鑰衍生但可與對方共享的公鑰。
- 然後,雙方交換他們生成的公鑰。
- 接收方使用自己的私鑰、對方的公鑰和原始共享質數計算出一個共享密鑰。儘管每個當事方都是獨立計算的,使用相對的私鑰和公鑰,但結果將是相同的共享密鑰。
- 然後,共享密鑰用於加密後續的所有通信。
這個過程允許每個當事方平等參與生成共享密鑰,不允許一方控制該密鑰。它還完成了生成相同的共享密鑰的任務,而無需將該信息通過不安全的通道發送。用於連接其餘部分的共享密鑰加密稱為二進製封包協議。
生成的密鑰是對稱密鑰,這意味著用於加密消息的相同密鑰可以在另一端用於解密。其目的是將所有進一步的通信包裹在無法被外部解密的加密隧道中。
建立會話加密後,開始用戶身份驗證階段。
驗證使用者對伺服器的存取權限
接下來的步驟涉及對使用者進行驗證並決定其存取權限。根據伺服器接受的方式,有幾種可以用於驗證的方法。
一般方法是密碼驗證,當伺服器提示客戶端輸入他們嘗試登錄的帳戶密碼時,就是使用這種方法。密碼通過協商的加密發送,因此對外部方便是安全的。
儘管密碼會被加密,但由於對密碼複雜性的限制,一般不建議使用這種方法。自動化腳本可以很容易地破解一般長度的密碼,相比其他驗證方法,這種方法更容易受到攻擊。
最受歡迎且推薦的替代方法是使用SSH金鑰對。SSH金鑰對是非對稱密鑰,意味著兩個相關聯的鑰匙具有不同的功能。
公鑰用於加密只能使用私鑰解密的數據。公鑰可以自由共享,因為儘管它可以為私鑰加密,但沒有方法可以從公鑰中推導出私鑰。
使用SSH金鑰對進行驗證是在前一節描述的對稱加密建立之後開始的。該過程如下:
- 客戶端開始向伺服器發送想要進行身份驗證的金鑰對的ID。
- 伺服器檢查客戶端嘗試登錄的帳戶的
authorized_keys
文件,以查找金鑰ID。 - 如果文件中找到具有匹配ID的公鑰,伺服器會生成一個隨機數並使用該公鑰將該數字加密。
- 伺服器將這個加密消息發送給客戶端。
- 如果客戶端實際擁有相應的私鑰,它將能夠使用該金鑰解密消息,顯示原始數字。
- 客戶端將解密後的數字與用於加密通信的共享會話金鑰結合,並計算此值的MD5雜湊。MD5是一種使用雜湊函數生成128位雜湊值的消息摘要算法。
- 然後,客戶端將此MD5雜湊作為對加密數字消息的回答發送回伺服器。
- 伺服器使用相同的共享會話金鑰和它向客戶端發送的原始數字來計算自己的MD5值。它將自己的計算與客戶端發送回來的計算進行比較。如果這兩個值匹配,則證明客戶端擁有私鑰,客戶端被驗證了。
總之,密鑰的不對稱性使得伺服器能夠使用公鑰加密訊息發送給客戶端。然後,客戶端可以通過正確解密訊息來證明自己持有私鑰。在此模型中使用的兩種加密類型(對稱共享密鑰和非對稱公/私鑰)能夠分別利用它們特定的優勢。
結論
瞭解 SSH 中的連接協商步驟和加密層可以幫助您更好地理解當您登錄到遠程伺服器時發生了什麼。現在您可以認識各種組件和算法之間的關係,並理解所有這些部分如何組合在一起。欲瞭解更多關於 SSH 的資訊,請查閱以下指南:
- 如何在 Linux 伺服器上配置 SSH 基於金鑰的驗證
- 如何使用 SSH 連接到遠程伺服器
- 如何設置 SSH 金鑰 適用於不同的操作系統
- SSH 基礎知識:使用 SSH 伺服器、客戶端和金鑰