SSH key - 從產生、設定到撤銷

SSH (Secure Shell) 是我們遠端連線到伺服器的常用工具。相較於每次都輸入密碼,使用 SSH 金鑰對(Key Pair)不僅更安全,也更方便。
這篇文章將引導你完成 SSH 金鑰的產生、將公鑰複製到目標電腦、設定 SSH Config 以簡化連線,以及在金鑰外洩時如何撤銷它。

什麼是 SSH 金鑰對?

SSH 金鑰對包含兩個部分:

  1. 私鑰 Private Key
    儲存在你的本機電腦上,絕對不能外洩。它就像你的秘密通行證。預設路徑通常是 ~/.ssh/id_rsa 或你指定的其他檔案。

  2. 公鑰 Public Key
    可以安全地分享給任何人或放置在你想連線的伺服器上。它就像一個鎖,只有對應的私鑰才能打開。預設路徑通常是 ~/.ssh/id_rsa.pub 或對應私鑰檔名加上 .pub

當你嘗試使用金鑰連線時,伺服器會使用你放在上面的公鑰來驗證你本機電腦上的私鑰,驗證成功後即可登入,無需輸入密碼。

步驟一:產生 SSH 金鑰對

在你的本機電腦上打開終端機 (Terminal),執行以下指令:

1
ssh-keygen -t rsa -b 4096 -C "[email protected]"

讓我們解釋一下參數:

  • -t rsa: 指定要產生的金鑰類型,rsa 是一種較舊的演算法,但仍然廣泛使用。你也可以選擇 ed25519,它是一種較新的橢圓曲線密碼學演算法,通常被認為比同等長度的 RSA 金鑰更安全且更有效率。
    建議使用者根據自己的需求和安全性考量選擇金鑰類型。若要使用 ed25519,指令會是 ssh-keygen -t ed25519 -C "[email protected]"
  • -b 4096: 指定金鑰的長度(位元數)。對於 RSA 金鑰,建議使用 4096 位元。ed25519 不需要指定長度。
  • -C "[email protected]": 提供一個註解,通常用你的電子郵件地址,方便識別金鑰的用途。

執行指令後,系統會提示你:

  1. 輸入儲存金鑰的檔案路徑

    1
    Enter file in which to save the key (/Users/your_username/.ssh/id_rsa):

    你可以直接按 Enter 使用預設路徑 (~/.ssh/id_rsa),或者輸入一個新的路徑和檔名(例如 ~/.ssh/my_server_key)。

    如果你管理多個金鑰,建議使用不同的檔名。

  2. 輸入密碼

    1
    2
    Enter passphrase (empty for no passphrase):  
    Enter same passphrase again:

    這是一個強烈建議設定的密碼,用來保護你的私鑰檔案。即使私鑰檔案被他人取得,沒有這個密碼也無法使用。

    如果留空,則使用此金鑰登入時不需要額外輸入密碼。

完成後,你指定的路徑下會產生兩個檔案:私鑰(例如 id_rsa)和公鑰(例如 id_rsa.pub)。

步驟二:將公鑰複製到目標電腦

為了讓目標電腦信任你的本機電腦,你需要將剛剛產生的公鑰複製到目標電腦的 ~/.ssh/authorized_keys 檔案中。

最簡單方便的方法是使用 ssh-copy-id 指令。假設你的目標電腦使用者名稱是 remote_user,主機名稱或 IP 位址是 remote_host,並且你剛剛產生的公鑰是預設的 ~/.ssh/id_rsa.pub

1
ssh-copy-id remote_user@remote_host

如果你使用了非預設的金鑰檔名(例如 ~/.ssh/my_server_key.pub),你需要使用 -i 參數指定公鑰路徑:

1
ssh-copy-id -i ~/.ssh/my_server_key.pub remote_user@remote_host

執行此指令時,系統會要求你輸入 remote_userremote_host 上的登入密碼(這是為了授權複製公鑰,僅需輸入這一次)。
成功後,你的公鑰內容會被附加到目標電腦的 ~/.ssh/authorized_keys 檔案末尾。

手動複製方法(如果沒有 ssh-copy-id)

  1. 在本機顯示公鑰內容:

    1
    cat ~/.ssh/id_rsa.pub # 或你的公鑰檔案路徑
  2. 複製顯示出來的整段文字(通常以 ssh-rsassh-ed25519 開頭)。

  3. SSH 登入目標電腦(此時仍需密碼):

    1
    ssh remote_user@remote_host
  4. 在目標電腦上,編輯 ~/.ssh/authorized_keys 檔案(如果 ~/.ssh 目錄或 authorized_keys 檔案不存在,需要先建立):

    1
    2
    3
    4
    5
    mkdir -p ~/.ssh       # 確保目錄存在  
    chmod 700 ~/.ssh # 設定正確權限
    touch ~/.ssh/authorized_keys # 確保檔案存在
    chmod 600 ~/.ssh/authorized_keys # 設定正確權限
    nano ~/.ssh/authorized_keys # 使用 nano 或其他編輯器開啟
  5. 將步驟 2 複製的公鑰內容貼到檔案的新的一行,儲存並關閉檔案。

