openLDAP是LDAP(轻量目录访问协议)在linux系统上的实现,和windows下的AD域是一回事,主要是用来构建集中的身份验证系统,提供高效的查找和管理信息服务,可以减少管理成本并保持数据一致性。

服务器环境:centos 6.6 64位

一、配置OpenLDAP Server

1.安装

服务器端所需的软件:

  1. openldap 包含配置文件、库、文档等
  2. openldap-server slapd服务器
  3. openldap-client 客户端程序
  4. openldap-devel 开发套件,供第三方程序调用

yum自带的源里就有了,直接yum安装:

yum install -y openldap openldap-servers openldap-clients openldap-devel

2.配置slapd

有两个文件要复制:slapd的配置文件和数据库文件,将openldap-servers自带的example复制到相应目录:


cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown -R ldap.ldap /etc/openldap
chown -R ldap.ldap /var/lib/ldap

使用slappasswd创建LDAP管理员密码,这个命令不会直接将密码写入配置,运行slappasswd后输入两次密码,会返回一串密文,复制下这个密文。

编辑/etc/openldap/slapd.conf,找到”database bdb“,按照自己的需求更改下面的:

suffix "dc=52os,dc=net"
rootdn "cn=admin,dc=52os,dc=net"  //管理员为admin
rootpw {SSHA}QeLa25YmQt3csWI2eWcrXbtylxpq5FQ0 //复制的管理员的密码,也支持明文

测试并生成配置文件:

