基於 SSH 金鑰的身份驗證:known_hosts 與authorized_keys

基於 SSH 金鑰的身份驗證:known_hosts 與authorized_keys

我讀到了有關在 Linux 中設置 ssh 密鑰的信息,並且有一些問題。如我錯了請糾正我…

假設主機 tr-lgto 希望使用 ssh 連線到主機 tr-mdm。如果我們想確定它是真正的 tr-mdm,我們會在 tr-mdm 上產生一對金鑰,並將公鑰新增到known_hoststr-lgto 上。如果 tr-mdm 想要檢查它是否是真正的 tr-lgto,則 tr-lgto 必須產生金鑰對並將公鑰新增至authorized_keystr-mdm 上。

問題1: 沒有使用者檔案known_hosts中的字段,只是IP位址和主機名稱。 tr-mdm 可能有很多用戶,每個用戶都有自己的.ssh資料夾。我們應該將公鑰添加到每個known_hosts文件中嗎?

問題2:我發現ssh-keyscan -t rsa tr-mdm會回傳 tr-mdm 的公鑰。我如何知道這個金鑰屬於哪個使用者?此外,輸入的公鑰/root/.ssh/與該命令傳回的公鑰不同。怎麼會這樣?

答案1

您混淆了伺服器電腦對用戶端電腦的身份驗證和使用者對伺服器電腦的身份驗證。

伺服器認證

建立 SSH 連線時發生的第一件事就是伺服器將其公鑰發送給客戶端,並證明(感謝公鑰密碼學)向客戶端表明它知道關聯的私鑰。這對伺服器進行身份驗證:如果協定的這一部分成功,則客戶端知道伺服器就是它所假裝的伺服器。

客戶端可以檢查該伺服器是否為已知的伺服器,而不是某個試圖冒充正確伺服器的惡意伺服器。 SSH 只提供了一種簡單的機制來驗證伺服器的合法性:它會在客戶端電腦上的檔案中記住您已經連接到的伺服器~/.ssh/known_hosts(還有一個系統範圍的檔案/etc/ssh/known_hosts)。第一次連接到伺服器時,您需要透過其他方式檢查伺服器提供的公鑰是否確實是您要連接的伺服器的公鑰。如果您擁有要連接的伺服器的公鑰,則可以將其~/.ssh/known_hosts手動新增至用戶端。

在向伺服器發送任何機密資料之前,必須先對伺服器進行身份驗證。特別是,如果用戶認證涉及密碼,則不得將密碼發送到未經認證的伺服器。

使用者認證

只有當遠端使用者能夠證明他們有權存取該帳戶時,伺服器才會允許該使用者登入。根據伺服器的配置和使用者的選擇,使用者可以提供多種形式的憑證之一(下面的清單並不詳盡)。

  • 使用者可以提供他嘗試登入的帳戶的密碼;然後伺服器驗證密碼是否正確。
  • 用戶可以提供公鑰並證明他擁有與該公鑰相關聯的私鑰。這與用於驗證伺服器的方法完全相同,但現在用戶正在嘗試證明其身份,而伺服器正在驗證他們。如果使用者證明他知道私鑰並且公鑰位於帳戶的授權清單(~/.ssh/authorized_keys在伺服器上)中,則接受登入嘗試。
  • 另一種方法涉及將驗證使用者身分的部分工作委託給客戶端電腦。這種情況發生在企業等受控環境中,此時許多電腦共用相同的帳戶。伺服器透過與相反方式使用的相同機制對客戶端電腦進行身份驗證,然後依賴用戶端對使用者進行身份驗證。

答案2

朋友給了我答案。預設情況下,密鑰標識機器而不是使用者。所以密鑰儲存在/etc/ssh/中。這就是為什麼我得到了與 /root/.ssh 中儲存的金鑰不同的金鑰

相關內容