如何為 Linux 系統中的 SSH 新增雙重認證

Dan Nanni發表於2014-08-30

近來很多知名企業都出現了密碼洩露,業內對多重認證的呼聲也越來越高。在這種多重認證的系統中,使用者需要透過兩種不同的認證程式:提供他們知道的資訊(如 使用者名稱/密碼),再借助其他工具提供使用者所不知道的資訊(如用手機生成的一次性密碼)。這種組合方式常叫做雙因子認證或者兩階段驗證。

為了鼓勵廣泛採用雙因子認證的方式,Google 公司釋出了 Google 身份驗證器Google Authenticator,一款開源的,可基於開放規則(如 HMAP/ 基於時間)生成一次性密碼的軟體。這是一款跨平臺軟體,可執行在 Linux、 Android、 iOS。Google 公司同時也支援外掛式鑑別模組PAM (pluggable authentication module),使其能和其他也適用 PAM 進行驗證的工具(如 OpenSSH)協同工作。

在本教程中,我們將敘述整合 OpenSSH 和 Google 提供的身份驗證器實現如何為 SSH 服務設定雙因子認證。我將使用一款 Android 裝置來生成一次性密碼,本教程中需要兩樣武器:

(1) 一臺執行著 OpenSSH 服務的 Linux 終端,

(2) 一臺安卓裝置。

在 Linux 系統中安裝 Google 身份驗證器

第一步需要在執行著 OpenSSH 服務的 Linux 主機上安裝 Google 身份驗證器。按照如下步驟安裝 Google 身份驗證器及其PAM模組。

用安裝包安裝 Google 身份驗證器

如果你不想自己構建 Google 身份驗證器,在幾個 Linux 發行版上有已經編譯好的安裝包。安裝包裡面包含 Google 身份驗證器 二進位制程式和 PAM 模組。

在 Ubuntu 上安裝 Google 身份驗證器:

$ sudo apt-get install libpam-google-authenticator

在 Fedora 上安裝 Google 身份驗證器:

$ sudo yum install google-authenticator

在 CentOS 上安裝 Google 身份驗證器 ,需要首先啟用 EPEL 軟體庫,然後執行如下命令(LCTT 譯註:EPEL 庫中可能已經刪除了該軟體包,請使用原始碼編譯方式安裝):

$ sudo yum install google-authenticator

如果不想使用已經編譯好的安裝包,或者你的 Linux 發行版不在此列,可以自行編譯:

在 Linux 上編譯 Google 身份驗證器

首先,安裝構建 Google 身份驗證器所需的軟體包。

在 Debian、 Ubuntu 或 Linux Mint 上:

$ sudo apt-get install wget make gcc libpam0g-dev

在 CentOS、 Fedora 或 RHEL上:

$ sudo yum install wget make gcc pam-devel

然後下載 Google 身份驗證器的原始碼,並按如下命令編譯(已經從 Google Code 遷移到了 Github)。

$ wget https://github.com/google/google-authenticator/archive/master.zip
$ unzip master.zip
$ cd google-authenticator-master/libpam
$ ./bootstrap.sh
$ ./configure
$ make

如果構建成功,你會在目錄中看到 pam_google_authenticator.sogoogle-authenticator 兩個檔案。

最後,將 Google 身份驗證器安裝到合適位置。預設會安裝到 /usr/local/lib/security 下,根據你的系統不同,你可能需要將其符號連結到 pam 庫的位置(比如 CentOS 7 會在 /usr/lib64/security)。

$ sudo make install

排錯

當編譯 Google 身份驗證器時出現如下錯誤:

fatal error: security/pam_appl.h: No such file or directory

要修復這個問題,請安裝如下依賴包。

在 Debian、 Ubuntu 或 Linux Mint 上:

$ sudo apt-get install libpam0g-dev

在 CentOS、 Fedora 或 RHEL 上:

$ sudo yum install pam-devel

當 Google 身份驗證器安裝好後,你需要在 Linux 主機上建立驗證金鑰,並且在安卓裝置上註冊,注意這項配置操作是一次性的。我們將詳細敘述如何完成這些操作:

生成驗證金鑰

在 Linux 主機上執行 Google 身份驗證器:

$ google-authenticator 

你將看到一個二維碼,它使用如下圖形表示我們數字形態的金鑰。一會我們要用到它在安卓裝置上完成配置。

Google 身份驗證器會問一些問題,如果你不確定,就回答 Y。這個應急備用驗證碼(圖中 emergency scratch codes)可以在你由於丟失了繫結的安卓裝置的情況下(所以不能得到生成的一次性密碼)恢復訪問。最好將應急備用驗證碼妥善儲存。

在安卓裝置上執行 Google 身份驗證器

我們需要在安卓裝置上安裝 Google 身份驗證器應用才能完成雙因子認證,到 Google Play 下載並安裝一個。在安卓裝置上執行 Google 身份驗證器,找到下圖所示中的配置選單。

你可以選擇“Scan a barcode” 或者“Enter provided key”選項。“Scan a barcode”允許你掃描二維碼來完成金鑰的輸入,在此可能需要先安裝掃描軟體 Barcode Scanner 應用。如果選擇“Enter provided key”選項,你可以使用鍵盤輸入驗證金鑰,如下圖所示:

無論採用上述兩種選項的任何方式,一旦成功,你將看到註冊成功提示和一次性密碼,如下圖所示:

為 SSH 伺服器用 Google 身份驗證器

最終我們需要修改兩個檔案來完成整合 Google 身份驗證器和 OpenSSH 服務這臨門一腳。

首先,修改 PAM 配置檔案,命令和需新增的內容如下:

$ sudo vi /etc/pam.d/sshd 

auth required pam_google_authenticator.so

然後開啟 SSH 配置檔案,找到引數 ChallengeResponseAuthentication,並啟用它。

$ sudo vi /etc/ssh/sshd_config 

ChallengeResponseAuthentication yes

最後,重啟 SSH 服務。

在 Ubuntu、 Debian 和 Linux Mint 上:

$ sudo service ssh restart 

在 Fedora (或 CentOS/RHEL 7)上:

$ sudo systemctl restart sshd 

在 CentOS 6.x或 RHEL 6.x 上:

$ sudo service sshd restart 

不要退出當前的 ssh 連結,大多數 Linux 發行版重啟 ssh 服務並不會中斷當前已經建立的 ssh 連線。另外開個視窗去重新連線 ssh 服務,如果遇到問題,還可以在原來的 ssh 連線下修改和恢復。

驗證雙因子認證

在繫結的安卓裝置上執行 Google 身份驗證器,獲得一個一次性驗證碼,該驗證碼 30 秒內有效,一旦過期,將重新生成一個新的驗證碼。

現在和往常一樣,使用 SSH 登入終端

$ ssh user@ssh_server 

當提示你輸入驗證碼的時候,輸入我們剛獲得的驗證碼。驗證成功後,再輸入 SSH 的登入密碼。

雙因子認證透過在使用者密碼前新增一層來有效的保護我們脆弱的使用者密碼。你可以使用 Google 身份驗證器來保護我們其他的密碼,如 Google 賬戶、GitHub、WordPress.com、Dropbox.com、Outlook.com等等。是否使用這項技術,取決於我們自己,但採用雙因子認證已經是行業的大趨勢了。


via: http://xmodulo.com/2014/07/two-factor-authentication-ssh-login-linux.html

譯者:nd0104 校對:wxy

本文由 LCTT 原創翻譯,Linux中國 榮譽推出

相關文章