現在,你可以嘗試從本機再次 SSH 連線到目標電腦:

1
ssh remote_user@remote_host

如果你的私鑰沒有設定密碼,應該可以直接登入。如果設定了密碼,系統會提示你輸入私鑰的密碼 (Enter passphrase for key '/Users/your_username/.ssh/id_rsa':)。

步驟三:設定 SSH Config 簡化連線

每次連線都要輸入 ssh remote_user@remote_host,如果有多台主機或使用了非預設的金鑰,會變得很麻煩。我們可以編輯本機的 SSH 設定檔 ~/.ssh/config 來簡化這個過程。

編輯或建立 ~/.ssh/config 檔案:

1
nano ~/.ssh/config

在檔案中加入類似以下的設定區塊:

1
2
3
4
5
Host my_server # 自訂一個好記的主機別名  
HostName remote_host # 目標主機的實際 IP 位址或網域名稱
User remote_user # 登入目標主機的使用者名稱
IdentityFile ~/.ssh/my_server_key # 指定使用的私鑰檔案路徑 (如果不是預設的 id_rsa)
# Port 2222 # 如果 SSH 不是使用預設的 22 Port,取消註解並修改

說明:

  • Host my_server: 定義一個別名,以後連線只需要輸入 ssh my_server
  • HostName: 目標主機的真實位址。
  • User: 登入的使用者名稱。
  • IdentityFile: 重要! 指定連線到這個 Host 時要使用的私鑰檔案路徑。
    如果你的私鑰是預設的 ~/.ssh/id_rsa~/.ssh/id_ed25519 等,SSH 會自動嘗試它們,你可以省略這一行。但如果你為特定主機產生了專用金鑰(例如 my_server_key),就必須指定。
  • Port: 如果目標主機的 SSH 服務不是監聽在標準的 22 Port,你需要指定正確的 Port 號。

儲存檔案後,設定 ~/.ssh/config 的權限(如果檔案是新建的):

1
chmod 600 ~/.ssh/config

現在,你可以用更簡單的方式連線了:

1
ssh my_server

SSH 客戶端會自動讀取 ~/.ssh/config 檔案,找到 Host my_server 的設定,並使用指定的 HostName, User, IdentityFile 和 Port 來進行連線。
以下是一些更詳細的 SSH Config 範例:

  • 使用通配符 Host * 來設定所有主機的預設選項。
  • 設定 ForwardAgent yes 以啟用 SSH Agent forwarding。
  • 使用 ServerAliveIntervalServerAliveCountMax 來保持連線。

範例:

1
2
3
4
5
6
7
8
9
Host *  
ServerAliveInterval 60
ServerAliveCountMax 3

Host my_server
HostName remote_host
User remote_user
IdentityFile ~/.ssh/my_server_key
ForwardAgent yes

步驟四:撤銷外洩的金鑰

如果不幸地,你的私鑰檔案外洩了(例如筆記型電腦遺失或被駭),你需要立即在你所有使用過這個金鑰的目標電腦上撤銷它的授權。
撤銷的方法很簡單:登入到目標電腦,並從 ~/.ssh/authorized_keys 檔案中移除對應的公鑰

  1. 使用其他方式(例如密碼或其他未外洩的金鑰)SSH 登入目標電腦:

    1
    ssh remote_user@remote_host
  2. 編輯 authorized_keys 檔案:

    1
    nano ~/.ssh/authorized_keys
  3. 找到代表已外洩金鑰的那一行公鑰(通常可以透過結尾的註解,例如你的電子郵件地址來辨識)。

  4. 刪除那一整行。

  5. 儲存並關閉檔案。

完成後,持有該外洩私鑰的人將無法再使用它登入這台目標電腦。記得在所有你曾放置過該公鑰的伺服器上都執行這個撤銷步驟。

結論

使用 SSH 金鑰可以大幅提升遠端連線的安全性和便利性。
透過 ssh-keygen 產生金鑰、ssh-copy-id 部署公鑰,以及設定 ~/.ssh/config 簡化連線,你可以更有效率地管理你的伺服器。
同時,了解如何在必要時撤銷金鑰,也是保障系統安全的重要一環。養成良好的金鑰管理習慣,讓你的遠端作業更加順暢安心!

也許你也會想看看