Press "Enter" to skip to content

CentOS 6安装配置LDAP

一,什么是LDAP

随着全国信息化建设的不断深入,各企事业单位都陆续开发出了针对本单位实际应用的多个管理信息系统。但各应用系统的开发大多沿袭传统的开发模式,即每个应用系统都有各自独立的用户认证模块,并使用独立的认证机制在各自的数据库中进行用户认证。这种用户认证模式有很多弊端:
1,传统的开发模式大多是基于关系数据库的用户认证信息管理模型,读取速度慢,可移植性差;
2,用户在每个应用系统中都必须存储用户名和密码等认证信息,这样会使用户认证信息在多个应用系统的数据库中重复放置,造成大量的数据冗余;
3,这种认证模式给用户认证信息的维护管理和用户的使用造成诸多不便。例如,用户需要更改自己的认证信息时,就必须逐个在所有的应用系统中进行更改,若有遗漏,就会造成数据的不一致;
4,每个应用系统都必须有各自独立的用户认证模块,这将造成重复开发;
5,由于没有单点登录功能,用户在使用不同的应用系统之时,必须重复登录。
基于以上几点,不难发现,传统开发模式的诸多弊端已经严重影响了WEB应用系统的性能和使用的方便性。

二,LDAP目录服务简介

目录服务是一种专门的数据库,可以用来保存描述性的、基于属性的信息,就像大多数人熟悉的各种各样的目录,像电话簿、黄页,电视指南、购物目录和图书馆卡片目录。听起来像是数据库一样,但“目录”与数据库并不相同,目录的大部分操作为读操作,可以针对大量的查找或者搜索操作进行快速的响应。它们可以具有大范围复制信息的功能,以便提高可用性和可靠性,同时缩短响应时间。

假如你的应用程序要写入大量的数据,你应该考虑选择使用数据库来实现。目录仅支持相对简单的事务处理。相反,数据库被设计成处理大量的各种各样的事务处理。假如你的应用要求这种重负荷的事务支持,你该选择数据库而不是目录。在另一方面,假如你的应用不要求这样的大负荷事务处理,而是偶尔的写一些简单的事务信息。这时,目录是理想的选择。它会更有效,更简单。

概括起来,如果有大量的“读”操作,则应选择目录,如果有大量的“写”操作,则应选择数据库。

LDAP是一个新的目录访问协议,它是在继承了X.500标准的所有优点的基础上发展起来的,并对其进行了改进。

LDAP目录中的信息按照树型结构组织,具体信息存储在条目(entry)的数据结构中。条目相当于关系数据库中表的记录,条目是具有区别名DN(Distinguished Name)的属性(Attribute),DN是用来引用条目的,DN相当于关系数据库表中的关键字(Primary Key)。
属性由类型(Type)和一个或多个值(Values)组成,相当于关系数据库中的字段(Field)由字段名和数据类型组成,只是为了方便检索的需要,LDAP中的Type可以有多个Value,而不是关系数据库中为降低数据的冗余性要求实现的各个域必须是不相关的。
LDAP中条目的组织一般按照地理位置和组织关系进行组织,非常的直观。

LDAP的信息是以树型结构存储的,在树根一般定义国家(c=CN)或域名(dc=com),在其下则往往定义一个或多个组织 (organization)或组织单元(ou,即organizational units)。一个组织单元可能包含诸如所有员工等信息。

此外,LDAP支持对条目能够和必须支持哪些属性进行控制,这是有一个特殊的称为对象类别(objectClass)的属性来实现的。该属性的值决定了该条目必须遵循的一些规则,其规定了该条目能够及至少应该包含哪些属性。例如:inetorgPerson对象类需要支持sn(sure name)和cn(common name)属性,但也可以包含可选的如邮件,电话号码等属性。

