如何用一次性密碼通過 SSH 安全登入 Linux
有人說,安全不是一個產品,而是一個過程(LCTT 注:安全公司 McAfee 認為,安全風險管理是一個方法論,而不是安全產品的堆疊)。雖然 SSH 協議被設計成使用加密技術來確保安全,但如果使用不當,別人還是能夠破壞你的系統:比如弱密碼、金鑰洩露、使用過時的 SSH 客戶端等,都能引發安全問題。
在考慮 SSH 認證方案時,大家普遍認為公鑰認證比密碼認證更安全。然而,公鑰認證技術並不是為公共環境設定的,如果你在一臺公用電腦上使用公鑰認證登入 SSH 伺服器,你的伺服器已經毫無安全可言了,公用的電腦可能會記錄你的公鑰,或從你的記憶體中讀取公鑰。如果你不信任本地電腦,那你最好還是使用其他方式登入伺服器。現在就是“一次性密碼(OTP)”派上用場的時候了,就像名字所示,一次性密碼只能被使用一次。這種一次性密碼非常合適在不安全的環境下發揮作用,就算它被竊取,也無法再次使用。
有個生成一次性密碼的方法是通過谷歌認證器,但在本文中,我要介紹的是另一種 SSH 登入方案:OTPW,它是個一次性密碼登入的軟體包。不像谷歌認證,OTPW 不需要依賴任何第三方庫。
OTPW 是什麼
OTPW 由一次性密碼生成器和 PAM 認證規則組成。在 OTPW 中一次性密碼由生成器事先生成,然後由使用者以某種安全的方式獲得(比如列印到紙上)。另一方面,這些密碼會通過 Hash 加密儲存在 SSH 伺服器端。當使用者使用一次性密碼登入系統時,OTPW 的 PAM 模組認證這些密碼,並且保證它們不能再次使用。
步驟1:OTPW 的安裝和配置
在 Debian, Ubuntu 或 Linux Mint 發行版上
使用 apt-get 安裝:
$ sudo apt-get install libpam-otpw otpw-bin
開啟針對 SSH 服務的 PAM 配置檔案(/etc/pam.d/sshd),註釋掉下面這行(目的是禁用 PAM 的密碼認證功能):
#@include common-auth
新增下面兩行(用於開啟一次性密碼認證功能):
auth required pam_otpw.so session optional pam_otpw.so
在 Fedora 或 CentOS/RHEL 發行版上
在基於 RedHat 的發行版中沒有編譯好的 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 連線到伺服器,做好被斷開連線的準備吧(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
步驟2:配置 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
(LCTT 譯註:雖然這裡重啟了 sshd 服務,但是你當前的 ssh 連線應該不受影響,只是在你完成下述步驟之前,無法按照原有方式建立新的連線了。因此,保險起見,要麼多開一個 ssh 連線,避免誤退出當前連線;要麼將重啟 sshd 伺服器步驟放到步驟3完成之後。)
步驟3:使用 OTPW 產生一次性密碼
之前提到過,你需要事先建立一次性密碼,並儲存起來。使用 otpw-gen 命令建立密碼:
$ cd ~ $ otpw-gen > temporary_password.txt
這個命令會讓你輸入密碼字首,當你以後登入的時候,你需要同時輸入這個字首以及一次性密碼。密碼字首是另外一層保護,就算你的一次性密碼錶被洩漏,別人也無法通過暴力破解你的 SSH 密碼。
設定好密碼字首後,這個命令會產生 280 個一次性密碼(LCTT 譯註:儲存到 ~/.otpw 下),並將它們匯出到一個文字檔案中(如 temporary_password.txt)。每個密碼(預設是 8 個字元)由一個 3 位十進位制數索引。你需要將這個密碼錶列印出來,並隨身攜帶。
檢視 ./.otpw 檔案,它存放了一次性密碼的 HASH 值。頭 3 位十進位制數與你隨身攜帶的密碼錶的索引一一對應,在你登入 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 工具來設定一次性登入密碼。你也許意識到了在這種雙因子的認證方式中,列印一張密碼錶讓人感覺好 low,但是這種方式是最簡單的,並且不用依賴任何第三方軟體。無論你用哪種方式建立一次性密碼,在你需要在一個不可信任的環境登入 SSH 伺服器的時候,它們都很有用。你可以就這個主題來分享你的經驗和觀點。
相關文章
- Linux SSH無密碼登入Linux密碼
- 在linux上通過ssh直接登入到windows系統上,不用密碼LinuxWindows密碼
- SSH免密碼登入密碼
- [Linux] SSH配置了免密碼登入,登入時還要輸入密碼Linux密碼
- linux ssh公鑰免密碼登入Linux密碼
- ssh直接帶密碼登入Linux,Linux自動密碼登陸利器sshpass密碼Linux
- Linux 配置 SSH 秘鑰免密碼登入Linux密碼
- Hadoop過程中配置SSH免密碼登入Hadoop密碼
- AWS EC2 Linux | ssh 使用密碼登入Linux密碼
- SSH配置—Linux下實現免密碼登入Linux密碼
- linux中ssh使用rsa免密碼登入方法Linux密碼
- Mac 下 SSH 免密碼登入Mac密碼
- ssh公鑰免密碼登入密碼
- SSH認證免密碼登入密碼
- linux 設定ssh 免密登入Linux
- Linux配置SSH免密碼登入(非root賬號)Linux密碼
- SSH 遠端登入「記住密碼」密碼
- [RHEL7] ssh免密碼登入密碼
- 配置雙機ssh免密碼登入密碼
- SSH無需密碼金鑰登入密碼
- 如何實現 SSH 無密碼登入密碼
- centos ssh免密碼秘鑰登入CentOS密碼
- centos配置ssh免密碼登入後,仍提示輸入密碼CentOS密碼
- SSH安全登陸原理:密碼登陸與公鑰登陸密碼
- 使用SSH RSA key免密碼登入Linux伺服器密碼Linux伺服器
- ssh免密登入原理
- linux A機器ssh登入B機器無需輸入密碼Linux密碼
- linux 設定ssh無密碼登陸Linux密碼
- ssh免密碼登入失敗解決密碼
- [轉] ssh免密碼登入伺服器密碼伺服器
- SSH無密碼登入到指定機器密碼
- ssh無密碼登入認證失敗密碼
- Windows配置ssh免密登入linux+VSCode Remote-SSH免密編寫linux程式碼WindowsLinuxVSCodeREM
- Linux下配置ssh免密遠端登入Linux
- Linux之ssh-copy-id免密登入Linux
- ssh免密碼登陸密碼
- 密碼過期引起的ssh無法登陸密碼
- Linux SSH免密登陸Linux