环境

  • 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

写入:

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-admin

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/。

ldap-admin

禁用对OpenLDAP Server的匿名访问

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

ldap-admin

从等保安全要求来看,这是不符合等保安全要求的,可以使用下面的命令禁用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"

从打印出的命令输出来看,已经开启认证了,测试一下,已经无法匿名访问:

ldap-admin

参考