部署OpenLdap

本文主要介绍openldap的部署和go-ldap-admin的配置方法

1.部署Ldap

这里我们使用由VMware维护的项目:https://hub.docker.com/r/bitnami/openldap

1
2
3
4
# 安装
docker pull bitnami/openldap:2.6.8;
docker volume create vo-ldap;
docker run -dit --restart=always -p 389:1389 -p 636:1636 -v vo-ldap:/bitnami/openldap/ -e LDAP_ENABLE_TLS=no -e LDAP_ADMIN_USERNAME="admin" -e LDAP_ADMIN_PASSWORD="ldap_admin密码" -e LDAP_ROOT="dc=xxxx,dc=com" -e LDAP_ADMIN_DN="cn=admin,dc=xxxx,dc=com" -e LDAP_USERS=demo_user -e LDAP_PASSWORDS=demo_PWD3 -e LDAP_USER_DC=people -e LDAP_PASSWORD_HASH="{SSHA}" --name openldap bitnami/openldap:2.6.8;

注意,

  1. LDAP_USER_DC需要使用people,不要修改。原因是下面的go-ldap-admin默认使用people
  2. LDAP_PASSWORD_HASH使用SSHA,其实默认的也是SSHA,可以不必指定
  3. LDAP_ADMIN_USERNAME,指定admin,不要修改,原因是下面的go-ldap-admin可能无法兼容
  4. 这里没有配置TLS加密,考虑到ldap本身的弱安全性,且ldap通常配置在企业内网,这里就不提高复杂度了。

2.部署管理端

这里我们使用go-ldap-admin这个项目,相比phpAdmin更好用。
同时,我们的核心诉求是为用户提供自定义修改密码的能力。

官方站点:https://ldapdoc.eryajf.net/
官方GitHubhttps://github.com/eryajf/go-ldap-admin
官方DockerHubhttps://hub.docker.com/r/eryajf/go-ldap-admin/tags

2.1.部署go-ldap-admin

1
2
3
docker volume create vo-go-ldap-admin;
docker pull eryajf/go-ldap-admin:2024-06-07_14-49;
docker run -dit --restart=always -p 18888:8888 -v vo-go-ldap-admin:/app -e DB_DRIVER=mysql -e MYSQL_HOST=你的mysql地址 -e MYSQL_PORT=你的mysql端口 -e MYSQL_USERNAME=你的mysql账号 -e MYSQL_PASSWORD=你的mysql密码 -e MYSQL_DATABASE=你的mysqldb -e LDAP_URL=ldap://你的ldap地址:389 -e LDAP_BASE_DN="dc=xxxx,dc=com" -e LDAP_ADMIN_DN="cn=admin,dc=xxxx,dc=com" -e LDAP_ADMIN_PASS="ldap的admin密码" -e LDAP_USER_DN="ou=people,dc=xxxx,dc=com" -e LDAP_USER_INIT_PASSWORD="默认所有ldap用户的密码,例如123456" -e LDAP_DEFAULT_EMAIL_SUFFIX="xxxx.com" -e LDAP_USER_PASSWORD_ENCRYPTION_TYPE="ssha" eryajf/go-ldap-admin:2024-06-07_14-49

2.2.核心参数说明

核心要配置三类参数:

  1. 关联的ldap基础信息
  2. MySQL信息
  3. 第三方账号同步的accessKey(例如钉钉、企微、飞书)
    ldap信息和mysql信息已经通过docker运行时环境变量进行了配置。
    而第三方信息,由于原作者没有写docker环境变量,所以目前只能修改config.yml文件参数,基本参数如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
dingtalk:
# 配置获取详细文档参考: http://ldapdoc.eryajf.net/pages/94f43a/
flag: "dingtalk" # 作为钉钉在平台的标识
app-key: "xxxxxxxxxxxxxxx" # 应用的key
app-secret: "xxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 应用的secret
agent-id: "12121212" # 目前agent-id未使用到,可忽略
enable-sync: false # 是否开启定时同步钉钉的任务
dept-sync-time: "0 30 2 * * *" # 部门同步任务的时间点 * * * * * * 秒 分 时 日 月 周, 请把时间设置在凌晨 1 ~ 5 点
user-sync-time: "0 30 3 * * *" # 用户同步任务的时间点 * * * * * * 秒 分 时 日 月 周, 请把时间设置在凌晨 1 ~ 5 点,注意请把用户同步的任务滞后于部门同步时间,比如部门为2点,则用户为3点
dept-list: # 配置要同步的部门列表,配置留空则同步所有部门,在开头加^表示不同步此部门
#- "48456726" # 需要同步的部门ID
#- "^61213417" # 不需要同步的部门ID
is-update-syncd: false # 当钉钉用户的邮箱,手机号,部门等信息更新之后,是否同步更新,默认为false,如果你不了解这个字段的含义,则不建议开启
user-leave-range: 0 #按配置天数查离职时间范围内的用户,为0时不限制

config.yml文件已经通过volume vo-go-ldap-admin映射到本地,可以动过docker volume inspect vo-go-ldap-admin找到目录,并修改config.yml

2.3.核心操作

你需要如何几个操作:

  1. 手动同步三方(钉钉/企微/飞书)根节点到ldap
  2. 修改用户信息的字段映射。因为当前项目是将用户名的拼音作为userName,这可能会出现异常,请根据你的实际情况修改,推荐custom_nickname_org_email,也就是邮箱前缀
  3. 再同步账户信息

手动同步根节点,如下图,如果你看不见同步按钮,多刷新几次页面就出来了
手动同步根节点
修改字段映射,如下图,推荐custom_nickname_org_email,也就是邮箱前缀:
修改用户字段映射
最终,在用户管理里同步用户信息到ldap:
同步用户

2.4.常见问题

2.4.1.同步部门报错

报错:DsyncDingTalkDepts添加部门失败: 添加部门: caiwu, 失败: LDAP Result Code 32 No Such Object,这是因为ldap里没有部门根节点,需要参照2.3.核心操作里,先同步部门

2.4.2.同步用户报错

一般报错是No Such Object,这是因为go-ldap-admin这个项目的用户同步ou是people,需要在ldap服务器里配置,或者参照第一步部署ldap服务时的参数配置1.部署Ldap里,配置LDAP_USER_DCpeople


参考资料:

  1. bitnami/openldaphttps://hub.docker.com/r/bitnami/openldap
  2. 我花了一个五一终于搞懂了OpenLDAPhttps://segmentfault.com/a/1190000014683418
  3. 捋透openLDAP的基础概念https://ldapdoc.eryajf.net/pages/17ba17/#前言
  4. Go-Ldap-Adminhttps://ldapdoc.eryajf.net/pages/17ba17/#前言