基於 SSH 密鑰的身份驗證:known_hosts 與 authorized_keys
我閱讀了有關在 Linux 中設置 ssh 密鑰的資訊並有一些問題。如果我錯了糾正我…
假設主機 tr-lgto 想要使用 ssh 連接到主機 tr-mdm。如果我們想確定它是真正的 tr-mdm,我們會在 tr-mdm 上生成一對密鑰,並將公鑰添加到
known_hosts
tr-lgto 上。如果 tr-mdm 想要檢查它是不是真正的 tr-lgto,那麼 tr-lgto 必須生成一個密鑰對並將公鑰添加到 tr-mdmauthorized_keys
上。問題 1:known_hosts 文件中沒有使用者欄位,只有 IP 地址和主機名。tr-mdm 可能有很多使用者,每個使用者都有自己的
.ssh
文件夾。我們應該將公鑰添加到每個known_hosts
文件中嗎?問題 2:我發現它
ssh-keyscan -t rsa tr-mdm
會返回 tr-mdm 的公鑰。我怎麼知道這個密鑰屬於哪個使用者?此外,輸入的公鑰/root/.ssh/
與該命令返回的不同。怎麼會這樣?
您正在混合伺服器機器對客戶端機器的身份驗證,以及使用者對伺服器機器的身份驗證。
伺服器認證
建立 SSH 連接時發生的第一件事是伺服器將其公鑰發送給客戶端,並向客戶端證明(感謝公鑰加密)它知道相關的私鑰。這驗證了伺服器:如果這部分協議成功,客戶端就知道伺服器就是它假裝的那個人。
客戶端可能會檢查伺服器是否為已知伺服器,而不是某個試圖冒充正確伺服器的流氓伺服器。SSH 僅提供一種簡單的機制來驗證伺服器的合法性:它在客戶端電腦上的文件中記住您已經連接到
~/.ssh/known_hosts
的伺服器(還有一個系統範圍的文件/etc/ssh/known_hosts
)。首次連接伺服器時,需要通過其他方式檢查伺服器提供的公鑰是否真的是您要連接的伺服器的公鑰。如果您有要連接的伺服器的公鑰,您可以~/.ssh/known_hosts
手動將其添加到客戶端。在向伺服器發送任何機密數據之前,必須先對伺服器進行身份驗證。特別是,如果使用者身份驗證涉及密碼,則不得將密碼發送到未經身份驗證的伺服器。
使用者認證
如果該使用者可以證明他們有權訪問該帳戶,則伺服器僅允許遠端使用者登錄。根據伺服器的配置和使用者的選擇,使用者可能會提供幾種形式的憑據之一(下面的列表並不詳盡)。
- 使用者可以出示他嘗試登錄的帳戶的密碼;然後伺服器驗證密碼是否正確。
- 使用者可以出示公鑰並證明他擁有與該公鑰相關聯的私鑰。這與用於驗證伺服器的方法完全相同,但現在使用者正在嘗試證明他們的身份,而伺服器正在驗證他們。如果使用者證明他知道私鑰並且公鑰在帳戶的授權列表中(
~/.ssh/authorized_keys
在伺服器上),則接受登錄嘗試。- 另一種方法涉及將驗證使用者的部分工作委託給客戶端機器。這發生在企業等受控環境中,當許多機器共享相同的帳戶時。伺服器通過與相反方式使用的相同機制對客戶端機器進行身份驗證,然後依賴客戶端對使用者進行身份驗證。