OpenLDAP 2.4部署记录
2017-05-07
环境 #
- CentOS 7.3 192.168.61.100
禁用selinux
1setenforce 0
2
3vi /etc/selinux/config
4SELINUX=disabled
安装和配置 #
安装并启动服务 #
安装:
1yum install openldap openldap-servers openldap-clients
拷贝数据库配置文件:
1cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
2chown ldap:ldap /var/lib/ldap/DB_CONFIG
DB_CONIFG
中主要是关于Berkeley DB的相关的一些配置
启动OpenLDAP Server:
1systemctl start slapd
2systemctl enable slapd
3systemctl status slapd
slapd即standard alone ldap daemon,该进程默认监听389端口
设置root用户密码 #
先用一个命令生成一个LDAP管理用户root密码。
1slappasswd
2New password:
3Re-enter new password:
4{SSHA}krOGXDmiCdSXuXocOf10F96LJO5ijdXo
上面输出的hash之后的密码注意保存一份
新建一个rootpwd.ldif(名称是自定义的)的文件:
1vi rootpwd.ldif
2
3dn: olcDatabase={0}config,cn=config
4changetype: modify
5add: olcRootPW
6olcRootPW: {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:
1ldapadd -Y EXTERNAL -H ldapi:/// -f rootpwd.ldif
2SASL/EXTERNAL authentication started
3SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
4SASL SSF: 0
5modifying entry "olcDatabase={0}config,cn=config"
导入schema #
导入schema,schema包含为了支持特殊场景相关的属性,可根据选择导入,这里先全部导入:
1ls /etc/openldap/schema/*.ldif | while read f; do ldapadd -Y EXTERNAL -H ldapi:/// -f $f; done
设定默认域 #
先使用slappasswd生成一个密码:
1slappasswd
2New password:
3Re-enter new password:
4{SSHA}OpMcf0c+pEqFLZm3i+YiI2qhId1G/yM3
新建一个domain.ldif的文件:
1vi domain.ldif
2
3dn: olcDatabase={1}monitor,cn=config
4changetype: modify
5replace: olcAccess
6olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
7 read by dn.base="cn=Manager,dc=frognew,dc=com" read by * none
8
9dn: olcDatabase={2}hdb,cn=config
10changetype: modify
11replace: olcSuffix
12olcSuffix: dc=frognew,dc=com
13
14dn: olcDatabase={2}hdb,cn=config
15changetype: modify
16replace: olcRootDN
17olcRootDN: cn=Manager,dc=frognew,dc=com
18
19
20dn: olcDatabase={2}hdb,cn=config
21changetype: modify
22add: olcRootPW
23olcRootPW: {SSHA}OpMcf0c+pEqFLZm3i+YiI2qhId1G/yM3
24
25
26dn: olcDatabase={2}hdb,cn=config
27changetype: modify
28add: olcAccess
29olcAccess: {0}to attrs=userPassword,shadowLastChange by
30 dn="cn=Manager,dc=frognew,dc=com" write by anonymous auth by self write by * none
31olcAccess: {1}to dn.base="" by * read
32olcAccess: {2}to * by dn="cn=Manager,dc=frognew,dc=com" write by * read
olcAccess
即access,该key用于指定目录的ACL即谁有什么权限可以存取什么olcRootDN
设定管理员root用户的distingush name- 注意替换上面文件内容中cn为具体的域信息
- olcRootPW用上面新生成的密码替换
写入:
1ldapmodify -Y EXTERNAL -H ldapi:/// -f domain.ldif
2SASL/EXTERNAL authentication started
3SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
4SASL SSF: 0
5modifying entry "olcDatabase={1}monitor,cn=config"
6
7modifying entry "olcDatabase={2}hdb,cn=config"
8
9modifying entry "olcDatabase={2}hdb,cn=config"
10
11modifying entry "olcDatabase={2}hdb,cn=config"
12
13modifying entry "olcDatabase={2}hdb,cn=config"
添加基本目录 #
新建一个basedomain.ldif的文件:
1dn: dc=frognew,dc=com
2objectClass: top
3objectClass: dcObject
4objectclass: organization
5o: frognew org
6dc: frognew
7
8dn: cn=Manager,dc=frognew,dc=com
9objectClass: organizationalRole
10cn: Manager
11description: Directory Manager
12
13dn: ou=People,dc=frognew,dc=com
14objectClass: organizationalUnit
15ou: People
16
17dn: ou=Group,dc=frognew,dc=com
18objectClass: organizationalUnit
19ou: Group
- 注意替换上面文件内容中dn为具体的域信息
- 理解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
- DC即Domain Component,LDAP目录类似文件系统目录
写入:
1ldapadd -x -D cn=Manager,dc=frognew,dc=com -W -f basedomain.ldif
2Enter LDAP Password:
3adding new entry "dc=frognew,dc=com"
4
5adding new entry "cn=Manager,dc=frognew,dc=com"
6
7adding new entry "ou=People,dc=frognew,dc=com"
8
9adding new entry "ou=Group,dc=frognew,dc=com"
会要求输入当前目录管理员用户的密码
测试 #
可以使用ldapsearch在服务器上测试:
1ldapsearch -LLL -W -x -D "cn=Manager,dc=frognew,dc=com" -H ldap://localhost -b "dc=frognew,dc=com"
2Enter LDAP Password:
3dn: dc=frognew,dc=com
4objectClass: top
5objectClass: dcObject
6objectClass: organization
7o: frognew org
8dc: frognew
9
10dn: cn=Manager,dc=frognew,dc=com
11objectClass: organizationalRole
12cn: Manager
13description: Directory Manager
14
15dn: ou=People,dc=frognew,dc=com
16objectClass: organizationalUnit
17ou: People
18
19dn: ou=Group,dc=frognew,dc=com
20objectClass: organizationalUnit
21ou: Group
管理工具 #
ldapadmin #
可以在局域网内的windows电脑上下载ldapadmin作为管理工具。
LDAP Account Manager #
LDAP Account Manager(LAM)是一个基于PHP Web应用的 LADP管理工具。 具体的安装过程可以参考LDAP Account Manager - Manual。 这里使用aexoti/lam这个Docker镜像快速体验一下。
1docker pull aexoti/lam
2
3docker 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:
1serverURL: ldap://192.168.61.100:389
2admins: cn=Manager,dc=frognew,dc=com
3treesuffix: dc=frognew,dc=com
4activeTypes: user,group
5types: suffix_user: ou=People,dc=frognew,dc=com
6types: suffix_group: ou=Group,dc=frognew,dc=com
重启docker容器使配置生效:
1docker restart ldap-lam
在浏览器中打开http://192.168.61.100:8011/lam/。
禁用对OpenLDAP Server的匿名访问 #
按以上步骤部署完成的OpenLDAP Server默认是可以被匿名访问的,而且可以查看目录下除了密码信息以外的所有用户信息。
从等保安全要求来看,这是不符合等保安全要求的,可以使用下面的命令禁用OpenLDAP的匿名访问:
创建disable_anon.ldif文件:
1dn: cn=config
2changetype: modify
3add: olcDisallows
4olcDisallows: bind_anon
5
6dn: cn=config
7changetype: modify
8add: olcRequires
9olcRequires: authc
10
11dn: olcDatabase={-1}frontend,cn=config
12changetype: modify
13add: olcRequires
14olcRequires: authc
使用ldapadd命令导入disable_anon.ldif:
1ldapadd -Y EXTERNAL -H ldapi:/// -f disable_anon.ldif
2
3SASL/EXTERNAL authentication started
4SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
5SASL SSF: 0
6modifying entry "cn=config"
7
8modifying entry "cn=config"
9
10modifying entry "olcDatabase={-1}frontend,cn=config"
从打印出的命令输出来看,已经开启认证了,测试一下,已经无法匿名访问: