有人說,安全不是一個產品,而是一個過程。雖然 SSH 協議被設計成使用加密技術來確保安全,但若是使用不當,別人仍是可以破壞你的系統:好比弱密碼、密鑰泄露、使用過期的 SSH 客戶端等,都能引起安全問題。所以,在安全方面,必須藉助權威專業的安全服務提供商,在移動應用安全方面,愛加密無疑是很好地選擇。html
在考慮 SSH 認證方案時,你們廣泛認爲公鑰認證比密碼認證更安全。然而,公鑰認證技術並非爲公共環境設置的,若是你在一臺公用電腦上使用公鑰認證登陸 SSH 服務器,你的服務器已經毫無安全可言了,公用的電腦可能會記錄你的公鑰,或從你的內存中讀取公鑰。若是你不信任本地電腦,那你最好仍是使用其餘方式登陸服務器。如今就是「一次性密碼(OTP)」派上用場的時候了,就像名字所示,一次性密碼只能被使用一次。這種一次性密碼很是合適在不安全的環境下發揮做用,就算它被竊取,也沒法再次使用。git
有個生成一次性密碼的方法是經過谷歌認證器,但在本文中,我要介紹的是另外一種 SSH 登陸方案:OTPW,它是個一次性密碼登陸的軟件包。不像谷歌認證,OTPW 不須要依賴任何第三方庫。安全
OTPW 由一次性密碼生成器和 PAM 認證規則組成。在 OTPW 中一次性密碼由生成器事先生成,而後由用戶以某種安全的方式得到(好比打印到紙上)。另外一方面,這些密碼會經過 Hash 加密保存在 SSH 服務器端。當用戶使用一次性密碼登陸系統時,OTPW 的 PAM 模塊認證這些密碼,而且保證它們不能再次使用。服務器
使用 apt-get 安裝:session
$ sudo apt-get install libpam-otpw otpw-bin
打開針對 SSH 服務的 PAM 配置文件(/etc/pam.d/sshd),註釋掉下面這行(目的是禁用 PAM 的密碼認證功能):ssh
#@include common-auth
添加下面兩行(用於打開一次性密碼認證功能):工具
auth required pam_otpw.so
session optional pam_otpw.so
在基於 RedHat 的發行版中沒有編譯好的 OTPW,因此咱們須要使用源代碼來安裝它。測試
首先,安裝編譯環境:ui
$ sudo yum git gcc pam-devel
$ git clone https://www.cl.cam.ac.uk/~mgk25/git/otpw
$ cd otpw
打開 Makefile 文件,編輯以「PAMLIB=」開頭的那行配置:加密
64 位系統:
PAMLIB=/usr/lib64/security
32 位系統:
PAMLIB=/usr/lib/security
編譯安裝。須要注意的是安裝過程會自動重啓 SSH 服務一下,因此若是你是使用 SSH 鏈接到服務器,作好被斷開鏈接的準備吧(LCTT 譯註:也許不會被斷開鏈接,即使被斷開鏈接,請使用原來的方式從新鏈接便可,如今尚未換成一次性口令方式。)。
$ make
$ sudo make install
如今你須要更新 SELinux 策略,由於 /usr/sbin/sshd 會往你的 home 目錄寫數據,而 SELinux 默認是不容許這麼作的。若是沒有使用 SELinux 服務(LCTT 注:使用 getenforce 命令查看結果,若是是 enforcing,就是打開了 SELinux 服務),請跳過這一步。
$ sudo grep sshd /var/log/audit/audit.log | audit2allow -M mypol
$ sudo semodule -i mypol.pp
接下來打開 PAM 配置文件(/etc/pam.d/sshd),註釋下面這行(爲了禁用密碼認證):
#auth substack password-auth
添加下面兩行(用於打開一次性密碼認證功能):
auth required pam_otpw.so
session optional pam_otpw.so
打開 /etc/ssh/sshd_config 文件,設置下面三個參數。你要確保下面的參數不會重複存在,不然 SSH 服務器可能會出現異常。
UsePrivilegeSeparation yes
ChallengeResponseAuthentication yes
UsePAM yes
你還須要禁用默認的密碼認證功能。另外能夠選擇開啓公鑰認證功能,那樣的話你就能夠在沒有一次性密碼的時候使用公鑰進行認證。
PubkeyAuthentication yes
PasswordAuthentication no
重啓 SSH 服務器。
Debian, Ubuntu 或 Linux Mint 發行版:
$ sudo service ssh restart
Fedora 或 CentOS/RHEL 7 發行版:
$ sudo systemctl restart sshd
(LCTT 譯註:雖然這裏重啓了 sshd 服務,可是你當前的 ssh 鏈接應該不受影響,只是在你完成下述步驟以前,沒法按照原有方式創建新的鏈接了。所以,保險起見,要麼多開一個 ssh 鏈接,避免誤退出當前鏈接;要麼將重啓 sshd 服務器步驟放到步驟3完成以後。)
以前提到過,你須要事先建立一次性密碼,並保存起來。使用 otpw-gen 命令建立密碼:
$ cd ~
$ otpw-gen > temporary_password.txt
這個命令會讓你輸入密碼前綴,當你之後登陸的時候,你須要同時輸入這個前綴以及一次性密碼。密碼前綴是另一層保護,就算你的一次性密碼錶被泄漏,別人也沒法經過暴力破解你的 SSH 密碼。
設置好密碼前綴後,這個命令會產生 280 個一次性密碼(LCTT 譯註:保存到 ~/.otpw 下),並將它們導出到一個文本文件中(如 temporary_password.txt)。每一個密碼(默認是 8 個字符)由一個 3 位十進制數索引。你須要將這個密碼錶打印出來,並隨身攜帶。
查看 ./.otpw 文件,它存放了一次性密碼的 HASH 值。頭 3 位十進制數與你隨身攜帶的密碼錶的索引一一對應,在你登陸 SSH 服務器的時候會被用到。
$ more ~/.otpw
<pre name="code" class="plain">OTPW1
280 3 12 8
191ai+:ENwmMqwn
218tYRZc%PIY27a
241ve8ns%NsHFmf
055W4/YCauQJkr:
102ZnJ4VWLFrk5N
2273Xww55hteJ8Y
1509d4b5=A64jBT
168FWBXY%ztm9j%
000rWUSdBYr%8UE
037NvyryzcI+YRX
122rEwA3GXvOk=z
使用普通的方式登陸 SSH 服務器:
$ ssh user@remote_host
若是 OTPW 成功運行,你會看到一點與平時登陸不一樣的地方:
Password 191:
如今打開你的密碼錶,找到索引號爲 191 的密碼。
023 kBvp tq/G 079 jKEw /HRM 135 oW/c /UeB 191 fOO+ PeiD 247 vAnZ EgUt
從上表可知,191 號密碼是「fOO+PeiD」。你須要加上密碼前綴,好比你設置的前綴是「000」,則你實際須要輸入的密碼是「000fOO+PeiD」。
成功登陸後,你此次輸入的密碼自動失效。查看 ~/.otpw 文件,你會發現第一行變成「—————」,這表示 191 號密碼失效了。
OTPW1
280 3 12 8
---------------
218tYRZc%PIY27a
241ve8ns%NsHFmf
055W4/YCauQJkr:
102ZnJ4VWLFrk5N
2273Xww55hteJ8Y
1509d4b5=A64jBT
168FWBXY%ztm9j%
000rWUSdBYr%8UE
037NvyryzcI+YRX
122rEwA3GXvOk=z
在這個教程中,我介紹瞭如何使用 OTPW 工具來設置一次性登陸密碼。你也許意識到了在這種雙因子的認證方式中,打印一張密碼錶讓人感受好 low,可是這種方式是最簡單的,而且不用依賴任何第三方軟件。不管你用哪一種方式建立一次性密碼,在你須要在一個不可信任的環境登陸 SSH 服務器的時候,它們都頗有用。