CentOS 6安装配置LDAP
http://ju.outofmemory.cn/entry/100113
一,什么是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)或组织单元(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发行版中,有着比较广泛的模块支持。
比如,在该系列的文章中,我们就可以通过OpenLDAP来存储Linux系统用户的账号,密码,SSHPublicKey,以及sudo权限等数据,然后修改相应的配置,使系统支持从OpenLDAP中获取用户账号并认证,来取得操作系统的权限。从而实现用户账户的统一认证管理。
三,配置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,复制之。
编辑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 将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.misc $ vim /etc/auto.misc 添加一行 * -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上面建好;
6,用户登陆时,家目录由pam创建。由autofs负责将ldap server上的家目录挂载至本地;
7,用户登陆时,如果如果autofs未启动的话,客户仅能进入一个由pam创建的家目录,ldap server上的家目录并不会挂载至本地;
8,用户的家目录建立放到一个统一的文件夹里,例如/home,不要把用户的家目录放到多个不同的父目录,例如/home、/opt等,否则autofs仅能挂载第一个登陆用户的家目录,后面的用户会无法登陆ldap client(亲测);
五,LDAP用户管理
服务端用户管理:删除用户:ldapdelete -x -D "cn=admin,dc=navinfo,dc=com" -W "uid=用户名,ou=People,dc=navinfo,dc=com" 客户端实现增删改查查询 ldapsearch -x -b 'dc=navinfo,dc=com'
可能出现的错误
1,执行ldapadd -x -D “cn=Manager,dc=115,dc=com” -W -f createOU.ldif时提示ldap_bind: Invalid credentials (49)
出现这个错误的原因有很多,建议从以下两个方面入手:
(1)上述命令中的cn和dc是否输入正确,以及密码是否输入正确
(2)执行下如命令,重新生成配置文件
rm -fr /etc/openldap/slapd.d/* slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d chown -R ldap:ldap /etc/openldap/slapd.d/ /etc/init.d/slapd restart
提示:删除/etc/openldap/slapd.d/目录下的内容,并不会导致ldap数据库的丢失,实际上,ldap数据库存储位置由主配置文件里的directory项指定。
2,提示ldap_add: Undefined attribute type(17)
additional info: dn: attribute type undefined
解决方法:ldif文件写入错误,每一行末尾不能有空格,中间空着的那一行不能有空格,最后一行不能是空行。
CentOS 6安装配置LDAP