天天看點

使用一次性密碼本通過 SSH 安全登入 Linux使用一次性密碼本通過 SSH 安全登入 Linux

有人說,安全不是一個産品,而是一個過程(lctt 注:安全公司 mcafee 認為,安全風險管理是一個方法論,而不是安全産品的堆疊)。雖然 ssh 協定被設計成使用加密技術來確定安全,但如果使用不當,别人還是能夠破壞你的系統:比如弱密碼、密鑰洩露、使用過時的 ssh 用戶端等,都能引發安全問題。

使用一次性密碼本通過 SSH 安全登入 Linux使用一次性密碼本通過 SSH 安全登入 Linux

<a target="_blank"></a>

otpw 由一次性密碼生成器和 pam 認證規則組成。在 otpw 中一次性密碼由生成器事先生成,然後由使用者以某種安全的方式獲得(比如列印到紙上)。另一方面,這些密碼會通過 hash 加密儲存在 ssh 伺服器端。當使用者使用一次性密碼登入系統時,otpw 的 pam 子產品認證這些密碼,并且保證它們不能再次使用。

使用 apt-get 安裝:

<code>$ sudo apt-get install libpam-otpw otpw-bin</code>

打開針對 ssh 服務的 pam 配置檔案(/etc/pam.d/sshd),注釋掉下面這行(目的是禁用 pam 的密碼認證功能):

<code>#@include common-auth</code>

添加下面兩行(用于打開一次性密碼認證功能):

<code>auth required pam_otpw.so</code>

<code>session optional pam_otpw.so</code>

使用一次性密碼本通過 SSH 安全登入 Linux使用一次性密碼本通過 SSH 安全登入 Linux

在基于 redhat 的發行版中沒有編譯好的 otpw,是以我們需要使用源代碼來安裝它。

首先,安裝編譯環境:

<code>$ sudo yum git gcc pam-devel</code>

<code>$ git clone https://www.cl.cam.ac.uk/~mgk25/git/otpw</code>

<code>$ cd otpw</code>

打開 makefile 檔案,編輯以“pamlib=”開頭的那行配置:

64 位系統:

<code>pamlib=/usr/lib64/security</code>

32 位系統:

<code>pamlib=/usr/lib/security</code>

編譯安裝。需要注意的是安裝過程會自動重新開機 ssh 服務一下,是以如果你是使用 ssh 連接配接到伺服器,做好被斷開連接配接的準備吧(lctt 譯注:也許不會被斷開連接配接,即便被斷開連接配接,請使用原來的方式重新連接配接即可,現在還沒有換成一次性密碼方式。)。

<code>$ make</code>

<code>$ sudo make install</code>

現在你需要更新 selinux 政策,因為 /usr/sbin/sshd 會往你的 home 目錄寫資料,而 selinux 預設是不允許這麼做的。如果沒有使用 selinux 服務(lctt 注:使用 getenforce 指令檢視結果,如果是 enforcing,就是打開了 selinux 服務),請跳過這一步。

<code>$ sudo grep sshd /var/log/audit/audit.log | audit2allow -m mypol</code>

<code>$ sudo semodule -i mypol.pp</code>

接下來打開 pam 配置檔案(/etc/pam.d/sshd),注釋下面這行(為了禁用密碼認證):

<code>#auth substack password-auth</code>

打開 /etc/ssh/sshd_config 檔案,設定下面三個參數。你要確定下面的參數不會重複存在,否則 ssh 伺服器可能會出現異常。

<code>useprivilegeseparation yes</code>

<code>challengeresponseauthentication yes</code>

<code>usepam yes</code>

你還需要禁用預設的密碼認證功能。另外可以選擇開啟公鑰認證功能,那樣的話你就可以在沒有一次性密碼的時候使用公鑰進行認證。

<code>pubkeyauthentication yes</code>

<code>passwordauthentication no</code>

重新開機 ssh 伺服器。

debian, ubuntu 或 linux mint 發行版:

<code>$ sudo service ssh restart</code>

fedora 或 centos/rhel 7 發行版:

<code>$ sudo systemctl restart sshd</code>

(lctt 譯注:雖然這裡重新開機了 sshd 服務,但是你目前的 ssh 連接配接應該不受影響,隻是在你完成下述步驟之前,無法按照原有方式建立新的連接配接了。是以,保險起見,要麼多開一個 ssh 連接配接,避免誤退出目前連接配接;要麼将重新開機 sshd 伺服器步驟放到步驟3完成之後。)

之前提到過,你需要事先建立一次性密碼,并儲存起來。使用 otpw-gen 指令建立密碼:

<code>$ cd ~</code>

<code>$ otpw-gen &gt; temporary_password.txt</code>

使用一次性密碼本通過 SSH 安全登入 Linux使用一次性密碼本通過 SSH 安全登入 Linux

這個指令會讓你輸入密碼字首,當你以後登入的時候,你需要同時輸入這個字首以及一次性密碼。密碼字首是另外一層保護,就算你的一次性密碼表被洩漏,别人也無法通過暴力破解你的 ssh 密碼。

設定好密碼字首後,這個指令會産生 280 個一次性密碼(lctt 譯注:儲存到 ~/.otpw 下),并将它們導出到一個文本檔案中(如 temporary_password.txt)。每個密碼(預設是 8 個字元)由一個 3 位十進制數索引。你需要将這個密碼表列印出來,并随身攜帶。

使用一次性密碼本通過 SSH 安全登入 Linux使用一次性密碼本通過 SSH 安全登入 Linux

檢視 ./.otpw 檔案,它存放了一次性密碼的 hash 值。頭 3 位十進制數與你随身攜帶的密碼表的索引一一對應,在你登入 ssh 伺服器的時候會被用到。

<code>$ more ~/.otpw</code>

<code>otpw1</code>

<code>280 3 12 8</code>

<code>191ai+:enwmmqwn</code>

<code>218tyrzc%piy27a</code>

<code>241ve8ns%nshfmf</code>

<code>055w4/ycauqjkr:</code>

<code>102znj4vwlfrk5n</code>

<code>2273xww55htej8y</code>

<code>1509d4b5=a64jbt</code>

<code>168fwbxy%ztm9j%</code>

<code>000rwusdbyr%8ue</code>

<code>037nvyryzci+yrx</code>

<code>122rewa3gxvok=z</code>

使用普通的方式登入 ssh 伺服器:

<code>$ ssh user@remote_host</code>

如果 otpw 成功運作,你會看到一點與平時登入不同的地方:

<code>password 191:</code>

現在打開你的密碼表,找到索引号為 191 的密碼。

<code>023 kbvp tq/g 079 jkew /hrm 135 ow/c /ueb 191 foo+ peid 247 vanz egut</code>

從上表可知,191 号密碼是“foo+peid”。你需要加上密碼字首,比如你設定的字首是“000”,則你實際需要輸入的密碼是“000foo+peid”。

成功登入後,你這次輸入的密碼自動失效。檢視 ~/.otpw 檔案,你會發現第一行變成“---------------”,這表示 191 号密碼失效了。

<code>---------------</code>

在這個教程中,我介紹了如何使用 otpw 工具來設定一次性登入密碼。你也許意識到了在這種雙因子的認證方式中,列印一張密碼表讓人感覺好 low,但是這種方式是最簡單的,并且不用依賴任何第三方軟體。無論你用哪種方式建立一次性密碼,在你需要在一個不可信任的環境登入 ssh 伺服器的時候,它們都很有用。你可以就這個主題來分享你的經驗和觀點。

原文釋出時間:2015-05-22

本文來自雲栖合作夥伴“linux中國”

繼續閱讀