进一步部署 Google Authenticator:Apache 模块

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 包得到。


  1. sudo apt-get install apache2-prefork-dev

接下来便可使用 apxs2 来安装模块:


  1. sudo apxs2 -i -a -n authn_google mod_authn_google.so

各参数含义:

-i
安装
-a
自动添加 LoadModule 语句,方便加载
-n authn_google
安装后模块的名字
mod_authn_google.so
刚才下载得到的模块的文件名

由于这是一个已经编译好的模块了,所以除了用脚本来自动安装,也可以手工安装:


  1. sudo cp mod_authn_google.so /usr/lib/apache2/modules/
  2. 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 文件,以下是范例:


  1. # 要加上验证的目录
  2. Options FollowSymLinks Indexes ExecCGI
  3. AllowOverride All # 允许每个目录下通过 .htaccess 覆盖这里的全局设置
  4. Order deny,allow
  5. Allow from all
  6.  
  7. AuthType Basic
  8. AuthName "Secret" # 弹出窗口的提示信息
  9. AuthBasicProvider "google_authenticator"
  10. Require valid-user
  11. GoogleAuthUserPath ga_auth # 保存认证信息的目录
  12. GoogleAuthCookieLife 3600 # Cookies 有效时间,这段时间内不用再输密码,单位为秒
  13. GoogleAuthEntryWindow 2 # 当时间不同步时,允许有这样的正负误差。以 30s 为单位

保存退出之后,再


  1. sudo a2enmod authn_google && sudo service apache2 restart

即可,如果没有报错的话,现在现在 mod_authn_google 应该已经在工作了,访问 /secret 的话会提示输入用户名密码,但是我们没有添加用户,所以输啥都是错的。

四、添加认证用户

认证用户是通过 Google Authenticator 提供的工具来生成认证文件的,将生成的认证文件复制到 GoogleAuthUserPath 所对应的目录即可,比如/etc/apache2/ga_auth。

如何使用 Google Authenticator 生成新用户的说明,在这篇文章中已经很清楚了,这里再提一下:

  1. 使用包管理器安装 libpam-google-authenticator 这个包。以 Ubuntu Server 为例:
    
    
    1. sudo apt-get install libpam-google-authenticator
  2. 如果之前用过 Google Authenticator,请先将 ~/.google_authenticator 文件改名备份一下。
  3. 运行
    
    
    1. google-authenticator

    命令,把屏幕上的 QR 码扫描到装有 Google Authenticator 的手机中,并按照提示回答几个问题,生成新的 ~/.google_authenticator 文件。

这样便生成了一个有效的用户。将家目录中新生成的 .google_authenticator 文件复制到 /etc/apache2/ga_auth 目录下,文件名为用户名,并使用


  1. 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 继续工作了。此时用户名输什么都可以,密码则是要保持正确的。这倒也别有一番风味……

原文发布时间为:2014-03-06

本文来自合作伙伴“Linux中国”

时间: 2024-11-02 00:24:05

进一步部署 Google Authenticator:Apache 模块的相关文章

用 Google Authenticator 加强 VPS 及 WordPress 甚至桌面电脑的安全性

传统地用 SSH 登录 VPS 的时候,靠的只是一串字符密码,如果密码被泄露.被猜解.被暴力枚举成功,那么 VPS 就完全暴露在坏人手中了.安全意识高一些的用户会使用公私钥代替字符来登录,但是这样的缺点是如果在陌生的电脑上想要临时登录一下,由于没有私钥,也就没办法了.传统地登录 WordPress 的时候,更是只有一个密码,如果被泄露.猜解.暴力枚举,辛辛苦苦经营的博客就完蛋了. 本文介绍如何通过 Google Authenticator 构建"物理屏障",最大限度地阻断来自网络的密码

mod_myvhost 0.21发布 PHP虚拟主机的Apache模块

