天天看點

ssh配置無密碼驗證

SSH(Secure Shell)在linux中ssh有很多用途。由于它對傳輸的資料進行加密和壓縮,使得其比telnet等更安全。

ssh提供兩種安全驗證方式:基于密碼和基于密鑰。

基于密碼的方式中,用戶端需提供使用者名和密碼,在頻繁使用時,可能感覺不友善,是以可以采用基于密鑰的方式。該方式中,一次分發密鑰後,驗證将由程式自動進行,且安全性比基于密碼方式更強。

原理:

ssh雙方,通過相應帳号主目錄下的.ssh目錄中的id_rsa,id_rsa.pub和authorized_keys檔案中密鑰進行驗證(如/root/.ssh/)。

  • id_rsa,自己的rsa私鑰;
  • id_rsa_pub,自己的rsa公鑰;
  • authorized_keys,存放rsa用戶端的公鑰。

通信過程:

  1. 用戶端向ssh伺服器發出連接配接請求,請求用密匙進行安全驗證,該請求包含請求的帳号和自己的公鑰。
  2. ssh伺服器收到請求後,先在伺服器的使用者目錄下對應帳号目錄中尋找你的公用密鑰(即/home/$user/.ssh/authorized_keys檔案中),如果找到的公鑰與用戶端發來的公鑰一緻,則開始進行下一步“質詢”。
  3. 伺服器用該公鑰加密“質詢”(challenge)資訊,并發送绐用戶端。
  4. 用戶端收到加密的質詢資訊後,用自己的密鑰對其解密,并将解密後的資訊發送回伺服器。
  5. 伺服器驗證用戶端傳回的質詢資訊正确後,驗證結束,雙方開始通信。

配置文法:

假如要使A機ssh到B機時無需密碼,隻需兩步:

  1. 在A機執行ssh-keygen -t rsa生成用于ssh驗證的rsa密鑰(如果已有,則可不用不用再次生成);
  2. 将生成的id_rsa.pub公鑰内容添加到B機對應帳号的.ssh下的authorized_keys檔案中(如對于root帳号則為/root/.ssh/authorized_keys)。

ssh-keygen -t rsa 指令執行時輸入資訊如下:

  1. [email protected]:~$ ssh-keygen -t rsa
  2. Generating public/private rsa key pair.
  3. Enter file in which to save the key (/home/zhangtao/.ssh/id_rsa): //密鑰儲存位置,直接回車保持預設;
  4. Created directory '/home/zhangtao/.ssh'.
  5. Enter passphrase (empty for no passphrase): //設定密鑰的密碼,空密碼直接回車即可;
  6. Enter same passphrase again: //确認上一步設定的密碼。

密鑰生成後會提示儲存位置和密鑰資訊:

  1. Your identification has been saved in /home/zhangtao/.ssh/id_rsa.
  2. Your public key has been saved in /home/zhangtao/.ssh/id_rsa.pub.
  3. The key fingerprint is:
  4. 6b:f5:d4:14:19:74:9e:ef:1c:7f:56:d5:84:74:74:ee [email protected]
  5. The key's randomart image is:
  6. +--[ RSA 2048]----+
  7. |            +o   |
  8. |            . +. |
  9. |            o = o|
  10. |         o . + B |
  11. |         S * * E |
  12. |       . o B + . |
  13. |          . o . .|
  14. |               . |
  15. |                 |
  16. +-----------------+

之後将生成的id_rsa.pub檔案内容附加到B機對應帳号下的authorized_keys檔案即可,如:/home/root/.ssh/authorized_keys。

authorized_keys 檔案說明:

該檔案每一行包含一個ssh用戶端的rsa公鑰,例如:

  1. ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0EmxseCe(太長省略了) [email protected]
  2. ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAmrVo9jp0(太長省略了) [email protected]

