天天看點

用 Google Authenticator 加強 VPS 及 WordPress 甚至桌面電腦的安全性

傳統地用 ssh 登入 vps 的時候,靠的隻是一串字元密碼,如果密碼被洩露、被猜解、被暴力枚舉成功,那麼 vps 就完全暴露在壞人手中了。安全意識高一些的使用者會使用公私鑰代替字元來登入,但是這樣的缺點是如果在陌生的電腦上想要臨時登入一下,由于沒有私鑰,也就沒辦法了。傳統地登入 wordpress 的時候,更是隻有一個密碼,如果被洩露、猜解、暴力枚舉,辛辛苦苦經營的部落格就完蛋了。

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

雖然從小就被教導說作業系統一定要設定強勁的密碼,但實際上,小時候用的大多是“遠端桌面連接配接”預設被禁用的盜版 windows,且在家裡上網時候總是在路由器後面,沒有獨立公網 ip,是以就算電腦設定為空密碼,也沒有什麼大問題。

雖然不是所有人的電腦都有公網 ip 可以友善地從外網連入,但是顯然 vps 是有公網 ip 的。我以前居然沒有意識到 vps 是多麼地脆弱,但是某天突然靈光一現:如果 vps 的 root 密碼被洩露、猜解或是暴力枚舉,那麼任何人都可以通過 ssh [email protected] 來完全控制我的網站!

客戶機為裝着 xubuntu 11.10 amd64 的筆記本電腦。

首先需要在伺服器上安裝 libpam-google-authenticator 這個包。ubuntu 11.10 及以上的官方源裡自帶了這個包,直接使用sudo apt-get install libpam-google-authenticator 指令便可自動解決依賴關系并安裝。但是如果是 11.10 以上或者是其他發行版,就要自己的編譯安裝了。輸入以下幾條指令就行了:

sudo apt-get install libpam0g-dev libqrencode3 #這是它依賴的兩個包,各發行版裡大多帶了。

git clone https://code.google.com/p/google-authenticator/ #下載下傳源代碼

cd google-authenticator/libpam/

make install #編譯并安裝

如果用着 ubuntu 11.10 以下又不想自己編譯的話(比如 vps 是 11.04 的我),其實也有偷懶的辦法的,就是直接拿官方源裡編譯好的 11.10 的二進制包來充數。這回是不需要 libpam0g-dev 這個包了,直接用下面的指令就好了:

sudo apt-get install libqrencode3 #這個包依然是要的

wget http://us.archive.ubuntu.com/ubuntu/pool/universe/g/google-authenticator/libpam-google-authenticator_20110413.68230188bdc7-1ubuntu1_amd64.deb #下載下傳二進制包,如果是 32 位的作業系統的話請把 amd64 換成 i386

sudo dpkg -i libpam-google-authenticator_20110413.68230188bdc7-1ubuntu1_amd64.deb #安裝之

google authenticator 其實是一套開源的解決方案,是以不僅在 google 的網站上能用,在其他地方也能用的。然而,在 google 的網站上,會直接給你一個 qr 碼讓你掃的,而自己配置的 google authenticator 則要自己生成了。

首先需要切換到對應的使用者,如果 vps 上隻有一個使用者的話,自然是可以省略這一步的,但是多使用者的 vps 需要先切換到對應的使用者,再運作google-authenticator 指令,結果類似這樣:

用 Google Authenticator 加強 VPS 及 WordPress 甚至桌面電腦的安全性

root-natatio-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 了。又會問

do you want to disallow multiple uses of the same authentication

token? this restricts you to one login about every 30s, but it increases

your chances to notice or even prevent man-in-the-middle attacks (y/n)

大意是說是否禁止一個密碼多用,自然也是答 y。下一個問題是

by default, tokens are good for 30 seconds and in order to compensate for

possible time-skew between the client and the server, we allow an extra

token before and after the current time. if you experience problems with poor

time synchronization, you can increase the window from its default

size of 1:30min to about 4min. do you want to do so (y/n)

大意是問是否打開時間容錯以防止用戶端與伺服器時間相差太大導緻認證失敗。這個可以根據實際情況來。我的 android 裝置時間很準(與網絡同步的),是以答 n,如果一些 android 平闆電腦不怎麼連網的,可以答 y 以防止時間錯誤導緻認證失敗。再一個問題是

if the computer that you are logging into isn't hardened against brute-force

login attempts, you can enable rate-limiting for the authentication module.

by default, this limits attackers to no more than 3 login attempts every 30s.

do you want to enable rate-limiting (y/n)

選擇是否打開嘗試次數限制(防止暴力攻擊),自然答 y。

問題答完了,家目錄中多出一個 .google_authenticator 檔案(預設權限為 400),這時用戶端與服務端已經配套起來了,以後不用再運作google-authenticator 指令了,否則會重新生成一組密碼。

