Linux SSH基於密鑰交換的自動登錄原理簡介及配置說明

1、原理簡介

SSH證書認證登陸的基礎是一對惟一匹配密鑰: 私鑰(private key)和公鑰(public key)。公鑰用於對數據進行加密,並且只能用於加密。而私鑰只能對使用所匹配的公鑰,所加密過的數據進行解密。私鑰須要用戶單獨妥善保管。SSH 客戶端使用私鑰向服務器證實自已的身份。而公鑰是公開的,能夠按需將其配置到目標服務器上本身的相應賬號中。
在進行 SSH 登陸認證時,進行私鑰和公鑰協商。若是匹配,則身份得以證實,認證成功,容許登陸。不然,將會繼續使用密碼驗證等其它方式進行登陸校驗。SSH 證書驗證登陸配置及登陸協商過程,以下 證書校驗交互登陸流程示意圖所示:

 

各步驟補充說明以下:
生成證書
客戶端生成密鑰對。
將公鑰信息寫入目標服務器、目標帳戶的配置文件。該操做隱含表示了客戶端擁有對目標服務器的控制權。
協商交互過程
  1.  客戶端向目標服務器發送登陸請求。在SSH 服務啓用了證書驗證登陸方式後,會優先經過證書驗證方式進行登陸驗證。 
  2. 目標服務器根據 SSH 服務配置,在用戶對應目錄及文件中讀取到有效的公鑰信息。
  3. 目標服務器生成一串隨機數,而後使用相應的公鑰對其加密。
  4. 目標服務器將加密後的密文發回客戶端。
  5. 客戶端使用默認目錄或 -i 參數指定的私鑰嘗試解密。
  6. 若是解密失敗,則會繼續嘗試密碼驗證等其它方式進行登陸校驗。若是解密成功,則將解密後的原文信息從新發送給目標服務器。意思相似於: 「看,這是這段話的原文。我能讀懂發過來的密文,我擁有服務器的控制權,請讓我登陸。」
  7. 目標服務器對客戶端返回的信息進行比對。若是比對成功,則表示認證成功,客戶端能夠登陸。若是對比失敗,則表示認證失敗,則會繼續嘗試密碼驗證等其它方式進行登陸校驗。
 

 

2、自動登陸配置

生成密鑰對

SSH 協議 V1只使用 RSA 算法,而 SSH 協議V2 對 RSA 算法和 DSA 算法都支持。目前全部OpenSSH 版本都應該對兩種算法都支持。兩種算法的密鑰的生成指令和使用方法相同,本文僅以 RSA 算法爲例進行相關說明。
生成密鑰對的時候,能夠按需決定是否設置密碼。但須要注意的是,若是設置了密碼,還需結合 ssh-agent 代理和 ssh-add 配置才能實現自動登陸。同時,相關配置只對 ssh-agent 啓動的相應 shell 生效,用戶退出後從新登陸時還需從新配置。因此,爲簡便起見,本文以常見的、不配置密碼的狀況進行說明。
能夠在任意支持環境下生成密鑰對。Windows 和 Linux 環境下,配置分別說明以下。

Windows環境下生成密鑰對

在 Windows 環境下,一般藉助各類應用軟件來建立和管理密鑰對。以常見的NetSarang Xshell爲例,請執行以下步驟建立密鑰對:
打開Xshell程序。
單擊 工具 > 用戶密鑰管理者 ,再點擊 生成 。
在打開的密鑰建立嚮導中,選擇默認的 RSA 密鑰算法及密鑰長度(默認 2048 位)後,點擊 下一步 。
程序生成密鑰對後,點擊 下一步。
如前面所述,密鑰加密密碼留空:

點擊 下一步,會彈出確認信息,點擊 是 確認。
複製或者點擊 保存爲文件 對公鑰信息進行保存。
點擊 完成 ,在 用戶密鑰管理者 列表中能看到相應的密鑰信息。

Linux環境下生成密鑰對

在 Linux 環境下,一般使用系統自帶的 ssh-keygen 軟件來建立和管理密鑰對。請執行以下步驟建立密鑰對:
以任意具備 ssh-keygen 執行權限的用戶登陸服務器。
使用以下指令,基於 rsa 算法建立密鑰對:

ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):                → 默認保存路徑和文件名,能夠按需修改。
Enter passphrase (empty for no passphrase):                             → 如前面所述,不設置密碼,回車確認便可。
Enter same passphrase again:                                 → 不設置密碼,回車確認便可。
Your identification has been saved in /root/.ssh/id_rsa.        → 建立的私鑰文件。
Your public key has been saved in /root/.ssh/id_rsa.pub.        → 建立的公鑰文件。
The key fingerprint is:
17:b8:0e:76:cb:57:21:3b:f2:bb:8b:a2:42:2b:54:be root@iZ233gr74jvZ
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|         .       |
|        . o .    |
|   .     . + .   |
|  o   o S + .    |
| ... . = = o     |
|.. ..   + o      |
|. oE  .  o .     |
| . ... .. +o     |
+-----------------+
說明:
若是 .ssh 目錄不存在,程序會自動建立。
生成的密鑰對默認保存在當前用戶家目錄下的 .ssh 文件夾中,文件名默認爲 id_rsa(私鑰) 和 id_rsa.pub(公鑰)。用戶能夠按需設置保存路徑和文件名。