格式:keyType pubKeys [email protected]

  • keyType 為密鑰類型,rsa加密為ssh-rsa,dsa加密則為ssh-dsa;
  • pubKey 則為對應加密方式的公鑰;
  • username為對應的使用者号名,客戶機登入到主機後将具有該使用者的權限;
  • hostname.domain則為客戶機的計算機名,可以使用通配符*代表所有主機,例如要使所有具有該密鑰的主機都能以root使用者登入到本機,則可寫為 root@* 或 root@*.cluster(允許cluster域中所有主機,需有dns支援);

known_hosts 檔案說明:

用于對遠端主機進行身份鑒别。

known_hosts顧名思義,已知的主機。該檔案存放遠端主機的ssh主機公鑰(不同于用于登入的密鑰),用于對主機進行指紋(fingerprint)驗證,確定你要登入到的主機确實是你請求的主機,防止僞造的第三方欺騙。在使用ssh時經常由于此處出錯。

格式:hostname,IP keyType pubKey

  • hostname為主機的計算機名,IP為其IP位址,兩者均可使用通配符 * 代表所有主機。
  • keyType 為密鑰類型,rsa加密為ssh-rsa,dsa加密則為ssh-dsa;
  • pubKey 則為對應加密方式的公鑰;

該檔案使用方式如下:(A登入到B機)

  1. A機要求B機的主機公鑰,B機響應本機的主機公鑰;
  2. 如果A機是第一次登入到B機,則由于A機的known_hosts中沒有B機的資訊,是以會提示本地沒有B機資訊,并詢問使用者該資訊是否屬實,并儲存在本地的known_hosts;
  3. 如果本地的known_hosts已有B機的資訊,則對比該資訊,确認B機的身份。如果對比結果不同,則提示使用者B機改變,該B機可能是的,僞造的第三方欺騙。此時ssh将退出,停止登入。

每台主機的主機密鑰在ssh安裝時自動生成,存放在/etc/ssh目錄下,重新安裝ssh或系統将導緻該密鑰改變,進而導緻登入該機的用戶端出錯。

SSH在叢集中的配置方法

在叢集中,需要各節點間ssh時不用密碼,由于叢集機器多,這裡面有以下幾個問題:

  • 要在每台節點上運作ssh-keygen生成密鑰,并收集到所有的公鑰,生成一個authorized_keys,再分發到所有節點上。
  • 要收集所有節點的主機指紋,生成一個authorized_keys,并放到所有節點,不然在第一次用ssh時會有提示儲存主機指紋,對程式調用ssh造成影響。
  • 一旦某台節點重裝了,那就得把每個節點的authorized_keys更新一下,而且由于其它節點上的known_hosts中已有該節點的舊主機指紋,會阻止對該節點的ssh。

我的方法是将所有節點的ssh密鑰和主機指紋設定成相同的,并在authorized_keys和authorized_keys使用通配符。 具體配置方法 該配置以root帳号,且使用rsa密鑰為例。準備以下檔案:

  • /etc/ssh/目錄下的檔案:

    ssh_host_*:這些檔案是ssh的主機密鑰,即主機指紋。

  • /root/.ssh/目錄下的檔案:

    id_rsa  id_rsa.pub:root使用者的ssh密鑰,(如果用root帳号的話)

    authorized_keys:清空該檔案内容,并将id_rsa.pub檔案内容複制進來,然後修改其中的[email protected]為root@*,以允許具有該密鑰的所有主機。

    known_hosts:清空該檔案内容,并将ssh_host_rsa_key.pub檔案内容複制進來,然後修改其中的hostname,IP為*,*。

然後将修改後的檔案放到所有節點的對應目錄下,替換掉相應的檔案即可。 如果你是通過kickstart安裝節點,則可以寫到ks檔案裡,這樣節點安裝完後ssh就可以用了。 小竅門:準備 authorized_keys和known_hosts時可以使用ssh登入自己,這樣相應的密鑰就自動存放到檔案了。 錯誤處理

現将我在使用SSH中遇到的問題總結如下:

繼續閱讀