有人說,安全不是一個産品,而是一個過程(lctt 注:安全公司 mcafee 認為,安全風險管理是一個方法論,而不是安全産品的堆疊)。雖然 ssh 協定被設計成使用加密技術來確定安全,但如果使用不當,别人還是能夠破壞你的系統:比如弱密碼、密鑰洩露、使用過時的 ssh 用戶端等,都能引發安全問題。
<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>
在基于 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 > temporary_password.txt</code>
這個指令會讓你輸入密碼字首,當你以後登入的時候,你需要同時輸入這個字首以及一次性密碼。密碼字首是另外一層保護,就算你的一次性密碼表被洩漏,别人也無法通過暴力破解你的 ssh 密碼。
設定好密碼字首後,這個指令會産生 280 個一次性密碼(lctt 譯注:儲存到 ~/.otpw 下),并将它們導出到一個文本檔案中(如 temporary_password.txt)。每個密碼(預設是 8 個字元)由一個 3 位十進制數索引。你需要将這個密碼表列印出來,并随身攜帶。
檢視 ./.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中國”