此時雖然 google authenticator 已經配置好了,但是并沒有任何程式會去調用它。是以需要設定 ssh 登入的時候去通過它驗證。

打開 /etc/pam.d/sshd 檔案,添加

auth required pam_google_authenticator.so

這一行,儲存。再打開 /etc/ssh/sshd_config 檔案,找到

challengeresponseauthentication no

把它改成

challengeresponseauthentication yes

并儲存。最後,輸入

sudo service ssh restart

來重新開機 ssh 服務以應用新的配置。

這時候再用 ssh 登入的話就會這樣了:

wzyboy@vermilion:~$ ssh root@natatio

password:[輸入密碼]

verification code:[輸入驗證碼]

welcome to ubuntu 11.04 (gnu/linux 2.6.38-8-generic x86_64)

于是就這樣成功了。

當然,如果經常要登入 ssh 的話,每次這樣輸入未免太麻煩了,好在,這個額外的認證步驟與以前的公私鑰認證是可以同時使用的。是以在自己的桌面電腦上可以做一下公私鑰認證:

ssh-keygen #生成密鑰對,一路回車即可,已經生成過的不用生成了

ssh-copy-id [email protected] #把公鑰添加到 vps 上

這樣達到的效果是,以後在自己的電腦上 ssh 到 vps 的時候,是不需要輸入任何密碼的,可以直接連接配接,而在陌生的電腦上需要管理 vps 時,需要輸入賬戶密碼及 google authenticator 的驗證碼。而想要從網絡上攻擊你的 vps 的壞人,就算猜出、枚舉出 vps 的密碼由于沒有手機上 google authenticator 的驗證碼,就沒辦法了……

ssh 登入已經有 google authenticator 保護了,但是伺服器運作的程式還沒有,比如 wordpress。相對于 mysql 漏洞攻擊等高難度操作,我覺得 wordpress 被攻破的可能性更大:畢竟也隻有一個短短的密碼保護着。好在由于 wordpress 是“大路貨”,用的人很多,插件自然也不少,有人便開發出了 wordpress 用的 google authenticator 的插件。啟用方法如下:

在 wordpress 背景搜尋并安裝 google authenticator 這個插件,啟用之。

在 wordpress 背景個人 profile 頁面 google authenticator settings 選項下,選中 active,填好 description(隻是在手機上顯示的名字而已),再點選 show/hide qr code。

在 google authenticator 應用程式中掃描這個 qr 碼以添加賬号,或者手工輸入 secret 也行。

配置成功以後,再登入 wordpress 背景的時候就會是這樣的:

用 Google Authenticator 加強 VPS 及 WordPress 甚至桌面電腦的安全性

wordpress-google-authenticator

不輸入正确的 google authenticator code 是不能登入的。當然在自己的電腦上是可以勾選 remember me 以減少麻煩的。

進入 /etc/pam.d/ 目錄,可以看到一些檔案:

wzyboy@vermilion:/etc/pam.d$ ls

atd common-password lightdm-autologin ppp

chfn common-session login samba

chpasswd common-session-noninteractive newusers sshd

chsh cron other su

common-account cups passwd sudo

common-auth lightdm polkit-1 xscreensaver

這些檔案從檔案名就能看出它們是幹嘛的:控制一些重要操作的認證。在 vps 中,我們在 sshd 中添加了 auth required pam_google_authenticator.so 這一行,于是在 ssh 登入的時候就會調用 authenticator 來認證。在别的檔案中加入 auth required pam_google_authenticator.so 這一行的話,就會在相應的操作中調用 authenticator 來認證了。下面是幾個重要的:

lightdm。這個會使通過圖形界面登入的時候要求輸入驗證碼,效果如下:

用 Google Authenticator 加強 VPS 及 WordPress 甚至桌面電腦的安全性
用 Google Authenticator 加強 VPS 及 WordPress 甚至桌面電腦的安全性

xscreensaver。這個會使屏保解鎖的時候也要輸入密碼和驗證碼,效果如下:

用 Google Authenticator 加強 VPS 及 WordPress 甚至桌面電腦的安全性

login。這個會使在字元界面下(如 tty)登入的時候也會要求輸入驗證碼。

passwd。這個會使設定使用者密碼的時候要求輸入驗證碼。

sudo。這個會使普通使用者試圖提權執行系統操作的時候要求輸入驗證碼。很适合給多人共享電腦用。

當然,如果你的電腦像我一樣裝了 openssh server 的話,也可以在 sshd 中加入 auth required pam_google_authenticator.so 這一行,使壞人無法從公網上登入你的電腦。

相對前幾篇部落格,這篇部落格寫得有一些倉促。并且,教程的内容并不怎麼複雜,linux 的進階使用者肯定都會的,是以本文的目标讀者隻能是剛接觸 linux vps 的使用者了,希望能幫到他們。

原文釋出時間為:2014-03-06

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