余额不足 2011-01-26
前段时间因为项目需要在Ubuntu+Apache的环境下配置了基本Active Directory的Kerberos验证, 主要为了实现WEB应用基于AD的单点登陆SSO(即SingleSignOn).
下面将配置过程做简单记录:
0.先说一下我的环境
Ubuntu9.04 + Apache2.2x + Win2k8 & AD1. 因为Apache本身是不支持Kerberos的, 所以我们第一步是安装Kerberos Module for Apache即Mod_auth_kerb , 关于这个mod的文档资料和下载可以在官网找到. 在Ubuntu下不需要编译安装, 执行下面的apt-get搞定mod的安装. 安装后Apache的配置中会自动加载mod_auth_kerb.so, 不需要手工修改配置文件.
# sudo apt-get install libapache2-mod-auth-kerb
2. 装好Mod_auth_kerb后, 我们来对Kerberos进行配置, 编辑/etc/krb5.conf, 这里建议将原配置文件备份(cp /etc/krb5.conf /etc/krb5_bak.conf), 然后清空原配置文件内容, 贴入如下配置信息并按实际需求进行相应修改(default_realm, kdc, example.com).
[libdefaults] ticket_lifetime = 24000 default_realm = EXAMPLE.COM dns_lookup_realm = false dns_lookup_kdc = false [realms] EXAMPLE.COM = { kdc = dc-01.example.com:88 kdc = dc-02.example.com:88 } [domain_realm] .example.com = EXAMPLE.COM example.com = EXAMPLE.COM [appdefaults] pam = { debug = false ticket_lifetime = 36000 renew_lifetime = 36000 forwardable = true krb4_convert = false }
3. 修改好配置文件后, 我们先来对Kerberos进行一个测试, 验证一下配置是否正确.命令行下执行kinit , 按提示输入AD用户的密码. 再在命令行下执行klist命令, 如果出现如下提示, 表示Kerberos验证成功.
# kinit Username Password for Username @ EXAMPLE.COM: # klist Ticket cache: FILE:/tmp/krb5cc_0 Default principal: Username @ EXAMPLE.COM Valid starting Expires Service principal 07/23/10 15:57:06 07/23/10 22:37:06 krbtgt/ EXAMPLE.COM @ EXAMPLE.COM
4. 在WinServer端生成.Keytab文件, 然后将生成的.keytab文件copy到ubuntu上.
C:\Program Files\Support Tools>ktpass -princ HTTP/apache.server.fqdn@ EXAMPLE.COM -mapuser apache_server -crypto DES-CBC-MD5 -ptype KRB5_NT_PRINCIPAL -mapop set +desonly -pass apache_password -out name.keytab
5. 接下来配置Apahe的http.conf, 使所有或全部的WEB应用通过Kerberos进行登陆验证. Location项即作用路径, 这里我用通配符设置了webroot/krb和webroot/test两个路径. Krb5Keytab项后添上一步生成的keytab文件的及存放路径. 具体如下
<Location ~ "/(krb|test)"> AuthName "Kerberos Login" AuthType Kerberos Krb5Keytab /etc/auth_kerb.keytab KrbAuthRealm EXAMPLE.COM KrbMethodNegotiate off KrbSaveCredentials off KrbVerifyKDC off Require valid-user </Location>
6. 重启Apahce
# /etc/init.d/apache2 restart
7. 到这里配置过程就全部完成了, 下面我们可以测试一下. 在webroot/krb下建index.php, 写入如下内容.
<?php echo "<table border=\"1\">"; foreach($_SERVER as $k=>$v){ echo "<tr><td>".$k."</td><td>".$v."</td></tr>"; } echo "</table>" ?>
浏览器上访问http://hostaddress/krb. 这时浏览器会弹出如下的登陆框, 用AD账号登陆试一下吧, 登陆成功的话页面上会显示$_SERVER信息, 并$_SERVER中会多出个[‘REMOTE_USER’]来.
整个配置过程算是比较顺利, 参考文档如下, 欢迎有兴趣的朋友与我交流 [email protected]
http://sivel.net/2007/05/sso-apache-ad-1/
http://support.microsoft.com/kb/555092/en
http://stackoverflow.com/questions/389175/kerberos-authentification-in-php
http://modauthkerb.sourceforge.net/install.html
https://help.ubuntu.com/community/SingleSignOn
http://www.midgard-project.org/documentation/kerberos-single-sign-on-with-active-directory/
http://michele.pupazzo.org/diary/?p=460