OpenLDAP--单点登录SSO

说明

由于重新安装了OpenLDAP,本篇博客也重新更新,不过相比于上一篇内容上变化不大,就当精简格式了。
上篇博文中,我们已经安装了一个Kerberized OpenLDAP,本篇主要说明如何使用OpenLDAP进行登陆认证并进行用户目录及票据转发的简单配置。
安装环境及规划:
tao0[1-4].opjasee.com,系统为Centos6.3。
tao01.opjasee.com: Kerberos服务器
tao02.opjasee.com: OpenLDAP服务器,本次开启NFS服务。
tao03.opjasee.com: 本次为登陆服务端
tao04.opjasee.com: 本次为登陆客户端


1. kerberos上添加test用户认证信息

上一部分我们已经建立了一个dn: uid=test,ou=people,dc=opjasee,dc=com的ldap条目,我们需要在kerberos添加认证信息

$ kinit admin/admin
$ kadmin 
kadmin:  addprinc test@OPJASEE.COM

可以使用kinit testldapwhoami测试一下。后续我们使用这个用户进行登录测试。

2. 服务端认证方式变更(tao03)

因为认证相关的很多配置文件里赤裸裸的写着User changes will be destroyed the next time authconfig is run.,我们也就不手工修改了,使用系统提供的接口命令authconfig(authconfig-tui不大适用未来使用)进行配置吧。

$ yum install pam_ldap nss-pam-ldapd
$ authconfig --savebackup=originConf
$ authconfig --enableldap --enableldapauth --enablekrb5 --enableldaptls --ldapserver="tao02.opjasee.com" --ldapbasedn="dc=opjasee,dc=com" --update
Starting nslcd:                                            [  OK  ]

这个命令会重写/etc/openldap/ldap.conf这个配置文件,经过查看该配置以及/etc/nslcd.conf/etc/pam_ldap.conf,可以发现,虽然在Centos6上安装OpenLDAP客户端时生成的证书目录是/etc/openldap/certs,但是周边程序都使用/etc/openldap/cacerts,并且刚刚这些命令还生成了这个空目录。为了减少其他程序的配置变更,使用certs目录替换cacerts。注意,目前的certs目录已经导入了CA证书。

$ rmdir /etc/openldap/cacerts
$ mv /etc/openldap/certs /etc/openldap/cacerts
$ service nslcd restart # 重启nslcd读取证书 

此时执行id test应该能够看到输出为uid=1002(test) gid=1002 groups=1002
切换到tao04上测试登陆,应该可以登陆了。可以看出还有一些问题,我们接下来进行解决。

$ ssh test@tao03.opjasee.com 
test@tao03.opjasee.com's password: 
Last login: Tue Mar  4 12:39:44 2014 from tao04.opjasee.com
Could not chdir to home directory /home/test: No such file or directory
id: cannot find name for group ID 1002
-bash-4.1$ pwd
/

3. 使用NFS给用户提供家目录

tao02上配置NFS服务,正式使用需注意权限问题,exportfs -v命令可以查看现在目录配置。

$ yum install nfs4-acl-tools nfs-utils nfs-utils-lib
$ cat /etc/exports 
/home/nfsdir/user *(rw,no_root_squash,sync)
$ mkdir -p /home/nfsdir/user
$ service nfs start  
Starting NFS services:                                     [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
$ exportfs -v
/home/nfsdir/user
                <world>(rw,wdelay,no_root_squash,no_subtree_check)

tao03上挂载NFS,供远程登陆的用户使用。因为nfs-ver4使用了新的映射方法,而且autofs应该需要更多的配置,为了简单起见,使用下面的命令进行挂载,暂时不配置/etc/fstab

$ mkdir -p /home/nfsdir/user
$ mount -t nfs -o vers=3 tao02.opjasee.com:/home/nfsdir/user /home/nfsdir/user

可以创建目录或文件进行测试。

4. 修改test用户属性

修改之前创建test用户的test.ldifhomeDirectory配置

$ cat mtest.ldif 
dn: uid=test,ou=people,dc=opjasee,dc=com
changetype: modify
replace: homeDirectory
homeDirectory: /home/nfsdir/user/test
$ kint ldapadmin
$ ldapmodify -f mtest.ldif     

此时查看可以发现test用户的属性已经更新,下面在ldap中添加gidNumber=1002的组。

$ cat addgroup.ldif 
dn: ou=group,dc=opjasee,dc=com
objectClass: organizationalUnit
ou: group
description: Groups

dn: cn=testgroup,ou=group,dc=opjasee,dc=com
objectClass: posixGroup
cn: testgroup
gidNumber: 1002
description: for test
$ ldapadd -f addgroup.ldif 

5. 新用户登录自动创建家目录

tao03上执行

$ authconfig --enablemkhomedir --update

尝试从tao04登录,上述的几个问题都消失了,但是还是需要输入密码,接下来进行解决。

6. 配置SSH实现票据登录

Kerberos这个名字起源于希腊神话中地狱看门三头犬,实现kerberos验证也就需要三方参与,目前我们已经有了KDC和test用户,缺少的就是SSH的服务端,刚刚登陆时也可以从tao03/var/log/secure日志中看到pam模块因为缺少/etc/krb5.keytab而无法直接使用kerberos进行认证,用户只能输入密码。通过下面的配置在tao03添加SSH所需的host principal

$ kinit admin/admin
$ kadmin
kadmin:  addprinc -randkey host/tao03.opjasee.com@OPJASEE.COM
kadmin:  ktadd host/tao03.opjasee.com@OPJASEE.COM

此时test用户就可以使用自己的TGT向KDC请求SSH登录的票据了,TGT有效期间不需要再次输入密码。

$ kinit test
$ klist 
$ ssh test@tao03.opjasee.com
[test@tao03 ~]$ klist 
klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_1002)

7. 配置票据转发,实现单点登录

从上面的登录结果可以看出,获取TGT之后,虽然从tao04上登录tao03不再需要输入密码,但是TGT不能继承,用户在tao03上依然无法直接继续使用kerberized服务。通过两项配置可以实现TGT forwarding进行单点登录。

  1. 生成forwardable TGT。我们已经在/etc/krb5.conf中配置了forwardable = true,所以不再需要使用kinit命令的-f选项,直接生成即可。可用klist -f查看flag
  2. 配置SSH进行转发。需要配置/etc/ssh/ssh_config,设定GSSAPIDelegateCredentials yes,在不存在~/.ssh/config文件的情况下,SSH客户端默认使用该配置文件。

此时登录tao03会生成了新的TGT,这样就完成了单点登录。新TGT由于不是使用kinit命令直接生成的,而是伴随着此次登录会话传递而来,因此本地缓存不是/tmp/krb5cc_1002(1002是uid),名称中包含了会话ID,该凭据将在会话结束时消失。

参考文档

关于 nscd,nslcd 和 sssd 套件的综述
RHEL6配置简单LDAP服务器基于TLS加密和NFS的用户家目录自动挂载
NFS服务器及autofs搭建
使用OpenLDAP集中管理用户帐号
Passing Kerberos TGT (ticket-granting ticket) to remote hosts with ssh
Kerberos验证过程

Loading Disqus comments...
Table of Contents