如何以兩種方式保護 SFTP 連接
我想在我的電腦和伺服器之間建立 SFTP 連接。
我在我的電腦上生成了一對密鑰,並將我的公鑰寫入伺服器上的“authorized_keys”文件中。我確信它可以工作,因為當我嘗試從沒有我的私鑰的電腦(我知道,沒有其他人應該擁有它)上連接時,會詢問密碼。
根據這張圖片,我的伺服器是 Bob,我的電腦是 Alice。當伺服器發送消息時,它使用我的公鑰加密它,我使用我的私鑰解密它。但是如果我向伺服器發送消息,它沒有加密,是嗎?如果是,它是如何加密的?
根據我對非對稱密碼學的理解,如果我想加密我發送的消息,我必須在伺服器上生成一對密鑰並將其公鑰放在我電腦的“authorized_keys”文件中,對嗎?
如何驗證連接在兩種方式(發送和接收)上都是安全的?
謝謝!
SSH 連接中發生了 2 件大事:
伺服器認證和加密
伺服器向您發送他的公鑰,您必須信任它。您可以在此之前手動獲取它,並且在理想的安全環境中,在您知道他的公鑰正確之前,您永遠不會連接到 SSH 伺服器。CA 的用途是,它們簽署伺服器公鑰。在大多數 SSH 環境中,您只需接受伺服器的公鑰作為客戶端。這是最初的“您要信任此伺服器並將其添加到您的列表嗎?”-問題。伺服器公鑰儲存在 Linux 系統客戶端的 .ssh/known_hosts 下。
連接的實際加密不是不對稱的。 這是許多人對私鑰/公鑰加密的巨大誤解。這太慢了。真正發生的是伺服器和客戶端生成一個共享密鑰(又名長密碼),這是一個會話的對稱加密。客戶端和伺服器使用非對稱加密,直到他們同意共享秘密。之後,他們切換到使用此共享密鑰作為密鑰的對稱加密。
這種類型的加密是最常見的,稱為混合加密,儘管幾乎每個人(錯誤地)都將其稱為非對稱加密。
“真正的”純非對稱加密的一個例子是使用 PGP 的郵件加密,因為每封郵件都是非對稱加密的。
另外:共享秘密不會永久儲存,每個新會話都會協商一個新的共享秘密。
客戶認證
這是完全不同的事情,這可以是密碼和/或基於密鑰的身份驗證。客戶端的公鑰(位於~/.ssh/id_rsa.pub 下)必須存在於伺服器的authorized_keys 文件中(例如,對於root:/root/.ssh/authorized_keys)。在
ssh-copy-id
存在之前,人們會做類似的事情cat ~/.ssh/id_rsa.pub | ssh root@server "cat >> ~/.ssh/authorized_keys"
將您的密鑰附加到伺服器授權密鑰。
客戶端證書不用於加密,僅用於身份驗證。
**重要編輯:**使文章更清楚,
ssh-copy-id
以防止誤解。到目前為止,
ssh-copy-id
這是將客戶端公鑰添加到伺服器的最佳實踐方式。我剛剛發布了cat
方法來顯示雙方操作了哪些文件,以顯示私鑰和公鑰之間的連接以及它們是如何儲存的。使用 cat 時可能會忘記一個“>”,例如它會覆蓋您的授權密鑰文件(在 Linux 中“>>”表示追加,“>”表示覆蓋)。直接操作配置文件時要負責。感謝@Rallph 指出這一點。