網站搜尋

在 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 應用程式。

Google 驗證器應用程式

現在,在你的 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" 繼續。

執行 Google 身份驗證器命令

步驟 2 - 秘密令牌將與 QR 碼一起生成。打開 Google Authenticator 手機應用程式,掃描 QR 碼或手動輸入秘密金鑰以註冊設備。一旦完成,該應用程式將開始每 30 秒生成一次令牌。

密鑰與驗證碼

步驟 3 - 在此步驟中,系統將提示您更新位於主目錄下的 .google_authenticator 檔案。所有的密鑰、驗證碼、緊急備用碼都儲存在此檔案中。按 "y" 繼續。

更新 google_authenticator 檔案

第4步 - 在此步驟中選擇 「y」 將會在您使用該令牌進行驗證後立即使其過期。在這種情況下,即使有些駭客獲得您的令牌,它也將失效。

不允許多次使用相同的身份驗證

步驟 5 - 這一步決定了允許的代幣數量和時間範圍。當我選擇 "n" 時,它將允許在 90 秒內使用 3 個代幣。如果我按下 "y",它將允許在 240 秒內使用 17 個代幣。

令牌數量

步驟 6 - 此步驟將要求您啟用速率限制。速率限制允許攻擊者 每30秒僅嘗試3次登錄。如果令牌錯誤,他們必須等待 N 時間才能再次嘗試。

Rate-Limiting

我們已經完成了第一步。打開文件 ~/.google_authenticator,你可以找到我們通過所有這些步驟所設置的所有設定和秘密代碼。

$ cat ~/.google_authenticator

檢視 google_authenticator 設定

您也可以向 google-authenticator 命令傳遞參數,這將創建密鑰和其他設置,而無需經過這一系列步驟。

$ google-authenticator -q -t -d -f -r 3 -R 30 -w 3

請參考 Google 認證器的說明部分以了解那些參數的作用。

$ google-authenticator --help

顯示 google-authenticator 幫助部分

為多重身份驗證配置 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。

配置 SSH 使用多重身份驗證

接下來,編輯 /etc/pam.d/sshd 檔案:

$ sudo vi /etc/pam.d/sshd

並將以下幾行添加到檔案的底部。

auth required pam_google_authenticator.so nullok
auth required pam_permit.so

編輯 sshd Pam 配置文件

如果您希望對所有用戶強制使用多因素身份驗證,請刪除單詞 "nullok"。

重新啟動 ssh 服務以使更改生效。

$ sudo systemctl restart sshd

測試兩步驟驗證

是時候測試我們所做的修改是否有效了。

通過 SSH 連接到伺服器,系統會要求您首先輸入密碼作為第一因素,然後輸入驗證碼作為第二因素認證,如下圖所示。

$ ssh username@hostname/IPaddress

測試兩步驟驗證

一旦您輸入了 SSH 密碼和驗證碼,您將能夠登入。

你有沒有記得我們並未將多因素驗證設置為所有用戶的強制要求?我們來測試一下,看看我是否能使用另一個尚未生成和設置令牌的用戶連接。

我有一個 testuser,並且我能夠成功連接而不提示輸入驗證碼。

使用其他用戶連接

看到了嗎?我也能在沒有驗證碼的情況下登錄。

基於金鑰的認證的多因素認證

如果您已設定基於密鑰的驗證,那麼系統將不會提示您輸入密碼或驗證碼。為什麼?

因為預設情況下,ssh 會先使用公鑰認證,如果找到金鑰,它就會使用該金鑰進行認證。如果未找到金鑰,它將使用基於密碼的認證。

您可以使用 詳細模式 來檢查這個。

$ ssh -v username@hostname/IPaddress ## With verbose

帶詳細模式的 SSH

將以下行添加到 /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 安全性,這樣您的系統會更安全。我們計劃在後續的文章中分別介紹這些內容,敬請期待!

相關閱讀:

  • 如何在 Linux 中配置基於 SSH 的驗證
  • 檢查使用者是使用基於密碼還是基於金鑰的 SSH 認證
  • 如何允許或拒絕特定使用者或群組在 Linux 中的 SSH 存取權限
  • 為特定用戶或群組禁用 SSH 密碼驗證