Google Authenticator 是個好東西。它不僅可以增強 Google 賬戶登入的安全性,更因為它開源的特性,被部署到別的地方使用。比如 Linux PAM、WordPress 等,使使用者可以藉助 Google 的這套 OTP 方案,增強自己的伺服器、網站和個人電腦的安全性。筆者之前就寫過一篇詳細的教程《用 Google Authenticator 加強 VPS 及 WordPress 甚至案頭電腦的安全性》,介紹如何把 Google Authenticator 部署到伺服器、WordPress 和個人電腦上。如果你覺得這還不夠安全的話,本文將會教會你如何把它部署到 Apache 裡。
一、Google Authenticator 的 Apache 模組的優勢
如何增強伺服器的安全性?這個問題向來都是站長們的討論焦點。從 SSH 登入方面來說,可以限制 IP 位址登入,可以禁用密碼登入(僅用公開金鑰登入),可以用 Fail2ban 來對付它們,甚至可以把嘗試暴力破解的 IP 加到 iptables 黑名單中等。但是,Web 前端怎麼辦?總不能限制 IP 位址訪問吧?比如 WordPress 的管理後台和 phpMyAdmin 的登入頁面,就是很容易遭到攻擊的地方。為了防禦這種人肉攻擊,簡單點地做法是用mod_auth_basic 或 mod_auth_digest 來進行驗證,高檔一點的話,可以用 mod_ssl 中的雙向 TLS 認證。但是前者太簡單,如果頁面是 http:// 的話,密碼是明文傳輸的,對攻擊者來說十分方便的,而後者相對來說比較複雜,要自己建立並維護一個 CA,或者需要花錢去請第三方 CA 簽署憑證。而 Google Authenticator 的 Apache 模組 mod_authn_google 則提供一種經濟、方便、簡潔、有效認證方式:動態密碼認證。
相對 mod_auth_basic 來說,mod_authn_google 的密碼是動態,更不易被猜解;相對 mod_ssl 的雙向 TLS 認證來說,mod_authn_google 免去了額外請第三方 CA 簽名的資金和複雜的配置 CA 憑證的過程的痛苦。
二、安裝 mod_authn_google
由於這不是官方模組,所以必然是要我們自己來下載安裝的。這個項目的首頁在這裡,但是它的下載列表中提供的模組是有 Bug 的,如果不想自己修複 Bug 的話,可以在這裡下載到 Bug 修複後的 mod_authn_google。
注意,這個模組是在 64 位元 Linux 下編譯的,如果你用的是 32 位的系統,請下載源碼後自行編譯。
下載得到的是一個 .so 的庫檔案,可以使用 apxs2 指令碼來安裝,以 Ubuntu 等基於 APT 和 dpkg 的發行版為例,這個指令碼可以通過安裝 apache2-prefork-dev 包得到。
- sudo apt-get install apache2-prefork-dev
接下來便可使用 apxs2 來安裝模組:
- sudo apxs2 -i -a -n authn_google mod_authn_google.so
各參數含義:
-
-i
-
安裝
-
-a
-
自動添加 LoadModule 語句,方便載入
-
-n authn_google
-
安裝後模組的名字
-
mod_authn_google.so
-
剛才下載得到的模組的檔案名稱
由於這是一個已經編譯好的模組了,所以除了用指令碼來自動安裝,也可以手工安裝:
- sudo cp mod_authn_google.so /usr/lib/apache2/modules/
- echo "LoadModule authn_google_module /usr/lib/apache2/modules/mod_authn_google.so"| sudo tee /etc/apache2/mods-available/authn_google.load
三、配置 mod_authn_google
首先要建一個供它存放認證資訊的地方,比如 /etc/apache2/ga_auth,接下來編輯 /etc/apache2/mods-available/authn_google.conf 檔案,以下是範例:
- <Directory/secret># 要加上驗證的目錄
- Options FollowSymLinks Indexes ExecCGI
- AllowOverride All# 允許每個目錄下通過 .htaccess 覆蓋這裡的全域設定
- Order deny,allow
- Allow from all
- AuthType Basic
- AuthName "Secret"# 快顯視窗的提示資訊
- AuthBasicProvider "google_authenticator"
- Require valid-user
- GoogleAuthUserPath ga_auth# 儲存認證資訊的目錄
- GoogleAuthCookieLife 3600# Cookies 有效時間,這段時間內不用再輸密碼,單位為秒
- GoogleAuthEntryWindow 2# 當時間不同步時,允許有這樣的正負誤差。以 30s 為單位
- </Directory>
儲存退出之後,再
- sudo a2enmod authn_google && sudo service apache2 restart
即可,如果沒有報錯的話,現在現在 mod_authn_google 應該已經在工作了,訪問 /secret 的話會提示輸入使用者名稱密碼,但是我們沒有添加使用者,所以輸啥都是錯的。
四、添加認證使用者
認證使用者是通過 Google Authenticator 提供的工具來產生認證檔案的,將產生的認證檔案複製到 GoogleAuthUserPath 所對應的目錄即可,比如/etc/apache2/ga_auth。
如何使用 Google Authenticator 產生新使用者的說明,在這篇文章中已經很清楚了,這裡再提一下:
- 使用包管理器安裝 libpam-google-authenticator 這個包。以 Ubuntu Server 為例:
- sudo apt-get install libpam-google-authenticator
- 如果之前用過 Google Authenticator,請先將 ~/.google_authenticator 檔案改名備份一下。
- 運行
- google-authenticator
命令,把螢幕上的 QR 代碼掃描到裝有 Google Authenticator 的手機中,並按照提示回答幾個問題,產生新的 ~/.google_authenticator 檔案。
這樣便產生了一個有效使用者。將家目錄中新產生的 .google_authenticator 檔案複製到 /etc/apache2/ga_auth 目錄下,檔案名稱為使用者名稱,並使用
- sudo chmod 640 wzyboy && sudo chown root:www-data wzyboy
(把 wzyboy 更換為相應的使用者名稱)變更檔許可權,以確保 Apache 能讀取它,便完成了一個使用者的添加。如需更多使用者訪問,重複這些步驟即可。最後記得把家目錄裡的 .google_authenticator 檔案改回來。
五、調試與偵錯
建議在瀏覽器的隱藏視窗中進行調試以排除 Cookies 的幹擾。如果出錯,可從 /var/log/apache2/error.log 中找答案。
補充:該模組在 Google Code 上的先行編譯檔案有 Bug,不讀取 Cookies,導致提示找不到 /etc/apache2/ga_auth/(null) 檔案。這時一個比較搞笑的 wordaround 就是把你的使用者認證資訊檔重新命名為 (null),然後就可以配合這個 Bug 繼續工作了。此時使用者名稱輸什麼都可以,密碼則是要保持正確的。這倒也別有一番風味…… via @jimmy_xu_wrk。
via : http://wzyboy.im/post/869.html