傳統地用 SSH 登錄 VPS 的時候,靠的只是一串字符密碼,如果密碼被洩露、被猜解、被暴力枚舉成功,那麼 VPS 就完全暴露在壞人手中了。安全意識高一些的用戶會使用公私鑰代替字符來登錄,但是這樣的缺點是如果在陌生的電腦上想要臨時登錄一下,由於沒有私鑰,也就沒辦法了。傳統地登錄 WordPress 的時候,更是只有一個密碼,如果被洩露、猜解、暴力枚舉,辛辛苦苦經營的博客就完蛋了。
本文介紹如何通過 Google Authenticator 構建“物理屏障”,最大限度地阻斷來自網絡的密碼攻擊。本文假定你已經了解 Google Authenticator 的工作原理。
雖然從小就被教導說操作系統一定要設置強勁的密碼,但實際上,小時候用的大多是“遠程桌面連接”默認被禁用的盜版 Windows,且在家裡上網時候總是在路由器後面,沒有獨立公網 IP,因此就算電腦設置為空密碼,也沒有什麼大問題。
後來,上了大學了,網絡環境也有所改變:在宿捨上網的時候,電腦能分配到獨立公網 IP,並且能直接從校外網絡連入(甚至可以跑 Apache 玩),而我的 Xubuntu 又裝了 OpenSSH Server,所以這時候密碼就非常重要了,如果密碼不夠強勁的話,別人可以在互聯網的任何一個地方通過 SSH 完全控制我的電腦。這太可怕了。
雖然不是所有人的電腦都有公網 IP 可以方便地從外網連入,但是顯然 VPS 是有公網 IP 的。我以前居然沒有意識到 VPS 是多麼地脆弱,但是某天突然靈光一現:如果 VPS 的 root 密碼被洩露、猜解或是暴力枚舉,那麼任何人都可以通過 ssh [email protected] 來完全控制我的網站!
這麼遲才想到這一點的確比較奇怪,但是好在,目前還沒有“亡羊”,趕緊先“補牢”吧。個人又非常喜歡 Google Authenticator 這種二步驗證工具(以前寫過文章)於是便結合 Google Authenticator 折騰出了這篇簡陋但是還算安全的教程。本教程中環境默認為:
首先需要在服務器上安裝 libpam-google-authenticator 這個包。Ubuntu 11.10 及以上的官方源裡自帶了這個包,直接使用sudo apt-get install libpam-google-authenticator 命令便可自動解決依賴關系並安裝。但是如果是 11.10 以上或者是其他發行版,就要自己的編譯安裝了。輸入以下幾條命令就行了:
如果用著 Ubuntu 11.10 以下又不想自己編譯的話(比如 VPS 是 11.04 的我),其實也有偷懶的辦法的,就是直接拿官方源裡編譯好的 11.10 的二進制包來充數。這回是不需要 libpam0g-dev 這個包了,直接用下面的命令就好了:
Google Authenticator 的服務器端已經安裝好了,那麼客戶端呢?Android 用戶請點這裡安裝,iOS 用戶請點這裡安裝,其他智能手機用戶也有相應的開源解決方案,請自行搜索下載。非智能手機用戶暫時無解。:-( 不過,正在閱讀本文的你一定早就用過 Google Authenticator 了吧?
Google Authenticator 其實是一套開源的解決方案,所以不僅在 Google 的網站上能用,在其他地方也能用的。然而,在 Google 的網站上,會直接給你一個 QR 碼讓你掃的,而自己配置的 Google Authenticator 則要自己生成了。
首先需要切換到對應的用戶,如果 VPS 上只有一個用戶的話,自然是可以省略這一步的,但是多用戶的 VPS 需要先切換到對應的用戶,再運行google-authenticator 命令,結果類似這樣:
這個 QR 碼自然是給 Google Authenticator 應用程序來掃描的,也可以訪問上面的那個鏈接,用 Google Chart API 生成的 QR 碼來掃描。還可以照著 QR 碼下面的文字密鑰手工輸入。當 Google Authenticator 識別了這個賬號之後,驗證器就配置好了。在文字密鑰下面還提供了幾個應急碼,為手機丟了等情況下所用的,可以妥善保管。
這時 Google Authenticator 雖然運行了,但是相關設置還沒有保存,程序會問你Do you want me to update your "~/.google_authenticator" file (y/n) (是否將配置寫入家目錄的配置文件),當然是回答 y 了。又會問
大意是說是否禁止一個口令多用,自然也是答 y。下一個問題是
大意是問是否打開時間容錯以防止客戶端與服務器時間相差太大導致認證失敗。這個可以根據實際情況來。我的 Android 設備時間很准(與網絡同步的),所以答 n,如果一些 Android 平板電腦不怎麼連網的,可以答 y 以防止時間錯誤導致認證失敗。再一個問題是
選擇是否打開嘗試次數限制(防止暴力攻擊),自然答 y。
問題答完了,家目錄中多出一個 .google_authenticator 文件(默認權限為 400),這時客戶端與服務端已經配套起來了,以後不用再運行google-authenticator 命令了,否則會重新生成一組密碼。
此時雖然 Google Authenticator 已經配置好了,但是並沒有任何程序會去調用它。所以需要設置 SSH 登錄的時候去通過它驗證。
打開 /etc/pam.d/sshd 文件,添加
這一行,保存。再打開 /etc/ssh/sshd_config 文件,找到
把它改成
並保存。最後,輸入
來重啟 SSH 服務以應用新的配置。
這時候再用 SSH 登錄的話就會這樣了:
於是就這樣成功了。
當然,如果經常要登錄 SSH 的話,每次這樣輸入未免太麻煩了,好在,這個額外的認證步驟與以前的公私鑰認證是可以同時使用的。所以在自己的桌面電腦上可以做一下公私鑰認證:
這樣達到的效果是,以後在自己的電腦上 SSH 到 VPS 的時候,是不需要輸入任何密碼的,可以直接連接,而在陌生的電腦上需要管理 VPS 時,需要輸入賬戶密碼及 Google Authenticator 的驗證碼。而想要從網絡上攻擊你的 VPS 的壞人,就算猜出、枚舉出 VPS 的密碼由於沒有手機上 Google Authenticator 的驗證碼,就沒辦法了……
SSH 登錄已經有 Google Authenticator 保護了,但是服務器運行的程序還沒有,比如 WordPress。相對於 MySQL 漏洞攻擊等高難度操作,我覺得 WordPress 被攻破的可能性更大:畢竟也只有一個短短的密碼保護著。好在由於 WordPress 是“大路貨”,用的人很多,插件自然也不少,有人便開發出了 WordPress 用的 Google Authenticator 的插件。啟用方法如下:
配置成功以後,再登錄 WordPress 後台的時候就會是這樣的:
不輸入正確的 Google Authenticator code 是不能登錄的。當然在自己的電腦上是可以勾選 Remember Me 以減少麻煩的。
本文第二節講了如何把 Authenticator 用在 VPS 上以增強 SSH 登錄時的安全性。自然,Authenticator 也是能用在裝有 GNU/Linux 的桌面電腦上的。安裝模塊的方法和在 VPS 上是一樣的,手機上配置也是一樣,但是調用的時候是不同的。
進入 /etc/pam.d/ 目錄,可以看到一些文件:
這些文件從文件名就能看出它們是干嘛的:控制一些重要操作的認證。在 VPS 中,我們在 sshd 中添加了 auth required pam_google_authenticator.so 這一行,於是在 SSH 登錄的時候就會調用 Authenticator 來認證。在別的文件中加入 auth required pam_google_authenticator.so 這一行的話,就會在相應的操作中調用 Authenticator 來認證了。下面是幾個重要的:
當然,如果你的電腦像我一樣裝了 OpenSSH Server 的話,也可以在 sshd 中加入 auth required pam_google_authenticator.so 這一行,使壞人無法從公網上登錄你的電腦。
相對前幾篇博客,這篇博客寫得有一些倉促。並且,教程的內容並不怎麼復雜,Linux 的高級用戶肯定都會的,所以本文的目標讀者只能是剛接觸 Linux VPS 的用戶了,希望能幫到他們。
VIA: http://wzyboy.im/post/765.html