centos 6.5 配置LDAP服务器+客户端!

各种度娘!各种歌哥!网上教程参差不齐,历时1天,终于完成,不敢独享,遂,总结分享之,有问题可以留言,知无不言。。。开始吧

Note:

本次配置的服务器环境是<redhat enterprise linux 6.5>, Centos/Suse类似, Debian/Ubuntu安装包可能略有不同,但是大致过程应该相似。

PS:LDAP 是C/S结构的,所以接下来我们要设计好哪台机器上搭建LDAP Server,剩下的机器上安装LDAP Client.

LDAP Server Machine:192.168.1.10 (此IP为机器的实际IP,自己配置时根据实际情况而定)

LDAP Client   Machine:192.168.1.11 (此IP为机器的实际IP,自己配置时根据实际情况而定)

LDAP Client Machine N...... (其余N多的client机器不一一列举,完成一个client配置后,其他机器Clone整个过程即可 :-))

××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

1.LDAP Server Setup:
a.安装LDAP服务(使用YUM本地光盘安装)

rpm -qa | grep openldap

查看是否包含这四个包:

openldap-devel-2.4.23-26.el6.x86_64
openldap-clients-2.4.23-26.el6.x86_64
openldap-2.4.23-26.el6.x86_64
openldap-servers-2.4.23-26.el6.x86_64

若不包含,那就需要安装了。保证你机器能连外网,然后运行如下命令:

# yum install openldap-* -y
会提示安装以下几个必须的包,另外鉴于依赖,可能还会安装一些其他的包,所以我们选择-y:

openldap-devel-2.4.23-26.el6.x86_64
openldap-clients-2.4.23-26.el6.x86_64
openldap-2.4.23-26.el6.x86_64
openldap-servers-2.4.23-26.el6.x86_64
....

OpenLDAP 使用Berkely-DB来作为数据库存储信息,我们可以去官网下载解压到本地安装。But,用Yum的话,应该会帮我们做好这一切事情。 我们只要在安装完后检查一下是否安装了db4*相关的rpm包就可以了。If true,那恭喜,我们可以进行下一步了。If not,请用yum命令安装。

查看rpm安装包的命令:rpm -qa | grep db4

b.拷贝LDAP配置文件到LDAP目录(redhat6.3):
# cd /etc/openldap/
# cp /usr/share/openldap-servers/slapd.conf.obsolete slapd.conf

Note: redhat6.0或6.1版本配置文件在主目录有备份:

# cd /etc/openldap/
# cp slapd.conf.bak slapd.conf

c.创建LDAP管理员密码:
# slappasswd
这里我输入的密码是redhat,输入完密码后,返回一串密文,先保存到剪贴板,之后要复制到LDAP配置文件中使用:
{SSHA}pfAJm+JJa4ec2y8GjTc8uMEJpoR5YKLy

d.编译配置文件
# vi /etc/openldap/slapd.conf
....

# enable server status monitoring (cn=monitor)
database monitor
access to *
        by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
        by dn.exact="cn=admin,dc=test,dc=com" read
        by * none

#######################################################################
# database definitions
#######################################################################

database        bdb
suffix          "dc=test,dc=com"
checkpoint      1024 15
rootdn          "cn=admin,dc=test,dc=com"
# Cleartext passwords, especially for the rootdn, should
# be avoided.  See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
# rootpw                secret
# rootpw                {crypt}ijFYNcSNctBYg
rootpw {SSHA}pfAJm+JJa4ec2y8GjTc8uMEJpoR5YKMn

.......

保存退出。

e.拷贝DB_CONFIG文件到指定目录
# cp /usr/share/openldap-servers/DB_CONFIG.example  /var/lib/ldap/DB_CONFIG
删除默认/etc/openldap/slapd.d下面的所有内容,否则后面在使用ldapadd的时候会报错:
# rm -rf /etc/openldap/slapd.d/*
f.启动LDAP的slapd服务,并设置自启动:
# service slapd restart
# chkconfig slapd on
赋予配置目录相应权限:
# chown -R ldap:ldap /var/lib/ldap
# chown -R ldap:ldap /etc/openldap/

g.测试并生成配置文件:
slaptest  -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
返回config file testing succeeded,则配置成功。
赋予生成的配置文件予权限并重启:
# chown -R ldap:ldap /etc/openldap/slapd.d
# service slapd restart
h.创建一个账号,以备客户端测试登陆
# useradd ldapuser1
# passwd ldapuser1
至此,这些用户仅仅是系统上存在的用户(存储在/etc/passwd和/etc/shadow上),并没有在LDAP数据库里,所以要把这些用户导入到LDAP里面去。但LDAP只能识别特定格式的文件 即后缀为ldif的文件(也是文本文件),所以不能直接使用/etc/passwd和/etc/shadow。 需要migrationtools这个工具把这两个文件转变成LDAP能识别的文件。
i.安装配置migrationtools
# yum install migrationtools -y

j.进入migrationtool配置目录
# cd /usr/share/migrationtools/
首先编辑migrate_common.ph

# vi  migrate_common.ph

...

# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "test.com";

# Default base
$DEFAULT_BASE = "dc=test,dc=com";

.......

保存退出。:-)

K.下面利用pl脚本将/etc/passwd 和/etc/shadow生成LDAP能读懂的文件格式,保存在/tmp/下
# ./migrate_base.pl > /tmp/base.ldif
# ./migrate_passwd.pl  /etc/passwd > /tmp/passwd.ldif
# ./migrate_group.pl  /etc/group > /tmp/group.ldif
L.下面就要把这三个文件导入到LDAP,这样LDAP的数据库里就有了我们想要的用户
# ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f /tmp/base.ldif
# ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f /tmp/passwd.ldif
# ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f /tmp/group.ldif
过程若无报错,则LDAP服务端配置完毕

M.重启slapd完成配置
# service slapd restart

N.现安装NFS,并把ldapuser1的家目录做NFS共享.
默认REDHAT已安装
# yum install nfs* -y
配置NFS共享:
# vi /etc/exports
--------------
/home/ldapuser1         *(rw,no_root_squash)
--------------
重启nfs服务:
# service rpcbind restart
# service nfs restart
PS.本地需要做ldap控制的账号都要导入到LDAP DB中,否则客户端配置无法正常识别登录。

2.LDAP Client Setup:

a.安装LDAP client认证需要的pam包:
yum install nss-pam-ldapd pam_ldap -y

安装完成后,配置ldap 客户端配置文件:
vim /etc/openldap/ldap.conf

添加

BASE:dc=test,dc=com

URL:192.168.1.10    --->此处为LDAP Server IP

b.配置客户端,是机器使用LDAP进行账户验证:
LANG=C authconfig-tui

vim /etc/pam.d/system-auth   注释掉创建家目录,重启sssd服务。

c. vim /etc/sssd/sssd.conf 
 添加enumerate=true,(因该不是必须的,但是加上为妙)

d. service sssd restart        并重启服务。        
e.进行客户端测试,看能否读到LDAP user 相关信息
 getent passwd |grep ldapuser1

f.编辑系统认证文件,保证使用LDAP来认证:
 vim /etc/pam.d/system-auth           update: pam_sss.so  --> pam_ldap.so  可以实现用户su之间切换 
 ******Please Makre sure all this updated*****************************************************************
 其中/etc/pam.d/
 
 vim /etc/pam.d/system-auth
 vim /etc/pam.d/password-auth

auth        required      pam_env.so
auth        sufficient    pam_fprintd.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        sufficient    pam_ldap.so
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     [default=bad success=ok user_unknown=ignore] pam_ldap.so
account     required      pam_permit.so

