ldap简介:
LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务。目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的优化。目录一般用来包含描述性的,基于属性的信息并支持精细复杂的过滤能力。目录一般不支持通用数据库针对大量更新操作操作需要的复杂的事务管理或回卷策略。而目录服务的更新则一般都非常简单。这种目录可以存储包括个人信息、web链结、jpeg图像等各种信息。为了访问存储在目录中的信息,就需要使用运行在TCP/IP 之上的访问协议—LDAP。
LDAP目录中的信息是是按照树型结构组织,具体信息存储在条目(entry)的数据结构中。条目相当于关系数据库中表的记录;条目是具有区别名DN (Distinguished Name)的属性(Attribute),DN是用来引用条目的,DN相当于关系数据库表中的关键字(Primary Key)。属性由类型(Type)和一个或多个值(Values)组成,相当于关系数据库中的字段(Field)由字段名和数据类型组成,只是为了方便检索的需要,LDAP中的Type可以有多个Value,而不是关系数据库中为降低数据的冗余性要求实现的各个域必须是不相关的。LDAP中条目的组织一般按照地理位置和组织关系进行组织,非常的直观。LDAP把数据存放在文件中,为提高效率可以使用基于索引的文件数据库,而不是关系数据库。类型的一个例子就是mail,其值将是一个电子邮件地址。
LDAP的信息是以树型结构存储的,在树根一般定义国家(c=CN)或域名(dc=com),在其下则往往定义一个或多个组织 (organization)(o=Acme)或组织单元(organizational units) (ou=People)。一个组织单元可能包含诸如所有雇员、大楼内的所有打印机等信息。此外,LDAP支持对条目能够和必须支持哪些属性进行控制,这是有一个特殊的称为对象类别(objectClass)的属性来实现的。该属性的值决定了该条目必须遵循的一些规则,其规定了该条目能够及至少应该包含哪些属性。例如:inetorgPerson对象类需要支持sn(surname)和cn(common name)属性,但也可以包含可选的如邮件,电话号码等属性。
ldap部署
环境准备
修改服务器的主机名为:ldap-server,关闭iptables防火墙和selinux,添加阿里云的epel源,修改hosts文件
[root@ldap-server ~]# echo "192.168.1.108 goser.com" >>/etc/hosts
[root@ldap-server ~]# tail -1 /etc/hosts
192.168.1.108 goser.com
安装openldap及其依赖包
[root@ldap-server ~]# rpm -qa|grep openldap
openldap-2.4.39-8.el6.x86_64
compat-openldap-2.3.43-2.el6.x86_64
[root@ldap-server ~]# yum install -y openldap openldap-*
[root@ldap-server ~]# yum install -y nscd nss-pam-ldapd nss pcre pcre-*
复制ldap模板配置文件并配置此配置文件
[root@ldap-server ~]# cd /etc/openldap/
[root@ldap-server openldap]# cp /usr/share/openldap-servers/slapd.conf.obsolete slapd.conf
[root@ldap-server openldap]# cp slapd.conf slapd.conf.ori
#设置管理ldap的管理员admin的密码为:goser
[root@ldap-server openldap]# slappasswd -s goser|sed -e "s#{SSHA}#rootpw\t{SSHA}#g" >>slapd.conf
#编辑配置文件,添加及修改的内容如下:
[root@ldap-server openldap]# vim slapd.conf
#在此配置文件的114行处添加修改内容
database bdb
loglevel 296
cachesize 1000
suffix "dc=goser,dc=com"
checkpoint 2048 10
rootdn "cn=admin,dc=goser,dc=com"
#注释默认权限,将下面的内容注释
#database config
#access to *
# by * none
# enable server status monitoring (cn=monitor)
#database monitor
#access to *
# by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" re
ad
# by dn.exact="cn=Manager,dc=my-domain,dc=com" read
# by * none
#添加新的权限(这是2.3的权限设置方式)
access to *
by self write
by anonymous auth
by * read
配置系统日志rsyslog,让其可以记录ldap的日志信息:
[root@ldap-server openldap]# cp /etc/rsyslog.conf /etc/rsyslog.conf.ori
[root@ldap-server openldap]# vim /etc/rsyslog.conf
#添加一行记录ldap日志
local4.* /var/log/ldap.log
#重启rsyslog使配置生效
[root@ldap-server openldap]# /etc/init.d/rsyslog restart
#重启完rsyslog后便生成了一个ldap.log的日志文件
[root@ldap-server openldap]# ll /var/log/ldap.log
-rw------- 1 root root 0 Feb 25 10:59 /var/log/ldap.log
配置ldap数据库并授权
[root@ldap-server openldap]# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
[root@ldap-server openldap]# chown ldap:ldap /var/lib/ldap/DB_CONFIG
[root@ldap-server openldap]# chmod 700 /var/lib/ldap
[root@ldap-server openldap]# ll /var/lib/ldap/
total 4
-rw-r--r-- 1 ldap ldap 845 Feb 25 11:01 DB_CONFIG
启动ldap服务并设置其开机自启动
[root@ldap-server openldap]# /etc/init.d/slapd start
[root@ldap-server openldap]# netstat -lntup
tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 1958/slapd
tcp 0 0 :::389 :::* LISTEN 1958/slapd
[root@ldap-server openldap]# chkconfig slapd on
[root@ldap-server openldap]# chkconfig --list slapd
slapd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
测试是否可以查询ldap的内容
[root@ldap-server openldap]# ldapsearch -LLL -W -x -H ldap://goser.com -D "cn=admin,dc=goser,dc=com" -b "dc=goser,dc=com"
Enter LDAP Password:
ldap_bind: Invalid credentials (49) #这里报错
#解决如下,删除默认2.4的配置文件,重新生成2.3的配置文件
[root@ldap-server openldap]# rm -rf slapd.d/*
[root@ldap-server openldap]# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d/
#对slapd.d下的配置文件授予ldap权限
[root@ldap-server openldap]# chown -R ldap:ldap /etc/openldap/slapd.d
#这是重新启动ldap并再次查询ldap的内容正常了
[root@ldap-server openldap]# /etc/init.d/slapd restart
[root@ldap-server openldap]# ldapsearch -LLL -W -x -H ldap://goser.com -D "cn=admin,dc=goser,dc=com" -b "dc=goser,dc=com"
Enter LDAP Password:
No such object (32)
导入ldap数据
[root@ldap-server ~]# mkdir -p /server/backup/ldap
[root@ldap-server ~]# cd /server/backup/ldap/
#ldap的基础数据
[root@ldap-server ldap]# vim base.ldif
dn: dc=goser,dc=com
objectClass: organization
objectClass: dcObject
dc: goser
o: goser
dn: ou=People,dc=goser,dc=com
objectClass: organizationalUnit
ou: People
dn: ou=group,dc=goser,dc=com
objectClass: organizationalUnit
ou: group
dn: cn=tech,ou=group,dc=goser,dc=com
objectClass: posixGroup
description: 5oqA5pyv6YOo
gidNumber: 10001
cn: tech
#ldap的用户数据
[root@ldap-server ldap]# vim ldap_users.ldif
cn: user01
userPassword:: e1NTSEF9WTNFd29YSDMxZXgOaX1HW1BDNUNkbk9sNW1XRUFrNGC=
uidNumber: 10004
gidNumber: 10001
sn: user01
givenName: user01
dn: uid=oldgirl,ou=People,dc=goser,dc=com
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
homeDirectory: /home/oldgirl
loginShell: /bin/bash
uid: oldgirl
cn: oldgirl
userPassword:: e1NTSEF9RTBOVTg3ejhoYjU1dHR6MVpMcVBjeVRIQVcxcUJrMXc=
uidNumber: 10005
gidNumber: 10001
sn: oldgirl
#首先导入ldap的基础数据base.ldif,然后导入用户数据ldap_users.ldif
[root@ldap-server ldap]# ldapadd -x -H ldap://goser.com -D "cn=admin,dc=goser,dc=com" -W -f base.ldif
[root@ldap-server ldap]# ldapadd -x -H ldap://goser.com -D "cn=admin,dc=goser,dc=com" -W -f ldap_users.ldif
#最后用非交互式来查询ldap的内容
[root@ldap-server ldap]# ldapsearch -LLL -w goser -x -H ldap://goser.com -D "cn=admin,dc=goser,dc=com" -b "dc=goser,dc=com"
在OpenLDAP的schema中定义了很多objectClass,下面列出部分常用的objectClass的名称
● account
● alias
● dcobject
● domain
● ipHost
● organization
● organizationalRole
● organizationalUnit
● person
● organizationalPerson
● inetOrgPerson
● residentialPerson
● posixAccount
● posixGroup
常用的objectclass名称
objectClass属性,只要objectClass属性定义的内容,那么条目中就要包含的内容如下:
● account:userid。
● organization:o。
● person:cn和sn。
● organizationalPerson:与person相同。
● organizationalRole:cn。
● organizationUnit:ou。
● posixGroup:cn、gidNumber。
● posixAccount:cn、gidNumber、homeDirectory、uid、uidNumber。
常用objectClass要求必设的属性
当然对于导入完的ldap数据也可做备份处理,以防以后使用
[root@ldap-server ldap]# ldapsearch -LLL -w goser -x -H ldap://goser.com -D "cn=admin,dc=goser,dc=com" -b "dc=goser,dc=com" >>backup_ldap_data.ldif
通过web方式管理ldap
要让ldap通过web方式来管理的话,就要用到ldap-account-manager的管理工具,这里用ldap-account-manager-3.7.tar.gz版本(下载地址:https://www.ldap-account-manager.org/lamcms/)。
而ldap-account-manager工具又依赖lamp环境,所以先安装lamp服务
[root@ldap-server ldap]# yum install -y httpd php php-ldap php-gd
[root@ldap-server ldap]# cd /var/www/html/
[root@ldap-server ldap]# wget http://prdownloads.sourceforge.net/lam/ldap-account-manager-3.7.tar.gz?download
[root@ldap-server html]# tar xf ldap-account-manager-3.7.tar.gz
[root@ldap-server html]# mv ldap-account-manager-3.7 ldap
[root@ldap-server html]# cd ldap/config
[root@ldap-server config]# cp lam.conf_sample lam.conf
[root@ldap-server config]# cp config.cfg_sample config.cfg
#修改lam.conf配置文件,更改域名和管理员cn
[root@ldap-server config]# sed -i "s#dc=my-domain#dc=goser#g" lam.conf
[root@ldap-server config]# sed -i "s#cn=Manager#cn=admin#g" lam.conf
#对ldap的web做apache用户的授权
[root@ldap-server config]# chown -R apache:apache /var/www/html/ldap
#启动apache服务并对其作开机自启动
[root@ldap-server config]# /etc/init.d/httpd start
[root@ldap-server config]# chkconfig httpd on
这时候就可以通过ldap的url地址http://192.168.1.108/ldap来管理ldap了
首先点击LAM configuration,然后点击Edit general settings来修改lam的密码,lam的初始密码为:lam ,密码要设置复杂些,这里为了测试密码设置为123456
然后登录ldap,这时候就可以添加用户、组等操作了,比如添加一个张三账号
通过命令行来查询添加账号zhangsan是否成功,能取到内容说明添加成功了。
[root@ldap-server config]# ldapsearch -LLL -w goser -x -H ldap://goser.com -D "cn=admin,dc=goser,dc=com" -b "dc=goser,dc=com" "(uid=zhangsan)"
dn: uid=zhangsan,ou=People,dc=goser,dc=com
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
homeDirectory: /home/zhangsan
loginShell: /bin/bash
uid: zhangsan
cn: zhangsan
uidNumber: 10006
gidNumber: 10001
userPassword:: e1NTSEF9enI5ZWJ5U1JWSExtc01IYloybUNOMW9MbzkzNy9mSHg=
sn: zhangsan
givenName: zhangsan
通过sasl生成库来做其他独立服务使用ldap目录服务做认证
[root@ldap-server config]# rpm -qa |grep sasl
cyrus-sasl-lib-2.1.23-15.el6_6.2.x86_64
cyrus-sasl-plain-2.1.23-15.el6_6.2.x86_64
cyrus-sasl-devel-2.1.23-15.el6_6.2.x86_64
cyrus-sasl-2.1.23-15.el6_6.2.x86_64
[root@ldap-server config]# yum install -y *sasl*
#查看sasl库支持的认证方式有哪些
[root@ldap-server config]# saslauthd -v
saslauthd 2.1.23
authentication mechanisms: getpwent kerberos5 pam rimap shadow ldap
#默认的认证方式是pam方式
[root@ldap-server config]# grep -i mech /etc/sysconfig/saslauthd
# Mechanism to use when checking passwords. Run "saslauthd -v" to get a list
# of which mechanism your installation was compiled with the ablity to use.
MECH=pam
#修改sasl认证方式为shadow,也就是通过本地系统账号的方式认证
[root@ldap-server config]# sed -i "s#MECH=pam#MECH=shadow#g" /etc/sysconfig/saslauthd
#重启saslauthd,使配置生效,这时用系统账号来测试
[root@ldap-server config]# /etc/init.d/saslauthd restart
[root@ldap-server config]# testsaslauthd -ugoser01 -p111111
0: OK "Success."
#用ldap账号来测试,是不成功的
[root@ldap-server config]# testsaslauthd -u oldgirl -p123456
0: NO "authentication failed"
#修改sasl认证方式为ldap,这时候用ldap账户去测试还是不成功的
[root@ldap-server config]# sed -i "s#MECH=shadow#MECH=ldap#g" /etc/sysconfig/saslauthd
[root@ldap-server config]# /etc/init.d/saslauthd restart
[root@ldap-server config]# testsaslauthd -u oldgirl -p123456 0: NO "authentication failed"
#为什么sasl认证为ldap,而ldap账户是无法登陆的呢,这时man一下sasl的配置文件
[root@ldap-server config]# man saslauthd
ldap (All platforms that support OpenLDAP 2.0 or higher)
Authenticate against an ldap server. The ldap configuration
parameters are read from /etc/saslauthd.conf.
#也就是说sasl在ldap认证方式下,要通过/etc/saslauthd.conf这个配置才能找到ldap服务,而这个配置文件默认是不存在的,所以接下来要创建这个配置文件如下:
[root@ldap-server config]# vim /etc/saslauthd.conf
ldap_server: ldap://goser.com/
ldap_bind_dn: cn=admin,dc=goser,dc=com
ldap_bind_pw: goser
ldap_search_base: ou=People,dc=goser,dc=com
ldap_filter: uid=%U
ldap_password_attr: userPassword
#这时候再用ldap账户测试时成功的
[root@ldap-server config]# testsaslauthd -uoldgirl -p123456
0: OK "Success."
[root@ldap-server config]# testsaslauthd -uzhangsan -p123456
0: OK "Success."
#而这时用本地用户测试就不成功了
[root@ldap-server config]# testsaslauthd -ugoser01 -p111111
0: NO "authentication failed"
在ldap用户通过sasl认证成功后,下面开始部署svn通过ldap登录验证
首先安装svn服务:这里略,参考的安装方式
用svn用户测试登录svn:svn checkout svn://192.168.1.108/sadoc /tmp --username=goser --password=123456 登录成功,说明svn部署没问题。
要让svn通过ldap来验证,需要再/etc/sasl2/目录下创建一个svn.conf文件,让svn登录通过sasl的方式密码验证
[root@ldap-server sadoc]# vim /etc/sasl2/svn.conf
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
修改svn配置文件,让其支持通过sasl认证
[root@ldap-server svnpasswd]# sed -i "s/# use-sasl = true/use-sasl = true/g" /application/svndata/sadoc/conf/svnserve.conf
配置svn服务的authz的认证文件,添加ldap的用户,其实这时候的svn的passwd用户文件已经不起作用了(也就是说要通过ldap认证,passwd文件中就不要添加用户信息了,只要在authz文件中添加ldap用户即可)
[root@ldap-server svnpasswd]# vim authz
[groups]
# harry_and_sally = harry,sally
# harry_sally_and_joe = harry,sally,&joe
ldap_user = oldgirl,zhangsan
[sadoc:/]
@ldap_user = rw
接下来重启svn服务
[root@ldap-server svnpasswd]# killall svnserve
[root@ldap-server svnpasswd]# svnserve -d -r /application/svndata/
最后测试用ldap用户连接svn,成功连接svn。
[root@ldap-server svnpasswd]# svn checkout svn://192.168.1.108/sadoc /tmp --username=zhangsan --password=123456
Checked out revision 0.
那么这时再用svn的用户连接svn的话,就不通了,因为验证的方式修改成sasl的方式。
当然,除了svn可以通过ldap认证,像samba、vsftp、redmine、mantis、apache、git、CSVN、openvpn等都可以通过ldap认证