密鑰配置

生成密鑰對後,進行以下處理:

私鑰的處理

私鑰用於信息校驗,請確保安全。能夠將私鑰上傳到其它源服務器上,或者直接參閱前述說明建立新的密鑰對。

公鑰的處理

公鑰信息須要寫入目標服務器、目標用戶的配置文件中,默認配置文件爲對應用戶家目錄下 .ssh 文件夾中的 authorized_keys,即:
~/.ssh/authorized_keys
能夠複製公鑰信息後,直接經過 vi 等編輯器將其寫入上述文件。或者經過以下指令,在源服務器上配置寫入:
cat ~/.ssh/id_rsa.pub | ssh <用戶名>@<目標服務器IP> 'cat >> ~/.ssh/authorized_keys'; 好比: cat ~/.ssh/id_rsa.pub | ssh root@120.26.38.248 'cat >> ~/.ssh/authorized_keys';
 
注意:
該操做因爲須要登陸目標服務器才能完成,因此隱含表示了客戶端擁有對目標服務器的控制權。
若是修改了默認的目錄或文件名,則須要同步修改SSH 服務配置文件(默認爲/etc/ssh/sshd_config)中的AuthorizedKeysFile 參數,不然會因找不到公鑰信息而致使自動登陸失敗。

 

3、參數與權限檢查確認

要順利完成自動登陸,還需對SSH 服務相關參數及關聯文件、文件夾的權限進行確認或調整。

SSH服務參數設置

SSH 服務默認開啓了證書認證支持。編輯 SSH 服務配置文件(默認爲/etc/ssh/sshd_config),確保以下參數沒有顯示的置爲 no。不然,將參數值修改成yes,或者整個刪除或註釋(在最開頭添加 # 號)整行配置。好比:

#RSAAuthentication yes
#PubkeyAuthentication yes
同時,如前面所述,若是修改了默認的公鑰路徑或文件名,還需確保 AuthorizedKeysFile 參數值配置的信息與其一致。
注意:若是對相關參數作了修改,須要重啓 SSH 服務生效。

相關權限設置

SSH 服務證書驗證方式登陸,對相關目錄和文件的權限有要求。權限配置異常可能會致使登陸失敗。
  • .ssh 目錄的權限配置
使用以下指令,確保 $HOME/.ssh 目錄只有全部者纔有權寫入:

chmod 700 ~/.ssh
  • authorized_keys 文件的權限配置
使用以下指令,確保其它用戶對 authorized_keys 文件沒有修改權限:
chmod 600 ~/.ssh/authorized_keys
  • 進一步安全配置
進一步的安全設置能夠將 authorized_keys 文件權限配置爲 400(其餘用戶沒有任何權限),並對其及 .ssh 目錄添加 immutable 位權限(防止文件被修改):
chmod 400 ~/.ssh/authorized_keys
chattr +i ~/.ssh/authorized_keys
chattr +i ~/.ssh

 

4、自動登陸

完成上述配置後,在客戶端便可免密碼直接登陸。說明以下:

Windows環境自動登陸

Window 環境下,仍是以常見的NetSarang Xshell爲例,請執行以下配置進行自動登陸:
單擊 文件 > 屬性,打開主機屬性配置窗口。
點擊 鏈接 > 用戶身份驗證,以下圖所示,將 方法 設置爲 Public Key;將 用戶名 設置爲已經設置了證書登陸的相應用戶名;將 用戶密鑰 設置爲對應的私鑰。最後,點擊 肯定。

再次鏈接相應服務器時,無需密碼輸入用戶名和密碼,便可自動登陸。

Linux環境自動登陸

Linux 環境下,在客戶端直接經過 ssh 軟件免密碼登陸:
ssh <用戶名>@<目標服務器>

好比:
ssh root@192.168.0.1

若是修改了私鑰路徑或文件名,則須要經過 –i 參數進行指定:
ssh –i <私鑰路徑及文件名> <用戶名>@<目標服務器>

好比:
ssh -i /bak/my_rsa user@192.168.0.1
相關文章
相關標籤/搜索