【注意】最后更新于 May 7, 2017,文中内容可能已过时,请谨慎使用。
环境
- CentOS 7.3 192.168.61.100
禁用selinux
1
2
3
4
|
setenforce 0
vi /etc/selinux/config
SELINUX=disabled
|
安装和配置
安装并启动服务
安装:
1
|
yum install openldap openldap-servers openldap-clients
|
拷贝数据库配置文件:
1
2
|
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap:ldap /var/lib/ldap/DB_CONFIG
|
DB_CONIFG
中主要是关于Berkeley DB的相关的一些配置
启动OpenLDAP Server:
1
2
3
|
systemctl start slapd
systemctl enable slapd
systemctl status slapd
|
slapd即standard alone ldap daemon,该进程默认监听389端口
设置root用户密码
先用一个命令生成一个LDAP管理用户root密码。
1
2
3
4
|
slappasswd
New password:
Re-enter new password:
{SSHA}krOGXDmiCdSXuXocOf10F96LJO5ijdXo
|
上面输出的hash之后的密码注意保存一份
新建一个rootpwd.ldif(名称是自定义的)的文件:
1
2
3
4
5
6
|
vi rootpwd.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}krOGXDmiCdSXuXocOf10F96LJO5ijdXo
|
- ldif即LDAP Data Interchange Format,是LDAP中数据交换的一种文件格式。文件内容采用的是key-value形式,注意value后面不能有空格。
- 上面内容中
dn
即distingush name
olc
即Online Configuration,表示写入LDAP后不需要重启即可生效
changetype: modify
表示修改一个entry,changetype
的值可以是add
,delete
, modify
等。
add: olcRootPW
表示对这个entry新增了一个olcRootPW
的属性
olcRootPW: {SSHA}krOGXDmiCdSXuXocOf10F96LJO5ijdXo
指定了属性值
下面使用ldapadd命令将上面的rootpwd.ldif文件写入LDAP:
1
2
3
4
5
|
ldapadd -Y EXTERNAL -H ldapi:/// -f rootpwd.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"
|
导入schema
导入schema,schema包含为了支持特殊场景相关的属性,可根据选择导入,这里先全部导入:
1
|
ls /etc/openldap/schema/*.ldif | while read f; do ldapadd -Y EXTERNAL -H ldapi:/// -f $f; done
|
设定默认域
先使用slappasswd生成一个密码:
1
2
3
4
|
slappasswd
New password:
Re-enter new password:
{SSHA}OpMcf0c+pEqFLZm3i+YiI2qhId1G/yM3
|
新建一个domain.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
30
31
32
|
vi domain.ldif
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
read by dn.base="cn=Manager,dc=frognew,dc=com" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=frognew,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=frognew,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}OpMcf0c+pEqFLZm3i+YiI2qhId1G/yM3
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
dn="cn=Manager,dc=frognew,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=frognew,dc=com" write by * read
|
olcAccess
即access,该key用于指定目录的ACL即谁有什么权限可以存取什么
olcRootDN
设定管理员root用户的distingush name
- 注意替换上面文件内容中cn为具体的域信息
- olcRootPW用上面新生成的密码替换
写入:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
ldapmodify -Y EXTERNAL -H ldapi:/// -f domain.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}monitor,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
|
添加基本目录
新建一个basedomain.ldif的文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
dn: dc=frognew,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: frognew org
dc: frognew
dn: cn=Manager,dc=frognew,dc=com
objectClass: organizationalRole
cn: Manager
description: Directory Manager
dn: ou=People,dc=frognew,dc=com
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=frognew,dc=com
objectClass: organizationalUnit
ou: Group
|
- 理解dn,cn,dc
- DC即Domain Component,LDAP目录类似文件系统目录
dc=frognew,dc=com
相当于/com/frognew
- CN即Common Name,CN有可能代表一个用户名,例如
cn=Manager,dc=frognew,dc=com
表示在/com/frognew
域下的管理员用户Manager
- OU即Organizational Unit,例如
ou=People,dc=frognew,dc=com
表示在/com/frognew
域下的一个组织单元People
写入:
1
2
3
4
5
6
7
8
9
|
ldapadd -x -D cn=Manager,dc=frognew,dc=com -W -f basedomain.ldif
Enter LDAP Password:
adding new entry "dc=frognew,dc=com"
adding new entry "cn=Manager,dc=frognew,dc=com"
adding new entry "ou=People,dc=frognew,dc=com"
adding new entry "ou=Group,dc=frognew,dc=com"
|
会要求输入当前目录管理员用户的密码
测试
可以使用ldapsearch在服务器上测试:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
ldapsearch -LLL -W -x -D "cn=Manager,dc=frognew,dc=com" -H ldap://localhost -b "dc=frognew,dc=com"
Enter LDAP Password:
dn: dc=frognew,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: frognew org
dc: frognew
dn: cn=Manager,dc=frognew,dc=com
objectClass: organizationalRole
cn: Manager
description: Directory Manager
dn: ou=People,dc=frognew,dc=com
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=frognew,dc=com
objectClass: organizationalUnit
ou: Group
|
管理工具
ldapadmin
可以在局域网内的windows电脑上下载ldapadmin作为管理工具。

LDAP Account Manager
LDAP Account Manager(LAM)是一个基于PHP Web应用的 LADP管理工具。
具体的安装过程可以参考LDAP Account Manager - Manual。
这里使用aexoti/lam这个Docker镜像快速体验一下。
1
2
3
|
docker pull aexoti/lam
docker run -v /var/lib/ldap/lam:/var/lib/ldap-account-manager/config -p 8011:80 -d --name ldap-lam aexoti/lam
|
修改/var/lib/ldap/lam/lam.conf:
1
2
3
4
5
6
|
serverURL: ldap://192.168.61.100:389
admins: cn=Manager,dc=frognew,dc=com
treesuffix: dc=frognew,dc=com
activeTypes: user,group
types: suffix_user: ou=People,dc=frognew,dc=com
types: suffix_group: ou=Group,dc=frognew,dc=com
|
重启docker容器使配置生效:
1
|
docker restart ldap-lam
|
在浏览器中打开http://192.168.61.100:8011/lam/。

禁用对OpenLDAP Server的匿名访问
按以上步骤部署完成的OpenLDAP Server默认是可以被匿名访问的,而且可以查看目录下除了密码信息以外的所有用户信息。

从等保安全要求来看,这是不符合等保安全要求的,可以使用下面的命令禁用OpenLDAP的匿名访问:
创建disable_anon.ldif文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
dn: cn=config
changetype: modify
add: olcDisallows
olcDisallows: bind_anon
dn: cn=config
changetype: modify
add: olcRequires
olcRequires: authc
dn: olcDatabase={-1}frontend,cn=config
changetype: modify
add: olcRequires
olcRequires: authc
|
使用ldapadd命令导入disable_anon.ldif:
1
2
3
4
5
6
7
8
9
10
|
ldapadd -Y EXTERNAL -H ldapi:/// -f disable_anon.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
modifying entry "cn=config"
modifying entry "olcDatabase={-1}frontend,cn=config"
|
从打印出的命令输出来看,已经开启认证了,测试一下,已经无法匿名访问:

参考