如何為 Linux 系統中的 SSH 添加雙重認證
為了鼓勵廣泛採用雙因子認證的方式,Google 公司發布了 Google 身份驗證器 ,一款開源的,可基於開放規則(如 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.so
和 google-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
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive