2021-05-12 14:32:11
如何在Linux上用一次性密碼確保SSH登入安全?
常言道,安全不是一種產品,而是一個過程。雖然SSH協定本身在設計上採用了密碼,因而很安全,但要是它未得到適當管理:無論是弱密碼、金鑰洩密還是過時的SSH客戶軟體,有人就會對你的SSH服務造成嚴重破壞。
至於SSH驗證,公鑰驗證通常被認為比密碼驗證來得安全。然而,如果你從公共或共用的計算機登入,金鑰驗證實際上並不可取,甚至不太安全。因為在這類計算機上,總是有可能潛藏著隱形擊鍵記錄程式或記憶體抓取惡意軟體(memory scraper)之類的威脅。要是你無法信任本地計算機,最好還是使用別的密碼。這時候,“一次性密碼”就派得上用場。顧名思義,每個一次性密碼只能用一次。這種一次性密碼可以在不可信任的環境下安全地使用,因為即使被人盜取,它們也無法再次使用。
生成一次性密碼的辦法之一就是通過谷歌驗證器(Google Authenticator)。在本教學中,我將演示建立用於SSH登入的一次性密碼的另一種方法:OTPW(http://www.cl.cam.ac.uk/~mgk25/otpw.html),這是一次性密碼登入程式包。不像谷歌驗證器,你不用依賴任何第三方即可生成並驗證一次性密碼。
OTPW簡介
OTPW包括兩部分:一次性密碼生成器和整合PAM的驗證實用例程。在OTPW中,一次性密碼由生成器通過推理法生成,並由使用者安全地攜帶(比如列印在紙張上)。所生成密碼的密碼雜湊然後儲存在SSH伺服器主機上。當使用者用一次性密碼登入時,OTPW的PAM模組就會驗證密碼,使用後讓密碼作廢,防止再次使用。
第一步:在Linux上安裝和設定OTPW
在Debian、Ubuntu或Linux Mint上:
用apt-get安裝OTPW程式包。
$ sudo apt-get install libpam-otpw otpw-bin
使用文字編輯工具,開啟SSH的PAM組態檔(/etc/pam.d/sshd),注釋掉下面這行程式碼(以禁用密碼驗證)。
#@include common-auth
然後新增下面兩行程式碼(以啟用一次性密碼驗證):
auth required pam_otpw.so session optional pam_otpw.so
在基於紅帽的系統上,沒有作為預製程式包的OTPW。於是,我們通過從原始碼來構建的方法,安裝OTPW。
首先,安裝基本元件:
$ 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連線,就要準備好斷開。
$ make $ sudo make install
現在你需要更新SELinux策略,因為/usr/sbin/sshd試圖寫入到使用者的主目錄,而預設的SELinux策略不允許這個操作。下面這些命令可以起到更新策略的作用。如果你不使用SELinux,跳過這一步好了。
$ sudo grep sshd /var/log/audit/audit.log | audit2allow -M mypol $ sudo semodule -i mypol.pp
下一步,用文字編輯工具開啟SSH的PAM組態檔(/etc/pam.d/sshd),注釋掉下面這行程式碼(以禁用密碼驗證)。
#auth substack password-auth
然後新增下面兩行程式碼(以啟用一次性密碼驗證):
auth required pam_otpw.so session optional pam_otpw.so
第二步:針對一次性密碼設定SSH伺服器
下一步是設定SSH伺服器,以接受一次性密碼。
用文字編輯工具開啟/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
第三步:用OTPW生成一次性密碼
如前所述,你需要事先建立一次性密碼,並將它們儲存在遠端SSH伺服器主機上。為此,以你登入時所用的使用者身份執行otpw-gen工具。
$ cd ~ $ otpw-gen > temporary_password.txt
它會要求你設定一個字首密碼。你以後登入時,就需要輸入這個字首密碼以及一次性密碼。實際上字首密碼是另一層保護機制。即使密碼表落到了不法分子手裡,字首密碼也會迫使對方採用蠻力攻擊。
一旦字首密碼設定完畢,命令會生成280個一次性密碼,並將它們儲存在輸出文字檔案(比如temporary_password.txt)中。每個密碼(預設情況下長度是8個字元)的前面是三位數的索引號。你可以將檔案列印在紙張上,隨身攜帶。
你還會看到~/.otpw檔案已建立,這些密碼的密碼雜湊就儲存在其中。每一行的頭三位表明了將用於SSH登入的密碼的索引號。
$ more ~/.otpw 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伺服器:
$ 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程式包,設定用於SSH登入的一次性密碼。你可能認識到,列印的密碼表就好比是雙因子驗證中的安全令牌,只是比較平實罷了。不過,它更簡單,你也不用依賴任何第三方即可實現。無論你使用什麼機制來建立一次性密碼,當你需要從不可信任的公共計算機登入到SSH伺服器時,它們都大有幫助。歡迎留言交流。
英文:How to secure SSH login with one-time passwords on Linux
提高Ubuntu的SSH登陸認證速度的辦法 http://www.linuxidc.com/Linux/2014-09/106810.htm
開啟SSH服務讓Android手機遠端存取 Ubuntu 14.04 http://www.linuxidc.com/Linux/2014-09/106809.htm
如何為Linux系統中的SSH新增雙重認證 http://www.linuxidc.com/Linux/2014-08/105998.htm
在 Linux 中為非 SSH 使用者設定 SFTP 環境 http://www.linuxidc.com/Linux/2014-08/105865.htm
Linux 上SSH 服務的設定和管理 http://www.linuxidc.com/Linux/2014-06/103627.htm
SSH入門學習基礎教學 http://www.linuxidc.com/Linux/2014-06/103008.htm
SSH免密碼登入詳解 http://www.linuxidc.com/Linux/2015-03/114709.htm
本文永久更新連結地址:http://www.linuxidc.com/Linux/2015-04/116120.htm
相關文章