如何以雙向方式保護 SFTP 連接

如何以雙向方式保護 SFTP 連接

我想在我的電腦和伺服器之間設定 SFTP 連線。

我在電腦上產生了一對金鑰,並將公鑰寫入伺服器上的「authorized_keys」檔案中。我確信它有效,因為當我嘗試從沒有我的私鑰的電腦進行連接時(我知道,其他人不應該擁有它),系統會要求輸入密碼。

根據這個圖片,我的伺服器是 Bob,我的電腦是 Alice。當伺服器發送訊息時,它使用我的公鑰對其進行加密,我使用我的私鑰對其進行解密。但是如果我向伺服器發送訊息,它不會加密,不是嗎?如果是的話,是如何加密的?

根據我對非對稱加密的理解,如果我想加密我發送的訊息,我必須在伺服器上產生一對金鑰並將其公鑰放在我電腦的「authorized_keys」檔案中,對吧?

我怎麼能夠核實連接在兩種方式(發送和接收)上都是安全的?

謝謝!

答案1

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"

將您的金鑰附加到伺服器的authorized_keys中。

客戶端憑證不用於加密,僅用於身份驗證。

重要編輯:ssh-copy-id為防止誤解,貼文更加明確。

到目前為止,ssh-copy-id這是將客戶端公鑰添加到伺服器的最佳實踐方法。我剛剛發布了cat顯示雙方操作哪些文件的方法,以顯示私鑰和公鑰之間的連接以及它們的儲存方式。

當使用 cat 時,有忘記「>」的風險,例如這會覆蓋您的authorized_keys檔案(在Linux中「>>」表示追加,「>」表示覆蓋)。直接操作設定檔時要負責。感謝@Rallph 指出這一點。

答案2

伺服器有自己的密鑰對。當您第一次連接到 SSH 伺服器時,如果您信任伺服器的主機金鑰(= 公鑰),您應該會收到 SSH/SFTP 用戶端的提示。

只有當您仔細驗證它確實是伺服器的合法公鑰後,您的連線才是安全的。看我的文章從哪裡取得 SSH 主機金鑰指紋來授權伺服器?

另請注意,您的金鑰對和伺服器的金鑰對實際上都不用於加密資料。那是一種更複雜的方式。

也可以看看:

相關內容