公鑰和私鑰 SSH 密鑰的好處
如果您的無頭或遠程 VPS 可以通過互聯網訪問,您應該盡可能使用公鑰身份驗證而不是密碼。這是因為與僅使用密碼相比,SSH 密鑰提供了一種更安全的登錄方式。雖然密碼最終可以通過暴力破解攻擊破解,但 SSH 密鑰幾乎不可能僅通過暴力破解來解密。使用公鑰身份驗證,每臺計算機都有 (i) 公鑰 和 (ii) 私鑰 “密鑰”(兩個數學上相關的算法,幾乎不可能被破解)。
如今,OpenSSH 是類 Unix 系統(如 Linux 和 OS X)上的默認 SSH 實現。基于密鑰的身份驗證是 OpenSSH 可用的幾種身份驗證模式中最安全的,其他身份驗證方法僅在非常特定的情況下使用。SSH 可以使用 “RSA”(Rivest-Shamir-Adleman)或 “DSA”(“數字簽名算法”)密鑰。當 SSH 被發明時,這兩種算法都被認為是最先進的算法,但近年來 DSA 已被視為不太安全。RSA 是新密鑰的唯一推薦選擇,因此本教程將 “RSA 密鑰” 和 “SSH 密鑰” 互換使用。
當您登錄到您的 DigitalOcean VPS 時,SSH 服務器使用公鑰以一種只能由您的私鑰 “解鎖” 消息的方式來 “鎖定” 消息。這意味著即使是最有資源的攻擊者也無法窺視或干擾您的會話。作為額外的安全措施,一些用戶和大多數 SSH 程序以受密碼保護的格式存儲私鑰,以提供一段時間,在此期間您可以禁用已被入侵的公鑰,如果您的計算機被盜或被入侵。因此,對于大多數人來說,公鑰身份驗證是比密碼更好的解決方案。事實上,通過不在私鑰上使用密碼短語,您將能夠自動化配置管理的部分內容,例如增量離線備份、通過 DigitalOcean API 管理您的 DigitalOcean 資產等。
基于密鑰的 SSH 登錄
您可以在盡可能多的云服務器上保存相同的公鑰,而您的私鑰保存在您登錄到服務器的客戶端上。然后,您可以禁用正常的用戶名/密碼登錄過程,這意味著只有擁有有效的私鑰/公鑰對的人才能登錄;這樣可以使您的系統更安全,因為它將不受暴力破解攻擊的影響。
自動創建新的 Droplets
SSH 密鑰可以發揮的另一個有用作用是在創建 DigitalOcean droplets 時。正如您所知,當您啟動 droplet 時,您必須等待一封帶有密碼的電子郵件。雖然這封電子郵件非常方便,但有一種更安全(和更快)的方法可以訪問您的新云服務器,而無需電子郵件。這可以通過在 DigitalOcean 控制面板 中保存您的公鑰來實現。要實現這一點:
- 首先完成本教程中標題為 Generating OpenSSH-compatible Keys for Use with PuTTY 的部分。
- 然后,跳到 How to Use SSH Keys with DigitalOcean Droplets 的 Step Three 部分。
先決條件
本教程假設您熟悉 DigitalOcean 的 How to Log Into Your Droplet with PuTTY (for windows users) 指南。
PuTTY 密鑰生成器(又名 PuTTYgen)
雖然 PuTTY 是 SSH(以及 Telnet 和 Rlogin)的客戶端程序,但它不是基于 OpenSSH 的端口或其他形式。因此,PuTTY 不支持原生讀取 OpenSSH 的 SSH-2 私鑰文件。然而,PuTTY 有一個名為 PuTTYgen 的伴侶(一個 RSA 和 DSA 密鑰生成實用程序),它可以將 OpenSSH 私鑰文件轉換為 PuTTY 的格式;從而允許您使用 SSH 密鑰從 Windows 計算機連接到您的云服務器,同時提供 SSH 密鑰提供的額外安全性。
PuTTYgen 是一個(免費)開源實用程序,可以從 維護者的網站 下載。PuTTYgen 是您將用于生成用于 PuTTY 的 SSH 密鑰的工具。首先,您只需要下載可執行文件(.exe)并將其保存在您將用于連接到 VPS 的計算機上,例如桌面。您 不需要 “安裝” PuTTYgen,因為它是一個獨立的應用程序。
生成用于 PuTTY 的 OpenSSH 兼容密鑰
要使用 PuTTYgen 生成一組 RSA 密鑰:
- 雙擊其 .exe 文件啟動 PuTTYgen 實用程序;
- 對于 要生成的密鑰類型,選擇 RSA;
- 在 生成的密鑰中的位數字段中,指定 2048 或 4096(增加位數會使通過暴力破解方法破解密鑰變得更加困難);
- 單擊 Generate 按鈕;
- 在 密鑰 部分的空白區域中移動鼠標指針(以生成一些隨機性),直到進度條填滿;
- 現在已生成了一對私鑰/公鑰;
- 在 密鑰注釋字段中,輸入 任何 您喜歡的注釋,以幫助您稍后識別此密鑰對(例如您的電子郵件地址;家庭;辦公室等)-- 在您最終創建多個密鑰對的情況下,密鑰注釋特別有用;
- 可選:在 密鑰密碼短語字段中輸入密碼短語,并在 確認密碼短語字段中重新輸入相同的密碼短語(如果您希望將密鑰用于自動化流程,則不應創建密碼短語);
- 單擊 保存公鑰 按鈕,并選擇任何您喜歡的文件名(一些用戶在計算機上創建一個名為 my_keys 的文件夾);
- 單擊 保存私鑰 按鈕,并選擇任何您喜歡的文件名(您可以將其保存在與公鑰相同的位置,但它應該是只有您可以訪問且您不會丟失的位置!如果您丟失了密鑰并且已禁用了用戶名/密碼登錄,您將無法再登錄!);
- 在標有 用于粘貼到 OpenSSH authorized_keys 文件的公鑰 的文本字段中右鍵單擊,并選擇 全選;
- 再次在相同的文本字段中右鍵單擊,并選擇 復制。
注意: PuTTY 和 OpenSSH 使用不同的格式來存儲公共 SSH 密鑰。如果您復制的 SSH 密鑰 以 “---- BEGIN SSH2 PUBLIC KEY …” 開頭,則它的格式是錯誤的。請務必仔細遵循說明。您的密鑰應該以 “ssh-rsa AAAA …” 開頭。
在服務器上保存公鑰
現在,您需要將復制的公鑰粘貼到服務器上的文件 ~/.ssh/authorized_keys 中。
- 登錄到您的目標服務器;參見 How to Log Into Your Droplet with PuTTY (for windows users)
- 如果您的 SSH 文件夾尚不存在,請手動創建它:
mkdir ~/.ssh chmod 0700 ~/.ssh touch ~/.ssh/authorized_keys chmod 0644 ~/.ssh/authorized_keys
- 將 SSH 公鑰粘貼到您的 ~/.ssh/authorized_keys 文件(參見 Installing and Using the Vim Text Editor on an Cloud Server):
sudo vim ~/.ssh/authorized_keys
- 按鍵盤上的
i
鍵,然后右鍵單擊鼠標以粘貼。 - 要保存,請按鍵盤上的以下鍵(按此順序):
Esc
、:
、w
、q
、Enter
。
創建 PuTTY 配置文件以保存服務器設置
在 PuTTY 中,您可以創建(并保存)用于連接到各種 SSH 服務器的配置文件,這樣您就不必記住并不斷重新輸入冗余信息。
- 雙擊其可執行文件啟動 PuTTY;
- PuTTY 的初始窗口是 會話 類別(在窗口的左側導航到 PuTTY 的各種類別);
- 在 主機名字段中,輸入您的 VPS 的 IP 地址或其完全限定域名(FQDN);參見 How to Set Up a Host Name with DigitalOcean
- 在 端口字段中輸入端口號(為了增加安全性,考慮將服務器的 SSH 端口更改為非標準端口。 參見 Initial Server Setup with Ubuntu 12.04)
- 在 協議下選擇 SSH;
- 在窗口的左側選擇 連接 下的 數據 子類別;
- 在 自動登錄用戶名字段中指定您打算在登錄到 SSH 服務器時使用的用戶名,并保存您正在保存的配置文件;
- 展開 連接 下的 SSH 子類別;
- 高亮顯示 Auth 子類別,然后單擊 PuTTY 窗口右側的 瀏覽 按鈕;
- 瀏覽您的文件系統并選擇先前創建的私鑰;
- 返回到 會話 類別,并在 保存的會話字段中輸入此配置文件的名稱,例如 user@123.456.78.9 或 user@host.yourdomain.tld;
- 單擊 保存 按鈕以保存 加載、保存或刪除存儲的會話 區域中的配置文件。
現在,您可以繼續登錄到 user@1.2.3.4,您將 不會 被提示輸入密碼。但是,如果您在公鑰上設置了密碼短語,那么您將被要求在那時(以及將來每次登錄時)輸入密碼短語。
禁用用戶名/密碼登錄
一旦您驗證了基于密鑰的登錄是否正常工作,您可以選擇禁用用戶名/密碼登錄以獲得更好的安全性。要做到這一點,您需要編輯您的 SSH 服務器配置文件。在 Debian/Ubuntu 系統上,此文件位于 /etc/ssh/sshd_config。
sudo vim /etc/ssh/sshd_config
按鍵盤上的 i
鍵,編輯下面引用的行:
[...]
PasswordAuthentication no
[...]
UsePAM no
[...]
要保存,請按鍵盤上的以下鍵(按此順序):Esc
、:
、w
、q
、Enter
。現在,重新加載 SSH 服務器的配置:
sudo reload ssh