mod_myvhost 是一个用于动态配置基于域名的PHP大规模http://www.aliyun.com/zixun/aggregation/14840.html">虚拟主机的Apache模块.可以将虚拟主机配置和PHP设置存储到MySQL数据库中,无需每个虚拟主机的apache配置文件,配置更改后不需要重新启动apache.它能够动态更改任何虚拟主机的PHP设置,在默认情况下,设置open_basedir作为虚拟主机的rootdir,你可以改变任何在php.ini中的参数. mod_m

Apache::Deploy 0.8.0发布 Tomcat的Apache模块

Apache::Deploy是一个http://www.aliyun.com/zixun/aggregation/14417.html">Apache模块和WAR文件配置到Tomcat服务器的工具.它简化了多台服务器的部署过程. Apache::Deploy 0.8.0版本添加了对Windows的支持. 使用示范:(https://github.com/krimdomu/rex-apache-deploy) 在你的Rexfile文件中使用以下命令,建立一个软件包: use Rex::Apa

mod_jail patch for Apache-2.2.21发布 一个Apache模块

mod_jail是一个http://www.aliyun.com/zixun/aggregation/14417.html">Apache模块,支持1.3.x以及2.0.x版本分支.它类似于mod_chroot ,但使用FreeBSD的特定系统调用"jail监狱",这使得比chroot更安全,其目的是在FreeBSD上运行.该模块允许Apache更容易地运行在一个安全的监狱,无需创建一个真正的监狱环境,需要包含/lib,/libexec,/usr/lib目录,等.它还能

Apache::Deploy 0.7.0发布 Tomcat的Apache模块

Apache::Deploy是一个http://www.aliyun.com/zixun/aggregation/14417.html">Apache模块和WAR文件配置到Tomcat服务器的工具.它简化了多台服务器的部署过程. Apache::Deploy 0.7.0版本增加了对Coffeescript, Sass和Sprockets支持. 使用示范:(https://github.com/krimdomu/rex-apache-deploy) 在你的Rexfile文件中使用以下命令,建

mod_jail patch for Apache-2.2.20发布 一个Apache模块

mod_jail patch for http://www.aliyun.com/zixun/aggregation/14417.html">Apache-2.2.20该版本自2.2.19源代码以来没有任何变化. mod_jail是一个Apache模块,支持1.3.x以及2.0.x版本分支.它类似于mod_chroot ,但使用特定的系统调用FreeBSD的"监狱",这使得chroot更加安全.因此,它的目的仅在FreeBSD上运行.这个模块允许Apache运行一个安全

Android中新引进的Google Authenticator验证系统工作原理浅析

为了改进Android的安全问题,Google在Android系统中引入了谷歌验证应用(Google Authenticator)来保证账号的安全.谷歌验证应用的使用方法是:用户安装手机客户端,生成临时身份验证码,提交到服务器验证身份,类似的验证系统还有Authy.Robbie在其GitHub页面发布了自己用Go语言实现的版本,并撰写了一篇博文来解释其工作原理. 通常来讲,身份验证系统都实现了基于时间的一次性密码算法,即著名的TOTP(Time-Based One-Time Password).

在WIN98下以apache模块方式安装php

在WIN98下以apache模块方式安装php手记 foolboy@chinaren.com ★相关软件:     mod_php4-4.0.1-pl2.zip     php-4.0.1pl2-Win32.zip     以上软件可以在www.php.net或者www.phpuser.com上下载     注意两者的版本一定要一样,     (关键是mod_php4.dll与php4ts.dll及Msvcrt.dll版本相同) ★具体步骤:     用winzip分别将两个.zip文件解压  

win8下XAMPP中Apache模块无效解决办法

  win8下XAMPP中Apache模块无效解决办法 win8下系统默认占用80端口,导致apache无法打开. 以管理员权限运行c:windowssystem32cmd.exe C:WINDOWSsystem32>net stop http HTTP Service 服务已成功停止. C:WINDOWSsystem32>netstat -ano | findstr 0.0.0.0:80 C:WINDOWSsystem32>sc config http start=disabled [