上一篇日志中提到通过Google Authenticator来增强sshd的安全,其实Google Authenticator的动态认证应用范围非常广,不仅仅只是对于sshd的增加。其也可以用于对vsftpd、lightdm、screen、xscreen、su、sudo、samba等等,只要是调用到pam模块的服务—————具体ls下/etc/pam.d目录,我们都可以在其认证之前增加google动态认证。配置方法同sshd相同。配置完后,重启服务让配置生效。

难道Google Authenticator仅仅局限于对pam相关应用的增强吗?肯定不止。其还可以应用到web方面。其原理也非常简单。类似于在ssh上的应用,只不过是生成apache的相关模块。该模块的用法有点类似于使用 mod_auth_basicmod_auth_digest 来进行验证 。费话了半天,最重要的还是看操作。

一、安装 mod_authn_google模块

该项目所在的地址为:

https://code.google.com/p/google-authenticator-apache-module/downloads/list

google-auth-for-apache

如上图所示,下载时选择针对apache的下载。下载安成后,不能直接解包安装。因为这个版本是有bug的。需要替换其中的一个文件——— mod_authn_google.c 。View Download

 1[root@localhost tmp]# tar jxvf GoogleAuthApacheModule_v01.bz2
 2google-authenticator-apache-module/base32.c
 3google-authenticator-apache-module/base32.h
 4google-authenticator-apache-module/googleauth.conf
 5google-authenticator-apache-module/hmac.c
 6google-authenticator-apache-module/hmac.h
 7google-authenticator-apache-module/Makefile
 8google-authenticator-apache-module/mod_authn_google.c
 9google-authenticator-apache-module/README
10google-authenticator-apache-module/sha1.c
11google-authenticator-apache-module/sha1.h
12[root@localhost tmp]# cd google-authenticator-apache-module/
13[root@localhost google-authenticator-apache-module]# ll
14总计 60
15-rw-r--r-- 1 www www  2477 2011-04-30 base32.c
16-rw-r--r-- 1 www www  1391 2011-04-30 base32.h
17-rw-r--r-- 1 www www  1655 2011-04-30 googleauth.conf
18-rw-r--r-- 1 www www  2495 2011-04-30 hmac.c
19-rw-r--r-- 1 www www   919 2011-04-30 hmac.h
20-rw-r--r-- 1 www www   287 2011-04-30 Makefile
21-rw-r--r-- 1 www www 15370 2011-04-30 mod_authn_google.c   //注意该文件一定要先替换掉。
22-rw-r--r-- 1 www www  1478 2011-04-30 README
23-rw-r--r-- 1 www www 10966 2011-04-30 sha1.c
24-rw-r--r-- 1 www www  1195 2011-04-30 sha1.h
25[root@localhost google-authenticator-apache-module]# make &&make install

make install 安装完成后,可能会出现一个报错,内容如下:

1sudo cp .libs/mod_authn_google.so /usr/local/apache2/modules/
2cp: 无法创建一般文件“/usr/local/apache2/modules/”: 没有那个文件或目录
3make: *** [install] 错误 1

这个错误没关系的,因为作者在创作该模块时,不是在centos/redhat上创建的(也有可能作者是源码包编译的apache),这个不去管他。通过系统自带的apxs脚本进行安装配置(另外一些发行版上可能叫做apxs2,该工具会自动完成cp到apache的模块目录下)。

1apxs -i -a -n authn_google mod_authn_google.so

各参数含义:

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

也可以手动完成(以下两步操作的效果同上面apxs安装的效果是一样的),先复制模板文件

1cp .libs/mod_authn_google.so /etc/httpd/modules/

再打开httpd.conf文件,加入如下一行即可:

1LoadModule authn_google_module /usr/local/apache2/modules/mod_authn_google.so

二、apache conf文件配置

修改想要使用google认证的虚拟主机的配置如下:

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

三、配置用认证

按照Google Authenticator加强ssh安全 里的方法安装google-authenticator命令,当然也可以从其他有该命令的机器上复制生成的~/.google_authenticator文件来用。将相存放的路径和上面配置中的一致,比如上例中是在/tmp/googletest目录下 (现网中千万不要这样放,因为tmp目录是一个存放临时文件的目录。一般用都有修改权限 。)

1cp ~/.google_authenticator  /tmp/googletest/361way
2chmod 640 361way //避免其他用户修改该文件的内容
3chown root:apache 361way  //让apache用户组具有读取该文件的权限

注:文件名即后面打开页面时要输入的用户名,密码就是google动态口令;允许按此方法生成多个用户 。

四、可能遇到的错误

错误1:

1[root@localhost modules]# /etc/init.d/httpd restart
2停止 httpd:                                               [确定]
3启动 httpd:httpd: Syntax error on line 206 of /etc/httpd/conf/httpd.conf: Cannot load /usr/lib64/httpd/modules/mod_authn_google.so into server: /usr/lib64/httpd/modules/mod_authn_google.so: ELF file OS ABI invalid

出现该错误的原因很简单,太懒惰了。直接使用了该项目wiki页面上提供的编译好的模块 。因为该模块编译时的linux环境可能和我们在用的环境有区别,导致出该错误。下载源代码后重新编译即可。

错误2(apache的错误日志中查看):

1Cookie in header: "(null)"
2**** PW AUTH at  T=1357464913  user  "aaa"
3(2)No such file or directory: check_password: Could not open password file: /tmp/googletest/(null)
4user aa: authentication failure for "/testlink/": Password Mismatch

没有替换上面提到的bug文件,不过将密码文件的名字修改为“(null)” 就可以使用了,不过仍然会有bug —— 用户名可以使用任意,但动态密码一定要对,不对仍然不能验证通过。

备注:

bug修复后的验证日志也在apache的error_log日志中,access日志中不会记录 。具体如下:

1**** COOKIE AUTH at  T=1357464923
2Cookie in header: "google_authn=361way:1357468521:2a26GUrnKDk8+Zp8wD37jGa3+5A=:"
3Found cookie Expires "1357468521" Valid "2a26GUrnKDk8+Zp8wD37jGa3+5A="
4Match cookie "2a26GUrnKDk8+Zp8wD37jGa3+5A=" vs  "2a26GUrnKDk8+Zp8wD37jGa3+5A="
5User 361way auth granted from cookie
6Created cookie expires 1357469123 (time = 3600) hash is AoVthaJtnVbRSy3TjwpuHdhoawI= Cookie: google_authn=361way:1357469123:AoVthaJtnVbRSy3TjwpuHdhoawI=:

本文参考以下资料:

https://wzyboy.im/post/869.html  (ubuntu的安装步骤)

https://code.google.com/p/google-authenticator-apache-module/issues/detail?id=3 (该模块的wiki页面)