经过反复比较,OpenLDAP 在现阶段仍然是更优于 389ds 的选择。389ds 很多自认为「安全」的默认与强制设置,会给用户造成不必要的麻烦。相比于编译安装、源安装,我更推荐大家使用容器进行 OpenLDAP 的部署。
OpenLDAP 官方并没有提供容器镜像,也没有容器部署的范例。但是幸好 VMware 的团队 bitnami 制作了非常好用的镜像封装,并且给出了详细的使用说明。在此基础上,我们就可以容器化部署 OpenLDAP 了。
容器部署
首先准备两台服务器,装好 Docker,然后通过 docker-compose 拉起服务,两台服务器使用同样的文件:
name: ldap
services:
openldap:
image: bitnami/openldap:2.6.8
restart: always
ports:
- 389:1389
- 636:1636
volumes:
- ./data:/bitnami/openldap
environment:
- LDAP_ADMIN_USERNAME=admin
- LDAP_ADMIN_PASSWORD=1qaz@WSX3edc
- LDAP_CONFIG_ADMIN_ENABLED=yes
- LDAP_CONFIG_ADMIN_USERNAME=admin
- LDAP_CONFIG_ADMIN_PASSWORD=1qaz@WSX3edc
- LDAP_ROOT=dc=nocts,dc=io
- LDAP_ENABLE_SYNCPROV=yes
这里我提供的是最小可能的配置,目前的 docker compose 不再需要 version 字段,并且建议写上 name 这个顶级字段。services 部分注意以下几点:
- volumes 挂载,最好不要用 docker volume,而是选择一个本地目录进行挂载,这样方便我们后面往里面写配置。本地目录需要
chown 1001:1001 ./data,将所属权赋给 1001 这个 UID。 - 两项 PASSWORD,根据自己需要修改。
- LDAP_ROOT,就是根 dc,根据自己需要修改。
- 最后一行 SYNCPROV 必须打开,否则不能镜像复制。如果只是跑单机,可以删除。
容器拉起后,使用 LDAP 客户端工具,比如 Apache Directory Studio,连接测试。本示例中连接的管理员凭据是 cn=admin,dc=nocts,dc=io,即管理员是建在根 dc 上的。
配置镜像复制
准备配置文件
首先准备三个 ldif 文件,将这三个文件都保存在挂载目录里(本例为 ./data)。
首先是 mod_syncprov.ldif,用来加载 syncprov.so 模块。
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /opt/bitnami/openldap/lib/openldap
olcModuleLoad: syncprov.so
然后是 syncprov.ldif,用来设置 syncprov 的参数。
dn: olcOverlay=syncprov,olcDatabase={2}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpCheckpoint: 100 10
olcSpSessionLog: 100
最后是 mirror.ldif,配置镜像对象。
#unlimit fetch size
dn: cn=config
changetype: modify
add: olcSizeLimit
olcSizeLimit: 10000
# set server id (ldap-1: 100, ldap-2: 200)
dn: cn=config
changetype: modify
add: olcServerID
olcServerID: 100
# syncrepl directive
dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
provider=ldap://ldap-1.nocts.io:389
bindmethod=simple
binddn="cn=admin,dc=nocts,dc=io"
credentials=1qaz@WSX3edc
searchbase="dc=nocts,dc=io"
scope=sub
schemachecking=on
attrs="*,+"
type=refreshAndPersist
retry="30 5 300 3"
interval=00:00:05:00
-
add: olcMirrorMode
olcMirrorMode: TRUE
注意在 mirror.ldif 中修改以下项:
- olcServerID,两台服务器必须不相同
- provider,对端的 ldap 服务器地址,可以用域名,也可以直接写 IP 地址
- binddn,管理员的 dn
- credentials,管理员的密码
- searchbase,即根 dc
应用配置文件
进入容器命令行:
docker exec -it ldap-openldap-1 bash
在容器命令行下,继续执行以下命令,每条 ldapadd 后面会提示输入管理员密码。之后用 slapcat 检查相关配置是否已经生效。
cd /bitnami/openldap/
ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif -W
ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov.ldif -W
ldapadd -Y EXTERNAL -H ldapi:/// -f mirror.ldif -W
slapcat -F /opt/bitnami/openldap/etc/slapd.d -b cn=config
exit
注意两台服务器都要操作。之后重启服务:
docker compose restart
验证
用 LDAP 客户端分别连接两台服务器,在其中一台增加项目,看另一台是不是同步出现,反过来再试一次。