SSH 的登入方式可採用密碼登入、使用公開金鑰登入的方法。目前主流雲端主機大廠例如 Google 的 GCE、Amazon 的 EC2 等等,因為安全性的考量,皆採用公開金鑰認證(public key authentication)登入免輸入密碼登入的方法。
為什麼使用金鑰登入比較安全?只要提到木馬病毒的鍵盤記錄器會將鍵盤上所輸入的字母皆側錄下來,又或者在免費的公開網路有被側錄封包的風險,以安全性的角度來看,使用金鑰登入 SSH 的方式相對安全許多,前提是金鑰檔案要保管好,不能外流。
SSH 金鑰認證流程
在開始進行客戶端和伺服器的必要設定之前,我們先來了解一下 SSH 金鑰認證的流程,這樣一來就可以對接下來的設定有深刻的理解。
(1) 聯繫
這個階段客戶端對伺服器進行聯繫,傳送金鑰組 (SSH key pair) 的 ID 給伺服器來進行請求授權。客戶端和伺服器會一起產生一組共用的工作階段金鑰 (session key) 來加密整個過程。
(2) 加密訊息
接著,伺服器檢查該登入使用者帳號的 authorized_keys
檔案,是否有這個金鑰 ID,如果存在,則伺服器產生一組隨機碼,並用此公鑰加密後,回覆加密訊息給客戶端。
(3) 溝通
這個階段客戶端與伺服器進行雙向溝通,過程如下:
- 假如客戶端有正確的私鑰,則使用私鑰將此加密訊息解碼,還原伺服器產生的隨機碼。
- 客戶端將此還原的隨機碼與兩者共用的工作階段金鑰組成一個 MD5 的雜湊值。接著將這個 MD5 值回覆給伺服器。
- 伺服器使用兩者共用的工作階段金鑰與步驟 2 傳給客戶端時產生的隨機碼組成 MD5 的雜湊值,然後驗證客戶端傳來的 MD5 與伺服器產生的 MD5 是否相符。如果相符,證實了客戶的私鑰正確,進行授權給客戶端連線。
(4) 登入
驗證成功的客戶端此時即可登入伺服器。
SSH 免密碼登入的設定
SSH 使用 Key 驗證,以免輸入密碼登入的設定方法主要有三個步驟:
- 產生金鑰組
(客戶端)
- 修改登入使用者的
authorized_keys
檔案。(伺服器端)
- 修改 SSH 設定檔
(伺服器端)
- 檢查目錄即檔案權限
(伺服器端)
在前一段提到金鑰組 (SSH key pair) ,包含了一個公開金鑰 (public key) 和一個私密金鑰 (private key),我們必須產生金鑰組,並將產生的公開金鑰放到伺服器上,該登入使用者的 authorized_keys
,接著修改 SSH 設定檔,然後重啟 SSH 服務。
(1) 產生金鑰組 (客戶端)
先查看使用者的 .ssh
目錄。
進入 ~/.ssh
這個目錄,如果以前都沒產生過 SSH 金鑰,這個目錄裡只會有 authorized_keys
這個檔案。這是客戶端的檔案並不是伺服器的,所以這個檔案並不會被修改。
接下來來產生金鑰組(公、私鑰)。指令是:
ssh-keygen
使用這個指令時,提示輸入時都按 Enter 即可。完成後再次查看目錄,會發現多了兩個檔案,id_rsa
和 id_rsa.pub
。
root@terrylin:~/.ssh# ls -al
total 16
drwx------ 2 root root 4096 Mar 3 08:41 .
drwx------ 4 root root 4096 Mar 3 07:11 ..
-rw------- 1 root root 0 Mar 3 07:11 authorized_keys
-rw------- 1 root root 2602 Mar 3 08:41 id_rsa
-rw-r--r-- 1 root root 567 Mar 3 08:41 id_rsa.pub
id_rsa.pub
是公開金鑰(public key)檔案,用來要將它放在伺服器端,讓伺服器加密鑰認證用的訊息。id_rsa
是私密金鑰(private key),必須小心保存在客戶端,用來解密使用公鑰加密後的訊息。性質等同於密碼。
(2) 修改登入使用者的 authorized_keys (伺服器端)
將前一個步驟產生的公鑰 id_rsa.pub 的內容,貼到伺服器中,用來登入使用者的 authorized_keys 這個檔案中。
指令:顯示 id_rsa.pub 內容。
cat id_rsa.pub
指令:直接將 id_rsa.pub 內容貼到 authorized_keys 檔案中。
使用 ssh-copy-id 指令可以直接幫我們把公鑰安裝到伺服器的 authorized_keys 檔案中。
ssh-copy-id -i ~/.ssh/id_rsa.pub username@host
接著會提示輸入該登入的使用者的密碼:
u sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
terry@51.223.239.53's password:
輸入密碼後:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'terry@51.223.239.53'"
and check to make sure that only the key(s) you wanted were added.
公鑰檔案 id_rsa.pub 的內容已經加進使用者 terry 的 authorized_keys 檔案中。
註:
username
:使用者帳號
host
: 伺服器的 IP 位址或者網路名稱。
(3) 修改 SSH 設定檔 (伺服器端)
vi /etc/ssh/sshd_config
PubkeyAuthentication
這個選項設為 yes 則啟用公開金鑰認證登入方式。PasswordAuthentication
這個選項設為 no 則停用使用密碼登入方式。
PubkeyAuthentication yes
PasswordAuthentication no
重啟 SSH 服務讓新的設定生效。
systemctl restart ssh
請確定設定無誤且已經可以使用金鑰登入後再關閉密碼登入選項,以免把自己鎖在門外進不去... @@
(4) 檢查目錄即檔案權限 (伺服器端)
目錄或檔案 | 權限 | 代碼 | 說明 |
---|---|---|---|
~/.ssh |
700 | drwx | 只有使用者可以讀、寫、執行 |
~/.ssh/authorized_keys |
600 | -rw | 只有使用者可以 讀、寫 |
~ |
755 | drwxr-xr-x | 使用者的家目錄,只有使用者可以 讀、寫、執行,群組和訪客不能有寫入的權限 |
以上是必須確認的檔案即目錄,限制只有使用者擁有寫入的權限。
SSH 使用金鑰登入的方法
Linux
ssh -i ~/.ssh/id_rsa username@host
ssh
指令加上 -i
選項為指定私鑰檔案的位置。
Windows
使用 PuTTY 時,頁籤位置選擇 Auth,並指定私鑰檔案的位置。
總結
一般來說,使用金鑰登入 SSH 而非使用密碼登入多為安全性的考量,但很多情境下使用免密碼登入也有許多便利性,例如要使用 rsync
指令同步伺服器上的目錄到另一台伺服器進行備份,只要將 SSH login 設定使用 key 驗證,免輸入密碼即可同步資料。
另外很常見的 Git 也是採用這種方式。例如 GitHub 網站,在帳號中的設定 SSH key 時也是將公鑰檔案的內容填入帳號設定中,即可使用 SSH 存取 Git 儲存庫。非常實用喔。
留言