SSH 公開金鑰認證(Public Key Authentication):不用打密碼登入 Linux,安全又方便

這裡介紹 SSH 公開金鑰認證(Public Key Authentication)的使用方式,讓你不用打密碼就可以直接登入 Linux,既安全又方便。

如果你的 Linux 伺服器放在網際網路上,而且有開啟 SSH 登入的服務,這樣的情況一般都會建議使用公開金鑰認證的登入方式取代一般的密碼,這樣可以讓伺服器更安全也更方便。

Linux Client

如果你的 client 電腦同樣也是 Linux(也就是以 Linux 的電腦登入 Linux 伺服器),那麼就可以依照以下的步驟來設定。

Step 1
如果要在 Linux 上產生 SSH 登入用的金鑰,可以使用 ssh-keygen 這個指令。在建立金鑰之前,要先建立 ~/.ssh 這個目錄,並設定正確的權限:

mkdir -p ~/.ssh
chmod 700 ~/.ssh

然後以 ssh-keygen 產生金鑰:

ssh-keygen

在產生金鑰的過程中,會詢問一些問題,對於一般的使用者而言,全部都使用預設值(直接按下 Enter 鍵)即可。
Generating public/private rsa key pair.
Enter file in which to save the key (/home/seal/.ssh/id_rsa):

首先指定金鑰儲存的位置,使用預設值即可,直接按下 Enter 鍵。
Enter passphrase (empty for no passphrase):
指定金鑰保護密碼,如果有設定密碼的話,以後每次使用都要輸入密碼,除你需要非常高的安全性,否則就不用設定了,直接按下 Enter 鍵即可。
Enter same passphrase again:
再次輸入密碼,直接按下 Enter 鍵,接著就會產生金鑰了。
Your identification has been saved in /home/seal/.ssh/id_rsa.
Your public key has been saved in /home/seal/.ssh/id_rsa.pub.
The key fingerprint is:
c7:61:98:72:02:91:94:db:12:96:05:9d:59:91:aa:25 seal@seal-desktop
The key’s randomart image is:
+--[ RSA 2048]---+
|   .=O.+oo       |
|    *.+ .o       |
|   . +o.+ o      |
|    E ++ o .     |
|     =  S o      |
|    .    .       |
|                 |
|                 |
|                 |
+------------+

這裡會顯示金鑰的指紋(fingerprint)與 randomart,而產生的金鑰會有兩個檔案:

  • id_rsa.pub:公開金鑰(public key),這是可以對外公開的金鑰,之後要將它放在遠端的 Linux 伺服器上作認證使用。
  • id_rsa:私密金鑰(private key),這是要保護好的金鑰,它等同於你的 Linux 密碼,放在自己的電腦中。

Step 2
將產生的 id_rsa.pub 這個公開金鑰複製到 Linux 伺服器上的 ~/.ssh/authorized_keys 檔案中:

ssh USER@HOST 'mkdir -p ~/.ssh;cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub

如果不想要執行這麼長的指令,也可以用 ssh-copy-id 的方式:

ssh-copy-id USER@HOST

它預設會將 ~/.ssh/id_rsa.pub 這個公開金鑰複製到伺服器上,若要指定使用的金鑰,可以使用 -i 參數:

ssh-copy-id -i ~/.ssh/id_rsa.pub USER@HOST

將公開金鑰放在 Linux 伺服器上之後,就可以不用打密碼登入 Linux 了:

ssh USER@HOST

Linux Server

在 Linux 伺服器的部份,如果要提高安全性,可以在伺服器上的 /etc/ssh/sshd_config 中修改以下的設定,停用密碼認證的登入方式,只允許金鑰認證:

PasswordAuthentication no
PubkeyAuthentication yes

這樣可以避免網路上一些亂猜密碼的攻擊。不過使用這樣的方式要先留意自己的金鑰是否設定正確,確認可以不需要密碼登入之後才進行這樣的設定,否則停用密碼登入之後,如果沒有金鑰或是沒有將公開金鑰放在伺服器上,就會完全無法登入該 Linux 伺服器。最後記得重新啟動 sshd:

/etc/init.d/sshd restart

參考資料:Ubuntu Help

Linux

3 Comments

  1. anton

    剛剛試了一下,這個選項:
    ChallengeResponseAuthentication no
    上文沒有提到,但是如果這個選項是開 yes,一樣會去跑 password 詢問的流程。
    (也是啦,都寫了是 challenge & response 了)

  2. liangcc

    感謝~幫助良多

  3. 關於passphrase,他的作用是保護金鑰檔避免任何人都能開啟此檔案,若私鑰流出後,沒有passphrase照樣無法開啟及使用這個加密檔,因此建議還是要設定passphrase比較安全(跟RAR的解壓縮密碼的邏輯一樣)

    「指定金鑰保護密碼,如果有設定密碼的話,以後每次使用都要輸入密碼,除你需要非常高的安全性,否則就不用設定了,直接按下 Enter 鍵即可。
    Enter same passphrase again:」

    另外,上面這一行我給予修正及補充:若將 .pub (公鑰檔) 傳送到伺服器,且伺服器停用密碼後,有設定passphrase的話,他只會在第一次登入時問你passphrase是什麼 ? 若認證正確,以後就免填任何東西,以 ssh userid@IP 就能直接進入主機

Leave a Reply