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用戶端的公鑰。
通信過程:
- 用戶端向ssh伺服器發出連接配接請求,請求用密匙進行安全驗證,該請求包含請求的帳号和自己的公鑰。
- ssh伺服器收到請求後,先在伺服器的使用者目錄下對應帳号目錄中尋找你的公用密鑰(即/home/$user/.ssh/authorized_keys檔案中),如果找到的公鑰與用戶端發來的公鑰一緻,則開始進行下一步“質詢”。
- 伺服器用該公鑰加密“質詢”(challenge)資訊,并發送绐用戶端。
- 用戶端收到加密的質詢資訊後,用自己的密鑰對其解密,并将解密後的資訊發送回伺服器。
- 伺服器驗證用戶端傳回的質詢資訊正确後,驗證結束,雙方開始通信。
配置文法:
假如要使A機ssh到B機時無需密碼,隻需兩步:
- 在A機執行ssh-keygen -t rsa生成用于ssh驗證的rsa密鑰(如果已有,則可不用不用再次生成);
- 将生成的id_rsa.pub公鑰内容添加到B機對應帳号的.ssh下的authorized_keys檔案中(如對于root帳号則為/root/.ssh/authorized_keys)。
ssh-keygen -t rsa 指令執行時輸入資訊如下:
- [email protected]:~$ ssh-keygen -t rsa
- Generating public/private rsa key pair.
- Enter file in which to save the key (/home/zhangtao/.ssh/id_rsa): //密鑰儲存位置,直接回車保持預設;
- Created directory '/home/zhangtao/.ssh'.
- Enter passphrase (empty for no passphrase): //設定密鑰的密碼,空密碼直接回車即可;
- Enter same passphrase again: //确認上一步設定的密碼。
密鑰生成後會提示儲存位置和密鑰資訊:
- Your identification has been saved in /home/zhangtao/.ssh/id_rsa.
- Your public key has been saved in /home/zhangtao/.ssh/id_rsa.pub.
- The key fingerprint is:
- 6b:f5:d4:14:19:74:9e:ef:1c:7f:56:d5:84:74:74:ee [email protected]
- The key's randomart image is:
- +--[ RSA 2048]----+
- | +o |
- | . +. |
- | o = o|
- | o . + B |
- | S * * E |
- | . o B + . |
- | . o . .|
- | . |
- | |
- +-----------------+
之後将生成的id_rsa.pub檔案内容附加到B機對應帳号下的authorized_keys檔案即可,如:/home/root/.ssh/authorized_keys。
authorized_keys 檔案說明:
該檔案每一行包含一個ssh用戶端的rsa公鑰,例如:
- ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0EmxseCe(太長省略了) [email protected]
- 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機)
- A機要求B機的主機公鑰,B機響應本機的主機公鑰;
- 如果A機是第一次登入到B機,則由于A機的known_hosts中沒有B機的資訊,是以會提示本地沒有B機資訊,并詢問使用者該資訊是否屬實,并儲存在本地的known_hosts;
- 如果本地的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中遇到的問題總結如下: