[toc]
openldap标准安装
ldap相关术语
Entry (or object) 条目(或对象):LDAP中的每个单元都认为是条目
dn:条目名称
ou:组织名称
dc:域组件,例如,baidu.com 是这样写的 dc=baidu,dc=com
cn:通用名称,如原文链接:https://www.baidu.com 名或某个对象的名字
安装openldap
系统环境
系统版本
$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
内核版本
$ uname -a
Linux pptfz 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
安装包
yum -y install openldap openldap-clients openldap-servers
查看版本
$ slapd -V
@(#) $OpenLDAP: slapd 2.4.44 (Feb 23 2022 17:11:27) $
mockbuild@x86-01.bsys.centos.org:/builddir/build/BUILD/openldap-2.4.44/openldap-2.4.44/servers/slapd
启动ldap
修改目录权限
/var/lib/ldap/ 目录以及目录下的所有文件所有者默认为 root ,需要设置为ldap用户所有
$ ll /var/lib/ldap/
total 372
-rw-r--r-- 1 root root 2048 Jun 6 13:21 alock
-rw------- 1 root root 303104 Jun 6 13:21 __db.001
-rw------- 1 root root 40960 Jun 6 13:21 __db.002
-rw------- 1 root root 49152 Jun 6 13:21 __db.003
-rw------- 1 root root 8192 Jun 6 13:21 dn2id.bdb
-rw------- 1 root root 32768 Jun 6 13:21 id2entry.bdb
-rw------- 1 root root 10485760 Jun 6 13:21 log.0000000001
否则在启动ldap服务的时候会报错如下
Jun 06 14:20:13 pptfz runuser[11314]: pam_unix(runuser:session): session opened for user ldap by (uid=0)
Jun 06 14:20:13 pptfz runuser[11314]: pam_unix(runuser:session): session closed for user ldap
Jun 06 14:20:13 pptfz check-config.sh[11293]: Read/write permissions for DB file '/var/lib/ldap/__db.003' are required.
Jun 06 14:20:13 pptfz runuser[11316]: pam_unix(runuser:session): session opened for user ldap by (uid=0)
Jun 06 14:20:13 pptfz runuser[11316]: pam_unix(runuser:session): session closed for user ldap
Jun 06 14:20:13 pptfz check-config.sh[11293]: Read/write permissions for DB file '/var/lib/ldap/__db.002' are required.
Jun 06 14:20:13 pptfz runuser[11318]: pam_unix(runuser:session): session opened for user ldap by (uid=0)
Jun 06 14:20:13 pptfz runuser[11318]: pam_unix(runuser:session): session closed for user ldap
Jun 06 14:20:13 pptfz check-config.sh[11293]: Read/write permissions for DB file '/var/lib/ldap/__db.001' are required.
Jun 06 14:20:13 pptfz runuser[11320]: pam_unix(runuser:session): session opened for user ldap by (uid=0)
Jun 06 14:20:13 pptfz runuser[11320]: pam_unix(runuser:session): session closed for user ldap
Jun 06 14:20:13 pptfz check-config.sh[11293]: Read/write permissions for DB file '/var/lib/ldap/dn2id.bdb' are required.
Jun 06 14:20:13 pptfz systemd[1]: slapd.service: control process exited, code=exited status=1
Jun 06 14:20:13 pptfz systemd[1]: Failed to start OpenLDAP Server Daemon.
chown -R ldap.ldap /var/lib/ldap/
启动并设置开机自启
systemctl enable slapd && systemctl start slapd
查看端口
ldap默认监听 tcp 389端口
$ netstat -ntpl|grep slapd
tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 16930/slapd
tcp6 0 0 :::389 :::* LISTEN 16930/slapd
查看进程
ldap默认以ldap用户启动
$ ps aux|grep slapd
ldap 16930 0.0 0.3 139712 12488 ? Ssl 14:38 0:00 /usr/sbin/slapd -u ldap -h ldapi:/// ldap:///
查看启动
$ systemctl status slapd
● slapd.service - OpenLDAP Server Daemon
Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2025-06-06 14:38:17 CST; 8min ago
Docs: man:slapd
man:slapd-config
man:slapd-hdb
man:slapd-mdb
file:///usr/share/doc/openldap-servers/guide.html
Main PID: 16930 (slapd)
CGroup: /system.slice/slapd.service
└─16930 /usr/sbin/slapd -u ldap -h ldapi:/// ldap:///
Jun 06 14:38:17 pptfz runuser[16919]: pam_unix(runuser:session): session opened for user ldap by (uid=0)
Jun 06 14:38:17 pptfz runuser[16919]: pam_unix(runuser:session): session closed for user ldap
Jun 06 14:38:17 pptfz runuser[16921]: pam_unix(runuser:session): session opened for user ldap by (uid=0)
Jun 06 14:38:17 pptfz runuser[16921]: pam_unix(runuser:session): session closed for user ldap
Jun 06 14:38:17 pptfz runuser[16923]: pam_unix(runuser:session): session opened for user ldap by (uid=0)
Jun 06 14:38:17 pptfz runuser[16923]: pam_unix(runuser:session): session closed for user ldap
Jun 06 14:38:17 pptfz slapd[16927]: @(#) $OpenLDAP: slapd 2.4.44 (Feb 23 2022 17:11:27) $
mockbuild@x86-01.bsys.centos.org:/builddir/build/BUILD/openldap-2.4.44/openldap-2.4.44/servers/slapd
Jun 06 14:38:17 pptfz slapd[16930]: hdb_db_open: warning - no DB_CONFIG file found in directory /var/lib/ldap: (2).
Expect poor performance for suffix "dc=my-domain,dc=com".
Jun 06 14:38:17 pptfz slapd[16930]: slapd starting
Jun 06 14:38:17 pptfz systemd[1]: Started OpenLDAP Server Daemon.
配置openldap
设置管理员密码
这里我们设置管理员密码为 admin ,执行命令后会生成一堆加密后的字符,记录好,之后配置文件里会需要的
$ slappasswd -s admin
{SSHA}uUFY4EJIccmbnIZBPMiq06QK4HG9vO/a
ldap相关命令连接ldap不同方式说明
-H ldap:// 与 -H ldapi:/// 的对比说明
| 形式 | 协议类型 | 说明 | 用途场景 |
|---|---|---|---|
-H ldap://localhost | TCP 明文协议 | 使用标准 TCP/IP 连接,默认端口是 389 | 本地或远程连接,适合大多数情况 |
-H ldapi:/// | UNIX 域套接字 | 使用本地 Unix Socket 文件(如 /var/run/ldapi) | 本机内部通信,权限更精细更安全 |
-H ldap://localhost
- 使用标准 LDAP 协议,通过 TCP 端口(通常是 389)。
- 可以连接到本机或远程服务器。
- 明文传输(不加密),如需加密应使用
ldaps://或 StartTLS。 - 通常需要用户名/密码进行身份验证。
示例
ldapsearch -H ldap://localhost -D "cn=admin,dc=ops,dc=com" -w admin ...
-H ldapi:///
- 使用 本地 UNIX socket(LDAP over IPC)。
- 不需要走网络,连接速度更快、更安全。
- 可以使用本地用户凭据自动认证(如
EXTERNAL机制)。 - 通常只允许
root或ldap用户访问 socket 文件。
示例(使用 EXTERNAL 本地认证)
ldapsearch -H ldapi:/// -Y EXTERNAL -b cn=config
附加说明 ldaps://
如果希望使用 加密的 TCP 连接,可以使用如下方式,这是使用 SSL 加密的 LDAP 连接,默认端口是 636
-H ldaps://localhost
修改相关配置文件
修改 /etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif
/etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif 文件默认内容如下
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 2d0f9516
dn: olcDatabase={2}hdb
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=my-domain,dc=com
olcRootDN: cn=Manager,dc=my-domain,dc=com
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
structuralObjectClass: olcHdbConfig
entryUUID: aac2ae46-d6e1-103f-960a-2797f63ca3bd
creatorsName: cn=config
createTimestamp: 20250606052012Z
entryCSN: 20250606052012.864229Z#000000#000#000000
modifiersName: cn=config
需要修改的是 olcSuffix 、olcRootDN 这2个字段
修改如下两行
olcSuffix: dc=my-domain,dc=com
olcRootDN: cn=Manager,dc=my-domain,dc=com
修改为
olcSuffix: dc=ops,dc=com
olcRootDN: cn=admin,dc=ops,dc=com
还需要新增一行配置,是在执行 slappasswd -s admin 后生成的字符串
olcRootPW: {SSHA}uUFY4EJIccmbnIZBPMiq06QK4HG9vO/a
修改ldap的相关文件不要使用命令手动编辑,在开头也会有 # AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify. 的相关提示,正确的方式是先创建 *.ldif 文件,然后使用 ldapmodify 命令进行修改
创建 modify-olcDatabase={2}hdb.ldif 文件,用来修改 /etc/openldap/slapd.d/cn\=config/olcDatabase={2}hdb.ldif 文件中的 olcSuffix 、olcRootDN 字段
cat >> modify-olcDatabase={2}hdb.ldif << EOF
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=ops,dc=com
-
replace: olcRootDN
olcRootDN: cn=admin,dc=ops,dc=com
EOF
创建 add-rootpw.ldif 文件,用来新增 /etc/openldap/slapd.d/cn\=config/olcDatabase={2}hdb.ldif 文件中的 olcRootPW 字段
如果该字段已经存在,请将 add: 改为 replace:,否则会报错 type or value exists
cat >> add-rootpw.ldif << EOF
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}uUFY4EJIccmbnIZBPMiq06QK4HG9vO/a
EOF
执行修改命令,修改 /etc/openldap/slapd.d/cn\=config/olcDatabase={2}hdb.ldif 文件中的 olcSuffix 、olcRootDN 字段
$ ldapmodify -Y EXTERNAL -H ldapi:/// -f modify-olcDatabase\=\{2\}hdb.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}hdb,cn=config"
执行修改命令,新增 /etc/openldap/slapd.d/cn\=config/olcDatabase={2}hdb.ldif 文件中的 olcRootPW 字段
$ ldapmodify -Y EXTERNAL -H ldapi:/// -f add-rootpw.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}hdb,cn=config"
修改完成后查看 /etc/openldap/slapd.d/cn\=config/olcDatabase={2}hdb.ldif 文件,可以看到 olcSuffix 、olcRootDN 2个字段的内容已经修改完成,并且增加了 olcRootPW 字段
$ cat /etc/openldap/slapd.d/cn\=config/olcDatabase={2}hdb.ldif
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 ed206214
dn: olcDatabase={2}hdb
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {2}hdb
olcDbDirectory: /var/lib/ldap
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
structuralObjectClass: olcHdbConfig
entryUUID: aac2ae46-d6e1-103f-960a-2797f63ca3bd
creatorsName: cn=config
createTimestamp: 20250606052012Z
olcSuffix: dc=ops,dc=com
olcRootDN: cn=admin,dc=ops,dc=com
olcRootPW:: e1NTSEF9dVVGWTRFSkljY21ibklaQlBNaXEwNlFLNEhHOXZPL2E=
entryCSN: 20250606074044.181696Z#000000#000#000000
modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
modifyTimestamp: 20250606074044Z
修改 /etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif
修改如下两行
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth" read by dn.base="cn=Manager,dc=my-domain,dc=com" read by * none
修改为
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth" read by dn.base="cn=admin,dc=pptfz,dc=com" read by * none
创建 modify-olcDatabase={1}monitor.ldif 文件,用来修改 /etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif 中的 olcAccess 字段
cat >> modify-olcDatabase={1}monitor.ldif << EOF
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=admin,dc=ops,dc=com" read by * none
EOF
执行修改命令,用来修改 /etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif 中的 olcAccess 字段
$ ldapmodify -Y EXTERNAL -H ldapi:/// -f modify-olcDatabase={1}monitor.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"
修改完成后查看 /etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif 文件,可以看到 olcAccess 字段已经修改完成
$ cat /etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 1b0d56c2
dn: olcDatabase={1}monitor
objectClass: olcDatabaseConfig
olcDatabase: {1}monitor
structuralObjectClass: olcDatabaseConfig
entryUUID: aac2aad6-d6e1-103f-9609-2797f63ca3bd
creatorsName: cn=config
createTimestamp: 20250606052012Z
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth" read by dn.base="cn=admin,dc=ops,dc=com" read by * none
entryCSN: 20250606084306.464998Z#000000#000#000000
modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
modifyTimestamp: 20250606084306Z