password    requisite     pam_cracklib.so try_first_pass retry=3 type=
password    sufficient    pam_unix.so md5 shadow nullok try_first_pass use_authtok
password    sufficient    pam_ldap.so use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     [success=ok default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     required      pam_mkhomedir.so skel=/etc/skel/ umask=0022
session     optional      pam_ldap.so

配置文件是RHEL6实现用户名验证机制配置文件,大多数服务的配置将都会调用它们。
 vim /etc/pam.d/system-auth           update: pam_sss  --> pam_ldap  可以实现用户su之间切换
 *********************************************************************************************************

service nslcd restart

服务重启之后因该就可以使用LDAP 服务了。

可以 su ldapsuer1或者ssh ldapuser1@xxxxx来使用。

客户端配置完成!

3. LDAP数据库相关增删查改操作:
操作LDAP的方式有很多,下面以bash下用openldap-clients 套件提供的工具来进行。

1、初始化数据
这一步通常是由特定的应用程序根据其自身使用的需要创建的。包括两部分的内容:
a、创建.schema文件,该文件定义了后面ldap 中存放对象的类型和属性,这已经在上面sldapd.conf文件中定义;
b、初始化数据结构,其结构必须由上面的.schema文件已经定义的,并由应用程序读取和使用。

初始化文件通常为.ldif 结尾,称为LDIF数据交换格式。这种格式是行界定、冒号分隔的属性-值对。例如:

引用
dn: dc=ldapuser1,ou=People,dc=test,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
....

导入时,执行:
# ldapadd -x -h 192.168.1.10 -D 'cn=admin,dc=test,dc=com' -W -f info.ldif

ldapadd 命令各参数含义如下:
-x 为使用简单密码验证方式
-D 指定管理员DN(与slapd.conf中一致)
-W 为管理员密码,可以使用-w password 直接输入密码
-f 为初始化数据LDIF的文件名
-h 为操作的服务器IP地址

2、搜索操作
LDAP是读优化数据库,因此,读的速度很快,也很常用。但与关系数据库不同,其以树结构形式读取数据,若不添加过滤,会显示匹配节点下所有节点的内容。若以ldif 的形式表达,刚开始可能不太习惯。
# ldapsearch -x -b 'dc=test,dc=com'

首先要留意的是,ldapsearch 不需要提供验证信息。因为正如前面提到的,LDAP 默认供任何人可读。
-b 后面定义搜索节点位置,即从该节点往其子节点进行搜索

3、身份验证
修改或添加内容需进行用户验证,可通过下面的命令确认验证信息:
# ldapwhoami -x -D 'cn=ldapuser1,dc=test,dc=com' -w 'yourpasswd'
dn:cn=admin,dc=test,dc=com
Result: Success (0)

4、修改操作
修改内容通常由LDIF 文件提供。因此,可先用ldapsearch 导出节点内容:

# ldapsearch -x -LLL -b 'dc=test,dc=com'
-LLL 表示不输出注释内容,以便后续重新导入。

其实也可以使用文件进行批量修改,我们只要把需要修改信息写入文件即可,比如:
dn: uid=ldapuser1,ou=People,dc=test,dc=com
changetype: modify
replace: uidNumber
uidNumber: 1000

把以上内容写入test.ldif中,运行如下命令:

ldapmodify -x -D "cn=admin,dc=test,dc=com" -w yourpasswd -f test.ldif

a、ldapadd 与ldapmodify -a 作用相同
b、如果在添加或修改时,报Naming violation等错误,则说明添加或修改的内容不符合schema中定义的对象属性规范,需修改后才能重新操作。

5、删除操作
删除时,给出DN即可:
# ldapdelete -x -D 'cn=admin,dc=test,dc=com' -w yourpasswd -r 'dc=test,dc=com'
-r 表示以递归模式删除,即删除该节点下面的所有子节点。

OK,到这里基本上完整的LDAP配置和使用方法已经比较完整了,大家可以按照步骤*的去尝试,遇到新问题也可以去google上找答案(Google is a great teacher! :-)).

Good Luck!

 
上一篇:iOS中dyld缓存的实现原理是怎样的?


下一篇:读FCL源码系列之List---让你知其所以然---内含疑问求大神指点