openldap是ldap协议实现的一个开源软件,也是众多Linux版本中使用的ldap软件,与Windows中的AD一样,属于比较著名而且流行的目录协议软件。
安装openldap,网上大部分文档都是寥寥几笔,认为该软件实在是简单易用,无须大费周章的过多解释,确实在CentOS 5上进行安装时比较顺利的,但是由于操作系统版本的变化以及openldap软件版本的不断升级,反而使openldap的安装变得困难。至少我在安装openldap时大概尝试了3次都是失败,有很多小的细节,真的不得不去小心注意,不然就会导致前功尽弃。
一、安装前的准备
1
2
3
4
5
|
/etc/init
.d
/iptables
stop
#关闭iptables
setenforce 0
#禁用selinux
crontab
-e
#添加时间同步定时任务
*
/5
* * * *
/usr/sbin/ntpdate
time
.nist.gov >
/dev/null
2>&1
crontab
-l
#查看添加结果
|
1
2
3
4
5
6
|
# 配置yum源
mkdir
-p
/etc/yum
.repo.d
/bak
mv
/etc/yum
.repo.d/*.*
/etc/yum
.repo.d
/bak
wget -O
/etc/yum
.repos.d
/CentOS-Base
.repo http:
//mirrors
.aliyun.com
/repo/Centos-6
.repo
yum clean all
yum makecache
|
二、安装openldap等所需要的软件包
1
|
yum -y
install
openldap openldap-servers openldap-clients openldap-devel
|
安装之后最好使用/etc/init.d/slapd start测试一下,openldap服务是否能正常启动,如果不能,那么后面的操作就可能会出现问题了。
因为之前使用cobbler自动化安装的CentOS 6.5,精简了大部分的package,所以我尝试了两次,都无法启动slapd,也到官方查了文档,(有可能是sasl和openldap的版本不一致导致),但是因为每次安装都耗费大量的时间,而且还有别的工作进来,所以直接拿CentOS 6.5的光盘重新安装了一个虚拟机,然后一次性成功,所以部署服务的时候不能一味的追求系统的过量精简(当然我只是在测试的虚拟机中采用的精简配置,生产环境的cobbler还是尽量把各种运行库和开发库都安装上的),这一点可能我需要注意了。
三、配置openldap
[root@ldapsrv01 ~]# ll /etc/openldap/
drwxr-xr-x. 2 root root 4096 Sep 8 12:37 certs
-rw-r-----. 1 root ldap 121 May 11 07:32 check_password.conf
-rw-r--r--. 1 root root 280 May 11 07:32 ldap.conf
drwxr-xr-x. 2 root root 4096 Sep 8 12:37 schema
drwx------. 3 ldap ldap 4096 Sep 8 12:46 slapd.d
安装完openldap之后,openldap的配置目录/etc/openldap中的文件基本上就这些。
1
2
3
4
5
|
cp
/usr/share/openldap-servers/slapd
.conf.obsolete
/etc/openldap/slapd
.conf
#因为openldap的默认配置文件不存在,所以我们从/usr/share/openldap-servers/下拷贝一份
cd
/etc/openldap/
cp
slapd.conf slapd.conf.bak
#备份一下配置文件
cp
-a slapd.d slapd.d.bak$(
date
+%F)
#备份一下slapd.d目录,里面的文件等下要全部删除
|
[root@ldapsrv01 openldap]# service slapd start #尝试启动一下slapd,该操作会在/var/lib/ldap目录下生成数据库文件
Starting slapd: [ OK ]
[root@ldapsrv01 openldap]# ll
total 40
drwxr-xr-x. 2 root root 4096 Sep 8 12:37 certs
-rw-r-----. 1 root ldap 121 May 11 07:32 check_password.conf
-rw-r--r--. 1 root root 280 May 11 07:32 ldap.conf
drwxr-xr-x. 2 root root 4096 Sep 8 12:37 schema
-rw-r--r--. 1 root root 4635 Sep 8 12:38 slapd.conf
-rw-r--r--. 1 root root 4635 Sep 8 12:38 slapd.conf.bak
drwx------. 3 ldap ldap 4096 Sep 8 12:37 slapd.d
drwx------. 3 ldap ldap 4096 Sep 8 12:37 slapd.d.bak2016-09-08
[root@ldapsrv01 openldap]# rm -rf /etc/openldap/slapd.d/* #删除原有的配置文件
[root@ldapsrv01 openldap]# slappasswd -s 123456 #生成openldap管理员的密码,稍后添加到slapd.conf文件中
{SSHA}jl5e9Ez5qn30Ur5sD74pXh8uDnRncmQN
[root@ldapsrv01 openldap]# vi slapd.conf #编辑slapd.conf文件
[root@ldapsrv01 ~]# egrep -v "#|^$" /etc/openldap/slapd.conf
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
allow bind_v2
pidfile/var/run/openldap/slapd.pid
argsfile/var/run/openldap/slapd.args
TLSCACertificatePath /etc/openldap/certs
TLSCertificateFile "\"OpenLDAP Server\""
TLSCertificateKeyFile /etc/openldap/certs/password
database config
access to * #数据库授权,这里只做测试使用
by self write
by anonymous auth
by * read
databasebdb
suffix"dc=contoso,dc=com" #设置域或组织的名称
rootdn"cn=admin,dc=contoso,dc=com" #管理员账号dn
rootpw {SSHA}jl5e9Ez5qn30Ur5sD74pXh8uDnRncmQN #管理员密码
directory/var/lib/ldap
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
loglevel 296 #设置日志级别,记录之日信息方便调试
checkpoint 2048 10 #设置把内存中的数据写回数据文件的操作,此处的设置表示每达到2048KB或10分钟执行一次checkpoint,即写入数据文件的操作
cachesize 1000 #设置ldap可以缓存的记录数
# 其中蓝色的部分是修改的地方,其他都不需要改动
四、配置rsyslog记录ldap日志
[root@ldapsrv01 openldap]# echo "local4.* /var/log/ldap.log" >>/etc/rsyslog.conf
[root@ldapsrv01 openldap]# tail -1 /etc/rsyslog.conf
local4* /var/log/ldap.log
[root@ldapsrv01 openldap]# service rsyslog restart
Shutting down system logger: [ OK ]
Starting system logger: [ OK ]
五、测试并启动openldap服务
[root@ldapsrv01 openldap]# ll /var/lib/ldap/
total 980
-rw-r--r--. 1 ldap ldap 2048 Sep 8 12:38 alock
-rw-------. 1 ldap ldap 24576 Sep 8 12:38 __db.001
-rw-------. 1 ldap ldap 188416 Sep 8 12:38 __db.002
-rw-------. 1 ldap ldap 270336 Sep 8 12:38 __db.003
-rw-------. 1 ldap ldap 98304 Sep 8 12:38 __db.004
-rw-------. 1 ldap ldap 753664 Sep 8 12:38 __db.005
-rw-------. 1 ldap ldap 32768 Sep 8 12:38 __db.006
-rw-------. 1 ldap ldap 8192 Sep 8 12:38 dn2id.bdb
-rw-------. 1 ldap ldap 32768 Sep 8 12:38 id2entry.bdb
-rw-------. 1 ldap ldap 10485760 Sep 8 12:38 log.0000000001
# 这就是生成的数据库文件,如果该目录下为空,则执行/etc/init.d/slapd start会自动生成。
[root@ldapsrv01 openldap]# slaptest -u #测试配置文件是否正确
config file testing succeeded
[root@ldapsrv01 openldap]# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
57d0ed14 bdb_db_open: warning - no DB_CONFIG file found in directory /var/lib/ldap: (2).
Expect poor performance for suffix "dc=contoso,dc=com".
57d0ed14 bdb_monitor_db_open: monitoring disabled; configure monitor database to enable
config file testing succeeded
# 重新生成/etc/openldap/slapd.d/目录下的文件
[root@ldapsrv01 openldap]# chown -R ldap:ldap /etc/openldap/slapd.d #将该目录授权给ldap用户
[root@ldapsrv01 openldap]# chmod -R 700 /etc/openldap/slapd.d
[root@ldapsrv01 openldap]# /etc/init.d/slapd restart
Stopping slapd: [FAILED]
Starting slapd: [ OK ]
[root@ldapsrv01 openldap]# ps -ef|grep ldap
ldap 1754 1 0 12:47 ? 00:00:00 /usr/sbin/slapd -h ldap:/// ldapi:/// -u ldap
root 1762 1487 0 12:47 pts/0 00:00:00 grep ldap
[root@ldapsrv01 openldap]# lsof -i :389
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
slapd 1754 ldap 7u IPv4 16168 0t0 TCP *:ldap (LISTEN)
slapd 1754 ldap 8u IPv6 16169 0t0 TCP *:ldap (LISTEN)
六、执行一个简单查询操作
[root@ldapsrv01 openldap]# ldapsearch -x -b "dc=contoso,dc=com"
# extended LDIF
#
# LDAPv3
# base <dc=contoso,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# search result
search: 2
result: 32 No such object
# numResponses: 1
返回结果32 No such object,因为我还没有创建任何账号或OU,下一篇进行数据的导入。
好吧,总结一下,还是用一个shell脚本来完成自动安装的任务。(这个脚本用了大概小一天的时间,还是有些不太满意的地方,时间关系,也只能以后回头完善了,Mark。)
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
#!/bin/bash
#############################################################
#Description: Openldap install script for CentOS 6.x #
#Tips: You will asked to input a valid domain name and set #
# password for the administrator in your domain. #
#Usage: bash openldap_install.sh #
#Author: Jerry Zhao #
#Date: 2016-09-09 14:19:49 Friday #
#############################################################
openldap_install(){
#检查openldap是否已经安装
ps
-ef|
grep
slapd |
grep
-
v
grep
>
/dev/null
[ $? -
eq
0 ] &&
echo
"Service slapd is running, exit now."
&&
exit
1
[ -x
/etc/init
.d
/slapd
] &&
echo
"Openldap was installed on this server, nothing will do."
&&
exit
1
#准备操作
[ -d
/etc/openldap
] &&
rm
-rf
/etc/openldap/
*
[ -d
/var/lib/ldap
] &&
rm
-rf
/var/lib/ldap/
*
echo
"*/5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1"
>>
/var/spool/cron/root
#配置yum源
mkdir
-p
/etc/yum
.repo.d
/bak_
$(
date
+%F)
mv
/etc/yum
.repo.d/*.*
/etc/yum
.repo.d
/bak_
$(
date
+%F) 2>
/dev/null
wget -q -O
/etc/yum
.repos.d
/CentOS-Base
.repo http:
//mirrors
.aliyun.com
/repo/Centos-6
.repo
yum clean all >
/dev/null
yum makecache >
/dev/null
#安装openldap软件包
yum -y
install
openldap openldap-servers openldap-clients openldap-devel 1>
/dev/null
2>
/dev/null
[ $? -
ne
0 ] &&
echo
"Install openldap package failed."
&&
exit
1 ||
echo
"Install openldap package successful."
#生成slapd.conf和DB_CONFIG文件
if
[ -d
/etc/openldap
];
then
[ ! -f
/usr/share/openldap-servers/slapd
.conf.obsolete ] &&
echo
"Can't find file /usr/share/openldap-servers/slapd.conf.obsolete."
&&
exit
1 ||
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
ldap:ldap
/var/lib/ldap/DB_CONFIG
cp
-a
/etc/openldap/slapd
.d
/etc/openldap/slapd
.d.bak$(
date
+%F)
else
echo
-e
"Directory [/etc/openldap] didn't found."
exit
1
fi
#检测slapd能否正常启动
/etc/init
.d
/slapd
start >
/dev/null
[ $? -
ne
0 ] &&
echo
"Service slapd start failed, please check your system."
&&
exit
1 ||
echo
"Service slapd start successful."
rm
-rf
/etc/openldap/slapd
.d/*
#编辑slapd.conf文件
while
[
"$PassWord"
==
""
];
do
read
-p
"Please input the password for the administrator in your domain:"
PassWord
done
slappasswd -s $PassWord |
sed
-s
's/^/rootpw /g'
>>
/etc/openldap/slapd
.conf
sed
-i
'/^checkpoint/s/^/#/'
/etc/openldap/slapd
.conf
sed
-i
's/Manager/admin/g'
/etc/openldap/slapd
.conf
sed
-i
"s/dc=my-domain,dc=com/$DomainCN/g"
/etc/openldap/slapd
.conf
echo
-e
"# add some settings on $(date +%F)\nloglevel 296\ncheckpoint 2048 10\ncachesize 1000\n"
>>
/etc/openldap/slapd
.conf
#配置rsyslog记录ldap日志
[ -f
/etc/rsyslog
.conf ] &&
cp
/etc/rsyslog
.conf
/etc/rsyslog
.conf.bak$(
date
+%F)
echo
'local4.* /var/log/ldap.log'
>>
/etc/rsyslog
.conf
/etc/init
.d
/rsyslog
restart >
/dev/null
[ $? -
ne
0 ] &&
echo
"Change settings of rsyslog failed."
&&
exit
1 ||
echo
"Change settings of rsyslog successful."
#启动slapd服务
slaptest -f
/etc/openldap/slapd
.conf -F
/etc/openldap/slapd
.d >
/dev/null
[ $? -
ne
0 ] &&
echo
"Slaptest with configure file failed."
&&
exit
1 ||
echo
"Slaptest with configure file successful."
chown
-R ldap:ldap
/etc/openldap/slapd
.d
chmod
-R 700
/etc/openldap/slapd
.d
chkconfig slapd on
/etc/init
.d
/slapd
restart >
/dev/null
lsof
-i :389 >
/dev/null
[ $? -
ne
0 ] &&
echo
"Start slapd service failed."
&&
exit
1 ||
echo
"Start slapd service successful."
&&
exit
0
}
while
true
;
do
read
-p
"Please input your domain name:"
DomainName
#检测用户输入的域名格式,如果为空则重新输入
if
[
"$DomainName"
!=
""
];
then
PotNum=`
echo
$DomainName |
awk
-
v
RS=.
'END{print --NR}'
`
#检测用户输入的域名格式,只能有1个或2个".",子域名的形式暂不考虑
case
$PotNum
in
1|2)
DomainKey1=`
echo
$DomainName |
awk
-F
"."
'{print $1}'
`
DomainKey2=`
echo
$DomainName |
awk
-F
"."
'{print $NF}'
`
#检测用户输入的域名格式,其中域名不能以.号开头和结尾,其实域名应该
#也不能以数字结尾,域名中只能包含-而不能包含其他特殊字符,但是这里的
#判断实在是不能尽善,所以只能简单的作了判断,留待以后再做改善
if
[[ -n $DomainKey1 && -n $DomainKey2 ]] ;
then
DomainCN=`
echo
$DomainName |
sed
's/\./,/g'
|
sed
's/^/dc=/g'
|
sed
's/,/,dc=/g'
`
openldap_install
else
echo
"Invalid domain name, the correct format should be like: a.com, a.com.cn,etc."
fi
;;
*)
echo
"Invalid domain name, the correct format should be like: a.com, a.com.cn,etc."
;;
esac
else
echo
-e
"DomainName can not be empty, please input again."
fi
done
|