CAS3.4 关于PAM模块的详细配置

前言

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,看是否能登录成功吧。

你可能感兴趣的:(C++,linux,redhat,C#,gcc)