OpenLDAP 容器部署以及双节点镜像复制配置

1,079 阅读3分钟

经过反复比较,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 客户端分别连接两台服务器,在其中一台增加项目,看另一台是不是同步出现,反过来再试一次。