前言
CAS客户端中提供了PAM模块,PAM模块是可插拔的认证模块,使用PAM模块可以配置系统的认证模块。
CAS的PAM模块前期是由YALE公司维护的,可现在根据官网介绍说,PAM模块交由一家法国的机构(ESUP)在做维护,暂且不管谁在维护,只要能用就行。
需要提醒的是,ESUP官网是法文滴,借助翻译工具,大体意思还是可以整明白滴。
我的环境是这样的,一台机器安装了Redhat系统用来配置PAM模块,CAS服务器在我本机。
具体的演示流程为:
我为LINUX主机配置PAM模块后,当我要连接LINUX主机时,我提供两个参数,一个是用户名,一个是ST or PT,PAM收到参数后会根据配置文件的设置去请求CAS服务器,用来验证此票据是否合法,如果合法则成功连接LINUX主机,否则失败。
现在将具体的配置方法分为以下几个步骤讲解
1:下载PAM源码
2:解压缩
3:编绎源码
4:配置pam_cas.conf
5:测试
6:配置系统的PAM模块
在整个配置过程中,我参考的是官网提供的资料
ESUP官方的介绍文档地址为:
http://www.esup-portail.org/display/PROJPAMCAS/Module+PAM+pour+CAS(法文)
http://www.esup-portail.org/pages/viewpage.action?pageId=3932339(法文)
ja-sig官方的介绍文档:
http://www.ja-sig.org/wiki/display/CASC/PAM+Module(英文)
一:下载PAM源码
PAM的下载地址为:http://sourcesup.cru.fr/frs/?group_id=213
其目前最新版本是:Pam_cas-2.0.11-esup-2.0.5
看来已经很久没更新了。
将下载的压缩文件放在Redhat系统的一个目录下,比如我的目录为:/usr/local/pam/
二:解压缩
进入到/usr/local/pam目录下,解压文件
#tar zxvf Pam_cas-2.0.11-esup-2.0.5.tar.gz
解压之后因名字有点长,改名为"pam_cas"
#mv Pam_cas-2.0.11-esup-2.0.5 pam_cas
三:编译源码
进入"pam_cas"目录
[root@localhost pam]# cd pam_cas 查看文件夹 cert //证书库文件 CHANGELOG //版本升级日志 INSTALL //安装手册 LICENCE //许可协议 pam_cas.conf //核心配置文件 README sources //源码包
就那么几个文件夹,提供的那个安装手册可以忽略不计,官网都有的,主要的只有pam_cas.conf和source文件夹
我们进入source文件夹,其中提供三个Makefile文件,其后缀一个是redhat,一个是hpux,一个是solaris,很明显的意思是指对不同的系统应使用不同的安装文件。在这个地方我可浪费了不少时间,为了验证是否可以在其它Linux主机上使用,我分别用了Ubuntu\Debian,对于使用Makefile.redhat文件,除了redhat外,其它系统要想编绎成功简直是难啊,也可能真的只支持官方提供的这三个系统。
我的实验系统是redhat,所以我选用Makefile.redhat文件来安装,执行make命令指定会出错的,提示说找不到makefile文件,按照资料提示,需要将Makefile.redhat文件的后缀去掉:
[root@localhost sources]# mv Makefile.redhat Makefile
编绎源文件:
[root@localhost sources]# make gcc -O2 -I /usr/include/openssl -I /usr/kerberos/include -c -o pam_cas.o pam_cas.c gcc -O2 -I /usr/include/openssl -I /usr/kerberos/include -c -o cas_validator.o cas_validator.c gcc -O2 -I /usr/include/openssl -I /usr/kerberos/include -c -o xml.o xml.c gcc -O2 -I /usr/include/openssl -I /usr/kerberos/include -c -o read_config.o read_config.c gcc -o pam_cas.so pam_cas.o cas_validator.o xml.o read_config.o -lssl -lcrypto -lpam -shared
这时便编绎出了pam_cas.so文件
官网资料说提供了一个测试工具"castest",如果要使用此工具,使用命令"make test"来对源码进行编绎,来试试:
[root@localhost sources]# make test gcc -O2 -I /usr/include/openssl -I /usr/kerberos/include -c -o castest.o castest.c gcc -o castest castest.o pam_cas.o cas_validator.o xml.o read_config.o -I /usr/include/openssl -I /usr/kerberos/include -lssl -lcrypto -lpam [root@localhost sources]# ls cas.h castest.o Makefile pam_cas.c read_config.c xml.h castest cas_validator.c Makefile.hpux pam_cas.o read_config.o xml.o castest.c cas_validator.o Makefile.solaris pam_cas.so xml.c
有源码真是好,想了解PAM的实现机制的就请看看源码吧,经过我简单的看了一下源码,其实"castest"工具和PAM模块都是实现了共同的接口"cas_validator.c"。
现在源码算是编绎完成了,接下来就该配置了。
四:配置pam_cas.conf
将"pam_cas.conf"文件拷贝至"/etc/"目录下,然后打开编辑:
[root@localhost pam_cas]# cp pam_cas.conf /etc/ [root@localhost pam_cas]# vim /etc/pam_cas.conf
该文件有以下几个参数:
host //CAS服务器的IP地址
uriValidate //票据的验证地址
ssl //是否使用SSL
debug //是否使用DEBUG模式
proxy //代理地址
trusted_ca //证书库地址
在我这次配置中先不使用SSL,之后再介绍SSL的配置
我的配置为:
host 10.10.10.31 port 8080 uriValidate /cas/serviceValidate ssl off debug off
如果SSL设置为off,那么就不会读到trusted_ca属性,所以也就不用配置了。
这样配置好之后,基本就算完事了,接下来就要使用测试工具"castest"来进行测试
五:测试
在前面已经提到过PAM模块的运行流程,那么castest这个工具类虽然是C编写的,但和JAVA一样,有个main方法就可以单独执行的,它们都是实现了共同的接口来与CAS服务器进行通信,castest的格式为:
$PAM_CAS_SOURCES/castest <service> <ticket> <fichier_de_configuration>
service:这个参数是申请票据时所提供的回调地睛
ticket:这个参数为申请到的票据
fichier_de_configuration:这个参数是配置文件的位置,因为接口默认读取配置文件为/etc/pam_cas.conf,之前我们已经拷贝过去了,所以这里不需要再次指定该参数。
从这个格式来看,castest需要两个参数,如果这两个参数也没有指定的话,源码中已经提供了默认的参数值。
了解了CAS服务器运行原理的朋友应该都知道,验证一个票据是否合法,那么service是一个重要的因素,如果验证票据时所提供的service与申请票据时所提供的service不一样,那么该票据就属于非法的了,当然,如果合法的话,只要票据已经验证通过了,那么再次验证的话,也是属于非法的,因为票据是一次性的嘛。
看来要想执行castest命令,还得先申请一个票据才行,并且这个票据还是未经过验证的。
从CAS服务器的运行原理看,要申请一个票据还是很简单的,只要提供一个service地址,那么CAS服务器在完成用户账号的认证后会将票据返回到service指向的地址中。
那么我的方法是极其简单的,我创建了一个WEB工程,该工程有index.jsp页面,我的代码是这样写的:
<% if(request.getParameter("ticket") == null){ %> <a href="http://10.10.10.31:8080/cas/login?service=http://10.10.10.31:8080/ApplyST">申请ST</a> <% }else{ out.println(“ST为 :”+request.getParameter("ticket").trim()); } %>
测试用嘛,能简单的就尽量简单,其实之前我也写了一个比较复杂的CAS客户端,并且还是用swing写的,主要作用是用来支持C/S模式的应用程序,因为CAS使用http/https协议的,如果要将C/S模式的应用程序也实现SSO的话,就得有个通用的中间件来提供相关的接口了,有点跑题,Sorry。
我这个源码很简单吧,我的工程名字叫“ApplyST”
我先访问我这个工程的index.jsp页面,然后点击"申请ST"链接,这时跳转到CAS服务器的登录界面,输入账号口 令后,浏览器重定向到我这个工程的index.jsp页面,然后显示出申请到的ST。
我们运行一下,看得到的票据是什么(别忘了启动CAS服务器)
ST-2-uJZvbgCzl7RES0L1TMlQ-cas
这个就是我获得的ST票据
OK,得到票据的问题解决了,那么下面我们来执行castest来看看效果:
注意,我申请票据时提供的service地址为http://10.10.10.31:8080/ApplyST,所以这里也要使用这个地址
执行casteset命令
[root@localhost sources]# ./castest http://10.10.10.31:8080/ApplyST ST-2-uJZvbgCzl7RES0L1TMlQ-cas configFile = /etc/pam_cas.conf --------------------------------------------------------------- Parameters from test : host = 10.10.10.31 port = 8080 uri = /cas/serviceValidate ssl = off trusted_ca = /usr/local/pam/cer/ca-root.pem debug = localtest proxy = https://imp.its.yale.edu/cas/casProxy.php proxy = https://uportal1.its.yale.edu/CasProxyServlet proxy = https://uportal2.its.yale.edu/CasProxyServlet service = http://10.10.10.31:8080/ApplyST ticket = ST-2-uJZvbgCzl7RES0L1TMlQ-cas --------------------------------------------------------------- ---- request : GET /cas/serviceValidate?ticket=ST-2-uJZvbgCzl7RES0L1TMlQ-cas&service=http://10.10.10.31:8080/ApplyST HTTP/1.1 Connection: close Host: 10.10.10.31 ---- response : HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Type: text/html Content-Language: zh-CN Content-Length: 173 Date: Wed, 12 May 2010 03:05:02 GMT Connection: close <cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'> <cas:authenticationSuccess> <cas:user>jcbay</cas:user> </cas:authenticationSuccess> </cas:serviceResponse> --------------------------------------------------------------- valid ticket for 'jcbay'
所打印出来的信息还是很详细的,首先是扫行命令后,开始读取配置文件,将接收到的service和ticket参数值进行填入,
然后输出的就是请求头和响应头,最后结果是输出认证的账号名。
OK,到这里,使用castest来测试已经成功通过了,下面将进行的是配置系统的PAM模块
六:配置系统的PAM模块
首先我们先将编绎好的pam_cas.so文件放到/lib/security目录下
[root@localhost sources]# cp pam_cas.so /lib/security
然后进入到/etc/pam.d,look一下,很多文件啊,都是对应于不同的动作,比如我们常用的ssh操作所对应的文件就是sshd。这次我们就拿ssh来开刀,其实对于其它动作的配置都是一样的,大家也可以配置其它文件,比如login。
编辑sshd文件:
auth sufficient /lib/security/pam_cas.so -shttp://10.10.10.31:8080/ApplyST -f/etc/pam_cas.conf
加入上面的命令,
auth:验证类型,表示对使用者身份进行验证,提示输入账号和密码
sufficient:验证规则,表示如果该项验证成功后,则不再执行其后所有的验证
接下来的3个参数:
1:.so文件的位置
2:service参数
3:配置文件路径
配置好之后,我们就可以进行测试了
测试方法是:
先申请ST
注意:申请ST时所填写的账号一定要在redhat系统中存在的,这是由于PAM代码中已经做了验证了
打开SSH终端,连接redhat主机,账号为系统账号,密码则填写ST,看是否能登录成功吧。