rm -rf /etc/openldap/slapd.d/*   //删除原文件
service slapd start              //生成bdb文件
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d  //生成配置文件
chown -R ldap:ldap /etc/openldap/slapd.d

配置完成重启服务:

service slapd restart
chkconfig slapd on       //设置开机自启动

经过上面的配置后,openldap server就配置好了。
查看LDAP数据库结构:

ldapsearch -x -H ldap://127.0.0.1 -b 'dc=52os,dc=net'

会返回类似:

# extended LDIF
# LDAPv3
# base <dc=52os,dc=net> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
# search result
search: 2
result: 32 No such object
# numResponses: 1

3.配置并迁移系统用户

配置好的LDAP数据库是空的,需要将系统上的用户导入到LDAP数据库中。需要用migrationtools将系统用户转换为LDAP能识别的ldif文件。

先新建一个test用户作为测试用户:

useradd test
echo "pwdpwd" |passwd --stdin test

安装migrationtools:


yum install migrationtools

配置migrationtools:

编辑/usr/share/migrationtools/migrate_common.ph ,按需更改下面两行:

$DEFAULT_MAIL_DOMAIN = "52os.net";
$DEFAULT_BASE = "dc=52os,dc=net";

生成ldif文件:

  ./migrate_passwd.pl  >/tmp/passwd.ldif
  ./migrate_passwd.pl /etc/passwd  >/tmp/passwd.ldif
  ./migrate_group.pl /etc/group >/tmp/group.ldif
  

如果有需要,也可以编辑passwd.ldif和group.ldif去掉不需要的条目。
将生成的ldif导入到LDAP数据库:

ldapadd -x -D "cn=admin,dc=52os,dc=net" -W -f /tmp/base.ldif 
ldapadd -x -D "cn=admin,dc=52os,dc=net" -W -f /tmp/passwd.ldif 
ldapadd -x -D "cn=admin,dc=52os,dc=net" -W -f /tmp/group.ldif 

需要输入LDAP管理员密码,在用上面的ldapsearch命令就能查看到导入的数据。

二、客户端配置

客户端配置有两种方法:

  1. 使用authconfig-tui ,也就是setup命令中的 "Authentication configuration"
  2. 手动配置

无论哪种方式,都要先安装客户端:

yum -y install openldap openldap-clients nss-pam-ldapd pam_ldap

第一种方法:
在命令行中输入authconfig-tui或者setup命令中选择"Authentication configuration",选中 ”Use LDAP“和“Use LDAP Authentication”,之后点击NEXT,输入服务器地址和“BASE DN”即可。全部图形化添加,非常简单,推荐使用。

第二种方法需要修改文件较多:
编辑/etc/openldap/ldap.conf,加入:

URI ldap://10.11.15.78/   //LDAP服务器地址
BASE dc=52os,dc=net
TLS_CACERTDIR /etc/openldap/cacerts

编辑/etc/nslcd.conf,加入:


uri ldap://10.11.15.78/
base dc=52os,dc=net
ssl no
tls_cacertdir /etc/openldap/cacerts

系统命名服务(NSS)配置使用LDAP,编辑 /etc/nsswitch.conf,修改如下几项为:

passwd:     files ldap
shadow:     files ldap
group:      files ldap
netgroup:   files ldap
automount:  files ldap

编辑/etc/pam.d/system-auth,修改如下几项为:

auth        sufficient    pam_ldap.so use_first_pass
account     required      pam_unix.so broken_shadow
account     [default=bad success=ok user_unknown=ignore] pam_ldap.so
password    sufficient    pam_ldap.so use_authtok
session     required      pam_unix.so
session     optional      pam_ldap.so  #这一行要加在pam_unix.so下面
session     optional      pam_mkhomedir.so skel=/etc/skel/ umask=0022 #自动创建用户的宿主目录

编辑/etc/sysconfig/authconfig:

USELDAPAUTH=yes
USELDAP=yes

修改好之后启动nslcd服务,并设置开机启动

service nslcd start  && chkconfig nslcd on

验证:
test用户只有在ldap server上有,在客户端如果也能查看到,就说明设置成功:


id test 

或者使用:

getent passwd |grep test

这时就能用test账号登录客户端了。

三、其它设置:

1.日志配置

openLDAP默认是不打日志的,要配合rsyslog才能打日志。
在/etc/openldap/slapd.conf 中设置日志级别,加入:

loglevel 1

具体的loglevel解释,可以:

man slapd.conf

在/etc/rsyslog.conf最后加入:

local4.*  /var/log/slapd.log

重启rsyslog和slapd:


service rsyslog restart
service slapd restart

2.sudo管理

在openldap的服务器端拷贝sudo schema到openldap配置目录

cp /usr/share/doc/sudo-1.8.6p3/schema.OpenLDAP /etc/openldap/schema/sudo.schema

加载sudo schema,在/etc/openldap/slapd.conf  添加:

include         /etc/openldap/schema/sudo.schema

重新生产配置文件:

rm -rf /etc/openldap/slapd.d/*
sudo -u ldap slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
service slapd restart

新建一个sudo.ldif文件,内容为:

dn: ou=Sudoers,dc=52os,dc=net
objectClass: top
objectClass: organizationalUnit
ou: Sudoers

dn: cn=defaults,ou=Sudoers,dc=52os,dc=net
objectClass: top
objectClass: sudoRole
cn: defaults
sudoOption: !visiblepw
sudoOption: always_set_home
sudoOption: env_reset
sudoOption: requiretty

dn: cn=test,ou=Sudoers,dc=52os,dc=net
objectClass: top
objectClass: sudoRole
cn: test
sudoCommand: ALL
sudoHost: ALL
sudoOption: !authenticate
sudoRunAsUser: ALL
sudoUser: test 

上面的内容按实际情况更改,注意每行最后不要有空格,ldif里的大小写不敏感。我允许sudo的用户是test,允许使用全部命令,允许所有主机sudo
导入sudo.ldif记录:

ldapadd -x -D "cn=admin,dc=52os,dc=net" -W -f sudo.ldif

设置客户端:
在/etc/sudo-ldap.conf中加入:

uri ldap://10.11.15.78
sudoers_base ou=Sudoers,dc=52os,dc=net

在/etc/nsswitch.conf中加入:

Sudoers: files ldap

在客户端用切换到test用户,测试一下sudo是否可用

3.用户目录自动挂载

使用Openldap的好处就是在服务器端建好一个用户后,各个客户端去服务器端验证,不需要在创建该用户。验证通过后会在客户端/home目录下创建该用户的宿主目录,虽然是同一用户,但目前的配置来说,每个客户端和服务器之间宿主目录是独立的,并没有共享服务器端的宿主目录。举例来说,我在服务器端的宿主目录中上传了一份代码,如果客户端共享服务器的宿主目录,当用户在任意一个客户端登录时,都会看到服务器上宿主目录的代码,管理起来就十分方便了。

配置用户目录共享,需要在服务器端安装nfs,在客户端安装autofs。
安装并启动nfs:


yum install nfs-utils
service rpcbind start
service nfslock start
service nfs start

启动好后用chkconfig加入开机启动。
编辑/etc/exports文件,加入:


/home  *(rw,sync)  

要注意用户需在nfs服务器/home下有宿主目录,否则autofs无法挂载。"*"可以写成具体的ip或ip段,设置好后重启nfs服务,测试并查看:

showmount -e localhost

服务器端的nfs配置完成。
客户端要安装autofs和nfs-utils,但nfs服务不用启动:

yum install nfs-utils autofs

配置autofs,在/etc/auto.master最后加入:

/home    /etc/auto.nfs

新建一个/etc/auto.nfs文件,内容为:

*   -fstype=nfs                      10.11.15.78:/home/&

启动autofs:

service autofs start

su - test测试是否正常切换,在用mount命令查看挂载:

10.11.15.78:/home/test on /home/test type nfs (rw,vers=4,addr=10.11.15.78,clientaddr=10.11.15.79)

说明挂载成功了,客户端的用户目录和服务器端的用户目录内容就能正常同步了

其它的一些设置,用到在写。
1.安全设置主要有两点:1.启用TLS加密 2.关闭匿名查询
2.主备高可用配置
3.web管理工具:phpldapadmin和LDAP Account Manager

四、一些问题

1.用户不能建立宿主目录
提示 “could not chdir to home directory /home/user: No such file or directory”
解决方法:
在 /etc/pam.d/password-auth 和/etc/pam.d/system-auth 都要加入:

session     optional      pam_mkhomedir.so skel=/etc/skel/ umask=0022

2.导入ldif文件时报错
ldap_bind: Invalid credentials (49)
这种情况是管理员密码错误或者rootdn信息错误

3.配置autofs后,切换su - test 报错

Creating directory '/home/test'.
Unable to create and initialize directory '/home/test'.
su: warning: cannot change directory to /home/test: No such file or directory

这是由于nfs服务器上/home下没有test用户的宿主目录造成的,且权限要正确,否则autofs无法挂载目录,用户也无法在客户端登录。

参考文章:
http://www.zhukun.net/archives/7548
http://54im.com/openldap/centos-6-yum-install-openldap-phpldapadmin-tls-%E5%8F%8C%E4%B8%BB%E9%85%8D%E7%BD%AE.html
http://www.ibm.com/developerworks/cn/linux/l-openldap/