LDAP相关的简称如下:
dn – distinguished name(专有名称,区别名,主键)
o – organization(组织-公司)
ou – organization unit(组织单元-部门)
c – countryName(国家)
dc – domainComponent(域名组件)
sn – sure name(真实名称)
cn – common name(常用名称)

OpenLDAP就是LDAP的自由和开源的实现,目前已经被包含在众多流行的Linux发行版中,有着比较广泛的模块支持。

三,配置LDAP服务端

这里除了配置LDAP Server以外,我们还配置了NFS Server,以便当Client登陆时,能同时将服务端上User的家目录挂载至Client。以下的教程基于CentOS 6 64bit,配置前请先关闭Selinux,关闭防火墙。

$ yum install -y openldap openldap-servers openldap-clients

#拷贝LDAP配置文件
$ 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

$ vim /etc/sysconfig/ldap    #确保SLAPD_LDAP和SLAPD_LDAPI=yes

#创建LDAP管理员密码
$ slappasswd
#输入完密码后,返回一串密文,例如{SSHA}dnlg4OuBRR1Glr4EFJmRK/tyltn4ZySk,复制之

服务端守护进程:
slapd:主 LDAP 服务器
slurpd:负责与复制 LDAP 服务器保持同步的服务器

客户端程序:
ldapadd:打开一个到 LDAP 服务器的连接,绑定、修改或增加条目
ldapsearch:打开一个到 LDAP 服务器的连接,绑定并使用指定的参数进行搜索
对本地系统上的数据库进行操作的几个程序:
slapadd:将以 LDAP 目录交换格式(LDIF文件)指定的条目添加到 LDAP 数据库中
slapcat:打开 LDAP 数据库,并将对应的条目输出为 LDIF 文件格式

编辑LDAP服务主配置文件

$ vim /etc/openldap/slapd.conf

#设置目录树的后缀
找到by dn.exact="cn=Manager,dc=my-domain,dc=com" read这一行
改为by dn.exact="cn=admin,dc=navinfo,dc=com" read

找到suffix "dc=my-domain,dc=com"这一行
改为suffix "dc=navinfo,dc=com"

#设置LDAP管理员的DN(这里管理员的名字是admin)
找到rootdn "cn=Manager,dc=my-domain,dc=com"这一行
改为rootdn "cn=admin,dc=navinfo,dc=com"

#设置LDAP管理员的密码
将rootpw secret改为 {SSHA}pfAJm+JJa4ec2y8GjTc8uMEJpoR5YKMn
口令也可以用明文,或者通过运行slappasswd以便替换配置文件里面的密码

