一、OpenLDAP 安装方式
在UNIX 发行操作系统环境下安装OpenLDAP 软件一般有两种方式:一种是通过源码编译安装,另一种则是通过光盘自带的rpm 软件包进行安装。下面会分别介绍这两种安装方式,我还是建议使用rpm 安装,因为方便快捷。安装OpenLDAP服务器需要提供守护进程和传统的OpenLDAP 管理配置工具,主要是slapd 和ldap-utils 套件。
我的安装环境是CentOS 6.7 64位操作系统,安装前环境准备请看博文环境准备。
1、以软件包形式安装
1
2
3
4
5
6
7
8
9
10
11
12
|
# yum安装
yum
install
openldap openldap-* -y
# 初始化配置文件
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
|
默认OpenLDAP 服务所使用的端口为389,此端口采用明文传输数据,数据信息得不到保障。所以可以通过配置CA 及结合TLS/SASL 实现数据加密传输,所使用端口为636,后面我再介绍实现过程。
2、通过源码编译安装
由于编译安装OpenLDAP 需要数据库支持,因此OpenLDAP 软件后端数据库可采用BerkeleyDBBDB、Oracle、MySQL、MariaDB、GDBM 等数据库软件实现数据的存储。默认OpenLDAP 采用Berkeley DB 数据库作为后端存储引擎,而且OpenLDAP 对Berkey DB 的版本有一定要求,以OpenLDAP 2.4 软件版本为例,需要Berkeley DB 4.4 版本以上,所以在编译OpenLDAP 源码包时需要先下载Brekeley DB 源码包,并进行编译安装即可。
Berkeley DB 是由美国Sleepycat Software 公司开发的开源数据库系统,具有高性能、嵌入式数据库编程库,可存取任意类型的键(key)/值(value)对,一键可以存储多个值,且支持在线并发量大的数据查询请求。
非常抱歉,这部分安装设置比较复杂,我就不在这里展示了,如果谁想知道可以给我留言,谢谢。
二、OpenLDAP 配置
我使用的系统是CentOS 6系列的,和CentOS 5系列的OpenLDAP有不小的区别,旧版本的OpenLDAP配置文件是slapd.conf,而新版本(我测试的新版本是2.4.40)的OpenLDAP服务运行时并不会读取该配置文件,而是从slapd.d目录(一般与slapd.conf在同一目录下)中读取相关信息,我们需要把该目录下的数据删掉,然后利用我们在slapd.conf里配置的信息重新生成配置数据。这也可能是你启动服务后运行ldap相关命令却出现“ldap_bind: Invalid credentials (49)”错误的主要原因。具体怎么重新生成配置数据请看具体的实验过程。
1、slapd.conf配置文件参数
以下是我的配置文件,#的内容是我添加的解释,大家可以根据实际情况修改成自己的域名,如果大家不了解其中的dn,cn,dc代表什么,请查看我的博文理论知识。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
[root@mldap ~]
# egrep -v "#|^$" /etc/openldap/slapd.conf
# include 行代表当前OpenLDAP 服务包含的schema 文件
include
/etc/openldap/schema/corba
.schema
include
/etc/openldap/schema/core
.schema
include
/etc/openldap/schema/cosine
.schema
include
/etc/openldap/schema/duaconf
.schema
include
/etc/openldap/schema/dyngroup
.schema
include
/etc/openldap/schema/inetorgperson
.schema
include
/etc/openldap/schema/java
.schema
include
/etc/openldap/schema/misc
.schema
include
/etc/openldap/schema/nis
.schema
include
/etc/openldap/schema/openldap
.schema
include
/etc/openldap/schema/ppolicy
.schema
include
/etc/openldap/schema/collective
.schema
include
/etc/openldap/schema/sudo
.schema
include
/etc/openldap/schema/openssh-lpk-openldap
.schema
# OpenLDAP 服务允许连接的客户端版本。
allow bind_v2
# OpenLDAP 进程启动时,pid 文件存放路径。
pidfile
/var/run/openldap/slapd
.pid
# OpenLDAP 参数文件存放的路径。
argsfile
/var/run/openldap/slapd
.args
# 传输加密的配置信息
TLSCACertificatePath
/etc/openldap/certs
TLSCertificateFile
"\"OpenLDAP Server\""
TLSCertificateKeyFile
/etc/openldap/certs/password
database config
access to *
by dn.exact=
"gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
manage
by * none
database monitor
access to *
by dn.exact=
"gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
read
by dn.exact=
"cn=admin,dc=wzlinux,dc=com"
read
by * none
# 指定OpenLDAP 数据库类型。
database bdb
# 指定OpenLDAP 服务域名(DN)
suffix
"dc=wzlinux,dc=com"
checkpoint 1024 15
# 指定OpenLDAP 服务管理员信息。
rootdn
"cn=admin,dc=wzlinux,dc=com"
# 指定OpenLDAP 服务管理员密码,使用slappasswd -s your_password来获取加密密码
rootpw {SSHA}hjqcrGsPL6H58QAS0QHBvihVS7x2HHKG
# 指定OpenLDAP 数据库文件的存放目录。
directory
/var/lib/ldap
# 创建OpenLDAP 索引。
index objectClass
eq
,pres
index ou,cn,mail,surname,givenname
eq
,pres,sub
index uidNumber,gidNumber,loginShell
eq
,pres
index uid,memberUid
eq
,pres,sub
index nisMapName,nisMapEntry
eq
,pres,sub
|
2、启动服务并查询
1
|
service slapd start
|
查询LDAP的目录条目,首先我们介绍一下ldapsearch命令,具体可以使用man帮助手册查看。
-b:指定查找的节点
-D:指定查找的DN
-x:使用简单认证
-W:查询是输入密码,或者使用-w password
-h:OpenLDAP的主机地址,可以使用IP或者域名
-H:使用LDAP服务器的URI地址进行操作
1
2
3
|
[root@mldap ~]
# ldapsearch -x -D "cn=admin,dc=wzlinux,dc=com" -H ldap://192.168.2.10 -W
Enter LDAP Password:
#就是我们在slapd.conf加密的密码
ldap_bind: Invalid credentials (49)
|
我们看到出现了错误,这个问题并不是因为密码错误,是因为新版的LDAP去读取数据库(slapd.d),并没有按照我们的配置文件(slapd.conf)读取,所以我们要删掉数据库配置文件,然后通过slapd.conf文件生成,每次修改配置文件都要如此操作。
1
2
3
4
|
rm
-rf
/etc/openldap/slapd
.d/*
slaptest -f
/etc/openldap/slapd
.conf -F
/etc/openldap/slapd
.d
chown
-R ldap:ldap
/etc/openldap/slapd
.d
service slapd restart
|
然后再进行查询,看看结果返回是否正常,我们可以看到No such object,因为我们什么数据也没有添加,所以查询的结果为零,到此我们的配置都是正常的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@mldap ~]
# ldapsearch -x -D "cn=admin,dc=wzlinux,dc=com" -h 192.168.2.10 -W
Enter LDAP Password:
# extended LDIF
#
# LDAPv3
# base <> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# search result
search: 2
result: 32 No such object
# numResponses: 1
|
3、为ldap server添加数据
为ldap添加用户数据,有四种方法,分别如下,我们选择第四种方法进行试验。
1)可以直接修改slapd.d目录下面的数据文件,好处是不用重启服务,直接生效;
2)安装开源工具migrationtools来生成ldfi文件,并通过ldapadd来添加;
3)安装ldap 客户端,这种方法最为简单;
4)直接编辑ldfi文件,然后通过ldapadd添加。
首先我们手动编辑base.ldif文件,直接复制好像会因为格式有问题。每个条目之间有个空格,直接复制过去会有点问题,需要你把每个条目之间空行的第一个空位删除一下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[root@mldap ~]
# vim base.ldif
dn:
dc
=wzlinux,
dc
=com
objectClass: organization
objectClass: dcObject
dc
: wzlinux
o: wzlinux
dn: ou=people,
dc
=wzlinux,
dc
=com
objectClass:
top
objectClass: organizationalUnit
ou: people
dn: ou=group,
dc
=wzlinux,
dc
=com
objectClass:
top
objectClass: organizationalUnit
ou: group
|
通过ldapadd导入数据,通过man可以看到,他的大部分参数和ldapsearch差不多,我们这里就直接使用了。
1
2
3
4
5
6
7
|
[root@mldap ~]
# ldapadd -x -D "cn=admin,dc=wzlinux,dc=com" -w 123456a -h 192.168.2.10 -f base.ldif
adding new entry
"dc=wzlinux,dc=com"
adding new entry
"ou=people,dc=wzlinux,dc=com"
adding new entry
"ou=group,dc=wzlinux,dc=com"
|
通过反馈的结果,我们已经看到添加成功了,我们在另外一台安装了客户端的机器上面进行查询一下,可以看到我们查询到的结果和我们的base.ldif是一样的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[root@test01 ~]
# ldapsearch -x -D "cn=admin,dc=wzlinux,dc=com" -w 123456a -h 192.168.2.10 -b "dc=wzlinux,dc=com" -LLL
dn:
dc
=wzlinux,
dc
=com
objectClass: organization
objectClass: dcObject
dc
: wzlinux
o: wzlinux
dn: ou=people,
dc
=wzlinux,
dc
=com
objectClass:
top
objectClass: organizationalUnit
ou: people
dn: ou=group,
dc
=wzlinux,
dc
=com
objectClass:
top
objectClass: organizationalUnit
ou: group
|
然后我们通过user.ldif和group.ldif增加一个用户和一个组。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
[root@mldap ~]
# cat user.ldif group.ldif
dn: uid=test1,ou=people,
dc
=wzlinux,
dc
=com
objectClass: posixAccount
objectClass:
top
objectClass: inetOrgPerson
objectClass: shadowAccount
gidNumber: 0
givenName: test1
sn: test1
uid: test1
homeDirectory:
/home/test1
loginShell:
/bin/bash
shadowFlag: 0
shadowMin: 0
shadowMax: 99999
shadowWarning: 0
shadowInactive: 99999
shadowLastChange: 12011
shadowExpire: 99999
cn: test1
uidNumber: 24422
userPassword:: e1NIQX10RVNzQm1FL3lOWTNsYjZhMEw2dlZRRVpOcXc9
dn: cn=DBA,ou=group,
dc
=wzlinux,
dc
=com
objectClass: posixGroup
objectClass:
top
cn: DBA
memberUid: test1
gidNumber: 10673
|
看完那就添加用户和组呗。
1
2
3
4
5
|
[root@mldap ~]
# ldapadd -x -D "cn=admin,dc=wzlinux,dc=com" -w 123456a -h 192.168.2.10 -f group.ldif
adding new entry
"cn=DBA,ou=group,dc=wzlinux,dc=com"
[root@mldap ~]
# ldapadd -x -D "cn=admin,dc=wzlinux,dc=com" -w 123456a -h 192.168.2.10 -f user.ldif
adding new entry
"uid=test1,ou=people,dc=wzlinux,dc=com"
|
然后通过下面的命令查看自己是否添加成功。
1
|
ldapsearch -x -D
"cn=admin,dc=wzlinux,dc=com"
-w 123456a -h 192.168.2.10 -b
"dc=wzlinux,dc=com"
-LLL
|
可能每次查询都写这么多,或许感觉比较麻烦,我们可以在客户端的配置文件里面添加两行数据,客户端的配置文件是/etc/openldap/ldap.conf。
1
2
|
BASE
dc
=wzlinux,
dc
=com
URI ldap:
//ldap
.wzlinux.com
#提前设置好hosts文件
|
4、通过slapd.conf 定义用户策略控制
默认情况下,不允许OpenLDAP 用户自身修改密码,仅管理员具有修改权限。为了提高个人账号的安全性,需要让用户自身可以修改并更新密码信息,不需要管理员干涉。具体步骤如下。
1)定义访问控制策略。
编辑slapd.conf 配置文件,定位access 行,添加如下内容。
1
2
3
4
5
|
access to attrs=shadowLastChange,userPassword
by self write
#只允许自身修改
by * auth
access to *
by *
read
#允许授权用户查看信息
|
2)重新生成数据库文件并重启服务。
1
2
3
4
|
rm
-rf
/etc/openldap/slapd
.d/*
slaptest -f
/etc/openldap/slapd
.conf -F
/etc/openldap/slapd
.d/
chown
-R ldap.ldap
/etc/openldap/
service slapd restart
|
5、日志的配置
在配置文件/etc/openldap/slapd.conf中添加如下内容,记得重新生成数据库文件。
1
2
3
|
loglevel 256
cachesize 1000
checkpoint 2048 10
|
在/etc/rsyslog.conf中添加如下内容,然后重启rsyslog服务。
1
|
local4.*
/var/log/slapd
.log
|
6、OpenLDAP 日志切割配置
通过logrotate 实现对OpenLDAP 日志的切割,预防日志过大不便于排错以及性能分析。下面通过定制脚本实现当日志大于10MB 时,进行切割,便于排错。脚本如下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#!/bin/bash
########### 通过logrotate 实现对OpenLDAP 日志进行切割 ##################
FILE=
/var/log/slapd
.log
if
[ ! -f $FILE ];
then
/bin/touch
$FILE &&
/bin/chmod
666 $FILE &&
/usr/bin/chattr
+a $FILE &>
/dev/null
cat
>
/etc/logrotate
.d
/ldap
<<
"EOF"
/var/log/slapd
.log {
prerotate
/usr/bin/chattr
-a
/var/log/slapd/slapd
.log
endscript
compress
delaycompress
notifempty
rotate 100
size 10M
postrotate
/usr/bin/chattr
+a
/var/log/slapd/slapd
.log
endscript
}
EOF
service rsyslog restart && chkconfig rsyslog on
else
echo
"slapd log is exsit"
fi
|
转载至http://blog.51cto.com/wzlinux/1835595