在 Linux 中為 SSH 設置多因素身份驗證
在本指南中,我們將學習什麼是多重身份驗證以及其重要性,最後如何使用 Google Authenticator 應用程序在 Linux 中為 SSH 設置多重身份驗證。
介紹
安全是一件嚴肅的事。妥協事件的數量日益增加,據估計,到2025年,網絡犯罪將給企業造成10.5兆美元的損失。
在技術堆疊的所有層面實施強大的安全層是非常重要的。在本文中,我們將看到一種針對 SSH 使用多因素身份驗證的安全實施方法。
SSH,代表安全外殼(Secure Shell),是一種網路協定,允許使用者連接到遠端機器(伺服器)並存取資源。
SSH 協議實現了兩種類型的安全性,即 基於密碼的認證 和 基於密鑰的認證。
基於金鑰的(公鑰 -> 私鑰)身份驗證被認為比基於密碼的身份驗證更安全,大多數 SSH 強化指南建議禁用基於密碼的身份驗證,僅啟用基於金鑰的身份驗證。
無論您選擇哪種身份驗證機制,您都可以透過實施多因素身份驗證設置來提高 SSH 的安全性。
什麼是多重身份驗證?
多重身份驗證(簡稱 MFA)是一種安全的認證過程,需使用來自不同憑證類別的多種認證技術。
多重身份驗證有時也被稱為 「雙重身份驗證 (2FA)」。
驗證您所聲稱身份涉及兩個因素。第一個因素將是在您的用戶帳戶創建時所建立的密碼。
第二個因素將是任何生成一次性密碼(OTP)的應用程式,或任何向您的設備發送簡訊或撥打電話的協議。
根據應用程式的實作方式,你的驗證方式會有所不同。你用於多因素認證的一些常見工具有:
- 安裝在行動裝置上的應用程式,用於生成令牌。
- 像 Yubikey 這樣的外部設備。
- 指紋
- 臉部辨識
- 基於簡訊或電話的 OTP 密碼。
要啟用 SSH 的多因素認證,我們將使用 "Google Authenticator" 應用程式,它使用 OATH-TOTP 協議。還有其他替代工具,例如 Twilio Authy 或 FreeOTP,您可以安裝並嘗試使用。
我們將從在伺服器和行動裝置上安裝 Google Authenticator 應用程式開始,並嘗試啟用多重身份驗證並進行驗證。
安裝 Google 認證器
首先透過 Play 商店/iTunes 在您的 Android 或 iOS 裝置上安裝 Google Authenticator 應用程式。
現在,在你的 Linux 系統上安裝 Google Authenticator 應用程式。
根據您的發行版本,執行以下安裝命令。
在 Ubuntu 及其衍生發行版中,執行以下命令。
$ sudo apt install libpam-google-authenticator在 RHEL 基礎的發行版中執行以下命令。
$ sudo dnf install google-authenticator -y對於 Arch 基礎的發行版,請執行以下命令。
$ sudo pacman -S libpam-google-authenticator為使用者生成初始令牌
作為設定多重身份驗證(MFA)的第一步,您必須從終端機執行以下命令。這將通過生成 TOTP 金鑰來處理初始設置。此金鑰適用於執行該命令的使用者,並不適用於系統中的所有使用者。
$ google-authenticator有一些步驟序列會提示你選擇 (y/n) 選項。
步驟 1 - 系統會提示您選擇基於時間的驗證令牌。基於時間的驗證令牌每 30 秒會生成一個新代碼。按 "y" 繼續。
步驟 2 - 秘密令牌將與 QR 碼一起生成。打開 Google Authenticator 手機應用程式,掃描 QR 碼或手動輸入秘密金鑰以註冊設備。一旦完成,該應用程式將開始每 30 秒生成一次令牌。
步驟 3 - 在此步驟中,系統將提示您更新位於主目錄下的 .google_authenticator 檔案。所有的密鑰、驗證碼、緊急備用碼都儲存在此檔案中。按 "y" 繼續。
第4步 - 在此步驟中選擇 「y」 將會在您使用該令牌進行驗證後立即使其過期。在這種情況下,即使有些駭客獲得您的令牌,它也將失效。
步驟 5 - 這一步決定了允許的代幣數量和時間範圍。當我選擇 "n" 時,它將允許在 90 秒內使用 3 個代幣。如果我按下 "y",它將允許在 240 秒內使用 17 個代幣。
步驟 6 - 此步驟將要求您啟用速率限制。速率限制允許攻擊者 每30秒僅嘗試3次登錄。如果令牌錯誤,他們必須等待 N 時間才能再次嘗試。
我們已經完成了第一步。打開文件 ~/.google_authenticator,你可以找到我們通過所有這些步驟所設置的所有設定和秘密代碼。
$ cat ~/.google_authenticator您也可以向 google-authenticator 命令傳遞參數,這將創建密鑰和其他設置,而無需經過這一系列步驟。
$ google-authenticator -q -t -d -f -r 3 -R 30 -w 3請參考 Google 認證器的說明部分以了解那些參數的作用。
$ google-authenticator --help為多重身份驗證配置 SSH
我們必須對 openSSH 進行一些配置更改,以便我們可以開始使用多因素認證。
注意:
- 作為最佳做法,在進行任何更改之前,務必備份您的配置文件。如果出現任何問題,更改可以被恢復。
- 由於你正在修改 SSH 配置文件,請確保你另外開啟了一個會話,這樣就不會因為意外而把自己鎖在外面。
執行以下命令以備份 SSH 配置檔案。
$ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup$ sudo cp /etc/pam.d/sshd /etc/pam.d/sshd.backup首先,透過將 ChallengeResponseAuthentication 選項設置為 "yes" 來啟用使用 MFA 的 SSH。
接下來,編輯 /etc/pam.d/sshd 檔案:
$ sudo vi /etc/pam.d/sshd並將以下幾行添加到檔案的底部。
auth required pam_google_authenticator.so nullok
auth required pam_permit.so如果您希望對所有用戶強制使用多因素身份驗證,請刪除單詞 "nullok"。
重新啟動 ssh 服務以使更改生效。
$ sudo systemctl restart sshd測試兩步驟驗證
是時候測試我們所做的修改是否有效了。
通過 SSH 連接到伺服器,系統會要求您首先輸入密碼作為第一因素,然後輸入驗證碼作為第二因素認證,如下圖所示。
$ ssh username@hostname/IPaddress一旦您輸入了 SSH 密碼和驗證碼,您將能夠登入。
你有沒有記得我們並未將多因素驗證設置為所有用戶的強制要求?我們來測試一下,看看我是否能使用另一個尚未生成和設置令牌的用戶連接。
我有一個 testuser,並且我能夠成功連接而不提示輸入驗證碼。
看到了嗎?我也能在沒有驗證碼的情況下登錄。
基於金鑰的認證的多因素認證
如果您已設定基於密鑰的驗證,那麼系統將不會提示您輸入密碼或驗證碼。為什麼?
因為預設情況下,ssh 會先使用公鑰認證,如果找到金鑰,它就會使用該金鑰進行認證。如果未找到金鑰,它將使用基於密碼的認證。
您可以使用 詳細模式 來檢查這個。
$ ssh -v username@hostname/IPaddress ## With verbose將以下行添加到 /etc/ssh/sshd_config 文件的底部:
AuthenticationMethods publickey,password publickey,keyboard-interactive接下來打開 /etc/pam.d/sshd 並將以下行註解掉。
如果你沒有將 “@include common-auth” 註解掉,那麼它將啟用多於兩種因素來進行身份驗證。它會先使用金鑰進行驗證,然後才是密碼和憑證。我只需要金鑰和憑證來進行身份驗證,所以我將其禁用。
重新啟動 sshd 服務並測試變更是否運作正常。
$ sudo systemctl restart sshd現在,如果我嘗試連接,它會使用公鑰作為第一因素,驗證碼作為第二因素來進行認證。
恢復步驟
可能會有你遺失或更換行動裝置的情況。在那種情況下,你必須重新安裝 Google 身份驗證器應用程式,並註冊密鑰以開始生成代碼。
如果您被鎖在系統之外,則必須聯繫您的系統管理員,讓他提供給您新的密鑰以註冊和使用系統。但也有另一種方法,您可以自行登入並生成密鑰。
還記得在初始步驟中生成的代碼嗎?你可以使用 緊急備用代碼 作為登入的憑證。每個備用代碼只能使用一次。將它保存在安全的地方,以便在最需要的時候使用。
這些代碼保存在 ~/.google_authenticator 檔案中。
$ cat ~/.google_authenticator您現在可以透過執行以下指令再次重新生成您自己的金鑰。
$ google-authenticator結論
在本文中,我已向你展示如何安裝 Google Authenticator 並為 SSH 在不同配置下啟用多因素身份驗證。
作為管理員,您也可以編寫 bash 腳本 來自動生成密鑰並與使用者分享。在設定多重身份驗證 (MFA) 之前,您也應該加強 SSH 安全性,這樣您的系統會更安全。我們計劃在後續的文章中分別介紹這些內容,敬請期待!

