#同时请确保有如下两行
pidfile /var/run/openldap/slapd.pid  
argsfile /var/run/openldap/slapd.args
#备份/etc/openldap/slapd.d目录
$ cp -rfa /etc/openldap/slapd.d /etc/openldap/slapd.d.bak  
$ rm -rf /etc/openldap/slapd.d/*

#分配权限
$ chown -R ldap.ldap /etc/openldap
$ chown -R ldap.ldap /var/lib/ldap

$ service slapd start  #启动下服务,用来生成/var/lib/ldap/*.bdb文件

#测试并生成配置文件
$ slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
$ chown -R ldap:ldap /etc/openldap/slapd.d

#重启服务
$ service slapd restart && chkconfig --level 2345 slapd on

#创建一个系统用户,稍候尝试在客户端用此用户登陆
$ useradd ldapuser1
$ passwd ldapuser1

该用户仅仅是系统上存在的用户(存储在/etc/passwd和/etc/shadow上),并没有在LDAP数据库里,所以要把这些用户导入到LDAP里面去。但LDAP只能识别后缀为ldif的文件(也是文本文件),故不能直接使用/etc/passwd和/etc/shadow。需要migrationtools这个工具把这两个文件转变成ldif文件。

$ yum install migrationtools -y
$ cd /usr/share/migrationtools/

$ vim migrate_common.ph    #ubuntu下该文件位于/etc/migrationtools
将DEFAULT_MAIL_DOMAIN的值修改为navinfo.com
将DEFAULT_BASE的值修改为dc=navinfo,dc=com

#使用迁移脚本migrate_base.pl为目录创建基本的数据结构
$ ./migrate_base.pl > /tmp/base.ldif

#将/etc/passwd和/etc/shadow生成LDAP能读懂的文件格式,保存在/tmp/下
$ ./migrate_passwd.pl /etc/passwd > /tmp/passwd.ldif
$ ./migrate_group.pl /etc/group > /tmp/group.ldif

#把这三个ldif文件导入到LDAP,然后LDAP的数据库里就有了我们想要的用户
$ ldapadd -x -D "cn=admin,dc=navinfo,dc=com" -W -f /tmp/base.ldif
$ ldapadd -x -D "cn=admin,dc=navinfo,dc=com" -W -f /tmp/passwd.ldif
$ ldapadd -x -D "cn=admin,dc=navinfo,dc=com" -W -f /tmp/group.ldif

#查看数据库中基本的层次结构
$ ldapsearch -x -H ldap://127.0.0.1 -b 'dc=navinfo,dc=com'

$ service slapd restart

配置NFS服务端

$ yum install nfs-utils portmap  (适用centos 5)
$ yum install nfs-utils rpcbind  (适用centos 6)

$ vim /etc/exports   #写入一行
/home/bear       192.168.1.0/24(rw,sync,no_root_squash)

$ /etc/init.d/rpcbind start && chkconfig --level 2345 rpcbind on
$ /etc/init.d/nfs start  && chkconfig --level 2345 nfs on

四,LDAP客户端配置

系统命名服务(NSS)需要配置为使用 LDAP 来解析诸如用户和组帐号之类的资源。例如,在运行命令 ls -l 时,如果某个文件 inode 给出文件的所有者是 “user 501”,那么命名服务就需要将 “uid 501” 解析成用户名,并在 ls 命令输出结果中输出。通常来说,这是通过查找 /etc/passwd 文件中的所有用户帐号实现的。由于用户现在都存储在 LDAP 目录中,因此系统需要配置成同时对 passwd 文件和 LDAP 目录中的帐号进行解析。这种功能是通过 /usr/lib/libnss_ldap.so 库提供的。

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

$ vim /etc/openldap/ldap.conf,修改如下两行
添加
BASE:dc=test,dc=com
URL:192.168.197.128    #此处为LDAP Server IP

$ vim /etc/nslcd.conf,修改如下两行
uri ldap://192.168.197.128
base dc=navinfo,dc=com

#让 NSS 服务使用 OpenLDAP 服务器
$ vim /etc/nsswitch.conf
passwd:     files ldap
shadow:     files ldap
group:      files ldap

#启用LDAP身份验证机制
#也可以通过运行authconfig-tui命令打开一个图形化的界面来配置
$ vim /etc/sysconfig/authconfig
USESYSNETAUTH=yes  #是否启用本地登陆功能,这个随意
USESHADOW=yes
USELOCAUTHORIZE=yes
USELDAP=yes
USELDAPAUTH=yes
USEMD5=yes        #这一项没找到,未设置
USEMKHOMEDIR=yes
PASSWDALGORITHM=sha512   #密码算法,这里我没有改

设置让 PAM 身份验证服务使用 OpenLDAP 服务器
在该文件的auth,account,password,session四段中pam_unix.so模块后添加pam_ldap.so模块(注意添加位置是在pam_unix.so模块后),为用户登录自动创建家目录。使身份验证先对本地的/etc/passwd检查用户帐号,然后再检查LDAP服务器为用户登录自动创建家目录。使身份验证先对本地的/etc/passwd检查用户帐号,然后再检查LDAP服务器。还必须在会话(SESSION)阶段增加pam_mkhomedir.so模块,为用户登录自动创建宿主目录。

$ cp /etc/pam.d/system-auth /etc/pam.d/system-auth.bak
$ vim /etc/pam.d/system-auth
auth        sufficient    pam_ldap.so

account     [default=bad success=ok user_unknown=ignore] pam_ldap.so

password    sufficient    pam_ldap.so use_authtok

session     optional      pam_ldap.so
session     optional      pam_mkhomedir.so skel=/etc/skel/ umask=0022 #不能少

注意,即使配置了NFS或者autofs服务,pam_mkhomedir.so不可少。否则当用户登陆时,家目录不会挂载,会自动切换到根目录。

启用名称缓存服务nscd

#通过网络方式查询用户占用带宽且有时延,开启名称缓存服务可以节省网络资源提高查询效率
$ service nslcd start && chkconfig --level 2345 nslcd on

客户端登陆测试,看看能否读取到服务器上的user信息

$ getent passwd |grep ldapuser1

如果测试失败,可以通过/var/log/messages查看错误日志

客户端配置autofs,实现ldapuser1登录成功后,能够访问本地家目录

#客户端也需要安装nfs用于实现挂载
$ yum install nfs-utils portmap  (适用centos 5)
$ yum install nfs-utils rpcbind  (适用centos 6)

$ yum install autofs

$ vim /etc/auto.master
添加一行/home   /etc/auto.nfs --timeout=60

$ vim /etc/auto.nfs
添加一行*               -fstype=nfs             192.168.197.128:/home/&

$ service autofs start && chkconfig --level 2345 autofs on

关于autofs的一些说明:
1,autofs启动以后,用户的家目录并不会主动挂载,但当用户通过ldap登陆成功以后,远程的家目录便会自动挂载,很神奇;
2,跟上面一样,当系统重启后,autofs不会主动挂载,但当用户通过ldap登陆成功以后,远程的家目录便会自动挂载;
3,autofs服务停止后,已经挂载的目录,仍处于挂载状态;
4,客户端无须开启nfs服务;
5,用户的家目录无需预先在ldap client上面建好;用户登陆时,家目录由pam创建。由autofs负责将ldap server上的家目录挂载至本地;
6,用户登陆时,如果如果autofs未启动的话,客户仅能进入一个由pam创建的家目录,ldap server上的家目录并不会挂载至本地;
7,写入/etc/auto.master中的目录(上例是/home),将被autofs接管,/home下看不到以前的文件,亦无法读取和写入(慎重!)
8,用户的家目录建立放到一个统一的文件夹里,例如/home,不要把用户的家目录放到多个不同的父目录,例如/home、/opt等,否则autofs仅能挂载第一个登陆用户的家目录,后面的用户会无法登陆ldap client(亲测);

autofs挂载失败的debug(For CentOS 7 and Fedora 22)

$ vim /etc/sysconfig/autofs
……
LOGGING=”debug”
……

$ cat /var/log/messages

autofs挂载失败的debug(For Ubuntu14.04)

$ sudo service autofs stop

$ sudo automount -f -v  #进入debug模式,在其它终端尝试登陆,观察这里的输出信息

五,其它扩展资料

解决LDAP出现ldap_bind: Invalid credentials (49)错误
CentOS 6安装配置LDAP管理工具:phpldapadmin和LAM
LDAP配置允许客户端修改密码
LDAP用户管理,实现客户端增删改查
Ubuntu 14.04配置LDAP客户端

可能出现的错误

1,提示ldap_bind: Invalid credentials (49)错误,该错误出现频率极高,通常是由于DN错误或者密码错误所致。
解决办法参考http://www.zhukun.net/archives/7969

参考资料:
使用 OpenLDAP 集中管理用户帐号
OpenLDAP学习笔记(有详细的objectClass和Attribute介绍)
Ubuntu 14.04 OpenLDAP 服务器(有详细的ACL介绍)

Leave a Reply

Your email address will not be published. Required fields are marked *