Go-Ldap-Admin | openLDAP 同步钉钉、企业微信、飞书组织架构实践和部分小坑

目录

一、Docker-compose快速拉起demo测试环境

二、原生部署流程

安装MySQL:5.7数据库

安装openLDAP

修改域名,新增con.ldif

创建一个组织

安装OpenResty

下载后端

下载前端

部署后端

部署前端

三、管理动态字段

钉钉

企业微信

飞书

四、部分报错


Go-Ldap-Admin官网:Go-Ldap-Admin

本文用于记录整个安装部署过程以及过程中遇到的坑。
首先准备一台干净的服务器,配置最好不低于2C4G,当然如果MySQL不在本机部署,那可以将配置降为1C2G。(CentOS7)我也不喜欢用这玩意儿,但是官网是按照这个来的。


一、Docker-compose快速拉起demo测试环境

仅仅是一个测试用的demo环境!不支持IM以进行数据同步。

docker和docker-compose默认你有,端口映射情况:

|---------------|-----------------------|
| Service | Port(宿主机端口:容器端口) |
| MySQL | 3307:3306 |
| openLDAP | 389:389 |
| phpldapadmin | 8091:80 |
| go-ldap-admin | 8090:80,8888:8888 |

拉取:

bash 复制代码
git clone https://github.com/eryajf/go-ldap-admin.git

进入到docker-compose目录之后,目录层级与内容如下:

bash 复制代码
tree -N docker-compose
docker-compose
├── config
│   ├── init.ldif
│   └── my.cnf
└── docker-compose.yaml

1 directory, 3 files

拉起:

bash 复制代码
cd docs/docker-compose
docker-compose up -d

当看到容器都正常运行之后,可以在本地进行访问:http://localhost:8090,用户名/密码:admin/123456
如果想要访问PhpLdapAdmin,则可访问:http://localhost:8091,用户名/密码:cn=admin,dc=eryajf,dc=net/123456

注意:这里有个小坑,在此测试环境中是无法进行钉钉等应用架构同步的,报错如下:

41001: access_token missing, hint: [1681804729372880375054761], from ip: *, more info at https://open.work.weixin.qq.com/devtool/query?e=41001

直到看见作者在GitHub的评论才知道是不支持。


二、原生部署流程

随手关一下:

bash 复制代码
systemctl disable firewalld.service --now

安装MySQL:5.7数据库

俺也没试过8.0,官网建议使用5.7。

由于CentOS的yum源中没有mysql,需要到mysql的官网下载yum repo配置文件:

bash 复制代码
wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm

然后进行repo的安装:

bash 复制代码
rpm -ivh mysql80-community-release-el7-5.noarch.rpm

根据自己的需要,关闭,或者开启想要的版本:

bash 复制代码
# 关闭8.0
yum-config-manager --disable mysql80-community

# 开启5.7
yum-config-manager --enable mysql57-community

开始安装:

bash 复制代码
yum install mysql-server -y

Mysql,启动!

bash 复制代码
systemctl start mysqld

第一次登录查看临时密码:

bash 复制代码
grep 'temporary password' /var/log/mysqld.log

登录后对密码进行修改:

bash 复制代码
alter user 'root'@'localhost' identified by 'Abc@1234';

随手执行一下:

sql 复制代码
use mysql;
update user set host = '%' where user ='root';

创建数据库:

sql 复制代码
CREATE USER 'ldap'@'localhost' IDENTIFIED BY 'Eryajf@123';

CREATE DATABASE IF NOT EXISTS `go_ldap_admin` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

GRANT ALL PRIVILEGES on `go_ldap_admin`.* to 'ldap'@'localhost';

FLUSH privileges;

安装openLDAP

以yum方式安装:

sql 复制代码
yum install openldap openldap-clients openldap-servers -y

复制一个默认配置到指定目录下,并授权,这一步一定要做,然后再启动服务,不然生产密码时会报错:

bash 复制代码
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

授权:

bash 复制代码
chown -R ldap /var/lib/ldap/DB_CONFIG

启动:

bash 复制代码
systemctl enable slapd --now

初始化配置,生成密码,这里自己的记录一下{SSHA}这一串,后面需要用到:

bash 复制代码
slappasswd -s 123456

新增修改密码文件,ldif为后缀,文件名随意,不要在/etc/openldap/slapd.d/目录下创建类似文件 生成的文件为需要通过命令去动态修改ldap现有配置,如下,我在家目录下,创建文件(记得修改{SSHA}密码为上面拿到的那一串):

bash 复制代码
cd ~
vim changepwd.ldif
bash 复制代码
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}LSgYPTUW4zjGtIVtuZ8cRUqqFRv1tWpE

# 这里解释一下这个文件的内容:
# 第一行执行配置文件,这里就表示指定为 cn=config/olcDatabase={0}config 文件。
# 你到/etc/openldap/slapd.d/目录下就能找到此文件
# 第二行 changetype 指定类型为修改
# 第三行 add 表示添加 olcRootPW 配置项
# 第四行指定 olcRootPW 配置项的值
# 在执行下面的命令前,你可以先查看原本的olcDatabase={0}config文件,
# 里面是没有olcRootPW这个项的,执行命令后,你再看就会新增了olcRootPW项,
# 而且内容是我们文件中指定的值加密后的字符串

执行命令以修改配置:

bash 复制代码
ldapadd -Y EXTERNAL -H ldapi:/// -f changepwd.ldif

切记不能直接修改/etc/openldap/slapd.d/目录下的配置。

我们需要向 LDAP 中导入一些基本的 Schema。这些 Schema 文件位于/etc/openldap/schema/目录中,schema控制着条目拥有哪些对象类和属性,可以自行选择需要的进行导入(注意依次执行):

bash 复制代码
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/collective.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/corba.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/duaconf.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/dyngroup.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/java.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/misc.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/openldap.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/pmi.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif

修改域名,新增con.ldif

这里官方自定义的域名为 eryajf.net,管理员用户账号为admin。 如果要修改,则修改文件中相应的dc=eryajf,dc=net为自己的域名,密码切记改成上面重新生成的哪个。

bash 复制代码
vim con.ldif
bash 复制代码
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=eryajf,dc=net" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=eryajf,dc=net

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=eryajf,dc=net

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}LSgYPTUW4zjGtIVtuZ8cRUqqFRv1tWpE

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=eryajf,dc=net" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=eryajf,dc=net" write by * read

执行命令以修改:

bash 复制代码
ldapmodify -Y EXTERNAL -H ldapi:/// -f con.ldif

确认这里有5条输出,因为进行了5项修改:

启用memberof功能,新增add-memberof.ldif:

bash 复制代码
vim add-memberof.ldif
bash 复制代码
dn: cn=module{0},cn=config
cn: modulle{0}
objectClass: olcModuleList
objectclass: top
olcModuleload: memberof.la
olcModulePath: /usr/lib64/openldap

dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfUniqueNames
olcMemberOfMemberAD: uniqueMember
olcMemberOfMemberOfAD: memberOf

新增refint1.ldif文件:

bash 复制代码
vim refint1.ldif
bash 复制代码
dn: cn=module{0},cn=config
add: olcmoduleload
olcmoduleload: refint

新增refint2.ldif文件:

vim refint2.ldif
bash 复制代码
dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: refint
olcRefintAttribute: memberof uniqueMember  manager owner

依次执行以下命令,顺序不要错:

bash 复制代码
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f add-memberof.ldif
bash 复制代码
ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f refint1.ldif
bash 复制代码
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint2.ldif

创建一个组织

到此,配置修改完了,在上述基础上,我们来创建一个叫做 eryajf company 的组织(官网叫这个,根据需求,自行修改),并在其下创建一个 admin 的组织角色(该组织角色内的用户具有管理整个 LDAP 的权限)和 一些初始化必须的组织:

bash 复制代码
vim base.ldif
bash 复制代码
dn: dc=eryajf,dc=net
objectClass: top
objectClass: dcObject
objectClass: organization
o: Eryajf Company
dc: eryajf

dn: cn=admin,dc=eryajf,dc=net
objectClass: organizationalRole
cn: admin

dn: ou=people,dc=eryajf,dc=net
ou: people
description: 用户根目录
objectClass: organizationalUnit

dn: ou=dingtalkroot,dc=eryajf,dc=net
ou: dingtalkroot
description: 钉钉根部门
objectClass: top
objectClass: organizationalUnit

dn: ou=wecomroot,dc=eryajf,dc=net
ou: wecomroot
description: 企业微信根部门
objectClass: top
objectClass: organizationalUnit

dn: ou=feishuroot,dc=eryajf,dc=net
ou: feishuroot
description: 飞书根部门
objectClass: top
objectClass: organizationalUnit

执行命令,添加配置, 这里要注意修改域名为自己配置的域名,然后需要输入上面我们生成的密码123456

bash 复制代码
ldapadd -x -D cn=admin,dc=yaobili,dc=com -W -f base.ldif

安装OpenResty

配置阿里和openresty的yum源:

bash 复制代码
yum -y install yum-utils
bash 复制代码
yum-config-manager --add-repo http://mirrors.aliyun.com/repo/Centos-7.repo
bash 复制代码
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo

安装:

bash 复制代码
yum install openresty -y

创建一些软链,便于维护或者规范:

bash 复制代码
ln -snf /usr/local/openresty/nginx/sbin/nginx /usr/sbin/nginx
ln -snf /usr/local/openresty/nginx/conf /etc/nginx

启动服务:

bash 复制代码
systemctl enable openresty --now

下载后端

官网上给的下载版本是0.5.9,但是我强烈建议安装0.5.10:

bash 复制代码
wget https://github.com/eryajf/go-ldap-admin/releases/download/v0.5.10/go-ldap-admin-v0.5.10-linux-amd64.tar.gz
bash 复制代码
mkdir go-ldap-admin && tar xf go-ldap-admin-v0.5.10-linux-amd64.tar.gz -C go-ldap-admin

下载前端

bash 复制代码
wget https://github.com/eryajf/go-ldap-admin-ui/releases/download/v0.5.13/go-ldap-admin-ui-v0.5.13.tar.gz
bash 复制代码
tar xf go-ldap-admin-ui-v0.5.13.tar.gz

部署后端

bash 复制代码
mkdir -p /data/www && mv go-ldap-admin /data/www

根据实际情况进行修改:

bash 复制代码
vim /data/www/go-ldap-admin/config.yml

应用相关信息获取查看这里:

钉钉:配置钉钉同步 | Go-Ldap-Admin
企业微信:配置企业微信同步 | Go-Ldap-Admin
飞书:配置飞书同步 | Go-Ldap-Admin

添加系统服务:

bash 复制代码
vim /usr/lib/systemd/system/go-ldap-admin.service
bash 复制代码
[Unit]
Description=Go Ldap Admin Service

[Service]
WorkingDirectory=/data/www/go-ldap-admin/
ExecStart=/data/www/go-ldap-admin/go-ldap-admin

[Install]
WantedBy=multi-user.target

启动:

bash 复制代码
systemctl daemon-reload && systemctl start go-ldap-admin

部署前端

移动制品:

bash 复制代码
mv go-ldap-admin-ui /data/www//demo-go-ldap-admin.eryajf.net

在OpenResty中添加如下配置,代理本项目:

bash 复制代码
mkdir /etc/nginx/conf && vim /etc/nginx/conf/nginx.conf
bash 复制代码
server {
    listen 80;
    server_name demo-go-ldap-admin.eryajf.net;
    root /data/www//demo-go-ldap-admin.eryajf.net/dist;
    location / {
        try_files $uri $uri/ /index.html;
        add_header Cache-Control 'no-store';
    }

    location /api/ {
        proxy_set_header Host $http_host;
        proxy_set_header  X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://127.0.0.1:8888;
    }
}

记得自己去 include 一下配置文件,默认你懂。

bash 复制代码
nginx -t
nginx -s reload

确保一下服务都起来了:

bash 复制代码
systemctl status mysqld
systemctl status slapd
systemctl status go-ldap-admin
systemctl status openresty

都启动之后,就可以打开web管理页面

http:ip:端口

bash 复制代码
http://你的IP/phpldapadmin#/dashboard

默认用户名:admin,默认密码是LDAP设置的密码123456。


三、管理动态字段

在进行同步之前需要先去先建立字段映射:

下面有图片示例。

钉钉

创建分组的动态关系:

bash 复制代码
{
    "flag": "dingtalk_group",  // 字段标识
    "attributes": {  // 字段属性
        "groupName":"custom_name_pinyin",  // 分组名称(通常为分组名的拼音)
        "remark":"name",  // 分组描述
        "sourceDeptId":"id",  // 部门ID
        "sourceDeptParentId":"parentid" // 父部门ID
    }
}

创建用户的动态关系:

bash 复制代码
{
    "flag": "dingtalk_user", // 字段标识
    "attributes": { // 字段属性
        "username":"custom_name_pinyin", // 用户名(通常为用户名拼音)
        "nickname":"name",  // 中文名字
        "givenName":"name", // 花名
        "mail":"email",  // 邮箱
        "jobNumber":"job_number", // 工号
        "mobile":"mobile", // 手机号
        "avatar":"avatar", // 头像
        "postalAddress":"work_place", // 地址
        "position":"title", // 职位
        "introduction":"remark", // 说明
        "sourceUserId":"userid", // 源用户ID
        "sourceUnionId":"unionid" // 源用户唯一ID
    }
}

企业微信

创建分组的动态关系:

bash 复制代码
{
    "flag": "wecom_group",
    "attributes": {
        "groupName":"custom_name_pinyin",
        "remark":"name",
        "sourceDeptId":"id",
        "sourceDeptParentId":"parentid"
    }
}

创建用户的动态关系:

bash 复制代码
{
    "flag": "wecom_user",
    "attributes": {
        "username":"custom_name_pinyin",
        "nickname":"name",
        "givenName":"alias",
        "mail":"email",
        "jobNumber":"mobile",
        "mobile":"mobile",
        "avatar":"avatar",
        "postalAddress":"address",
        "position":"external_position",
        "introduction":"name",
        "sourceUserId":"userid",
        "sourceUnionId":"userid"
    }
}

飞书

创建分组的动态关系:

bash 复制代码
{
    "flag": "feishu_group",
    "attributes": {
        "groupName":"department_id",
        "remark":"name",
        "sourceDeptId":"open_department_id",
        "sourceDeptParentId":"parent_department_id"
    }
}

创建用户的动态关系:

bash 复制代码
{
    "flag": "feishu_user",
    "attributes": {
        "username":"custom_name_pinyin",
        "nickname":"name",
        "givenName":"name",
        "mail":"email",
        "jobNumber":"employee_no",
        "mobile":"mobile",
        "avatar":"avatar",
        "postalAddress":"work_station",
        "position":"job_title",
        "introduction":"name",
        "sourceUserId":"user_id",
        "sourceUnionId":"union_id"
    }
}

以企业微信举例,就这样填进去即可:

然后去同步吧~但是需要注意!!!!!!

先同步分组,再同步用户!!!!!


四、部分报错

errcode":41001,"errmsg":"access_token missing rid:

若你使用的是docker-compose直接拉起的,前面也提到了那对不起,demo版本不支持IM认证。若不是,则是你的自建应用没有设置ip白名单(拿企业微信举例,没错就算你不设置,他也不会让所有ip都正常访问)。

访问:企业微信

找到你的自建应用并到这里配置:


LDAP Result Code 68 "Entry Already Exists"

说明ou已经存在


This base cannot be created with PLA.

此根不能创建ou。找个干净的目录新建文件:base.ldif

bash 复制代码
vim base.ldif
bash 复制代码
dn: dc=改成你的,dc=改成你的
o: ldapit
objectclass: dcObject
objectclass: organization

执行,记得修改内容:

bash 复制代码
ldapadd -f base.ldif -x -D cn=admin,dc=改成你的,dc=改成你的 -W

ldap_add: Invalid syntax (21)

additional info: objectclass: value #0 invalid per syntax

配置文件格式或内容存在错误


record not found

若你使用的是本文中的最新版本,则问题在于你的字段填写,请检查字段映射是否正确。若你使用的是官网中的安装版本,建议替换到最新版本进行安装。

相关推荐
AI慧聚堂19 分钟前
自动化 + 人工智能:投标行业的未来是什么样的?
运维·人工智能·自动化
不爱学英文的码字机器22 分钟前
[Linux] Shell 命令及运行原理
linux·运维·服务器
cdut_suye33 分钟前
Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试
java·linux·运维·服务器·c++·人工智能·python
qq_4336184437 分钟前
shell 编程(三)
linux·运维·服务器
苹果醋31 小时前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx
小蜗牛慢慢爬行1 小时前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
两张不够花1 小时前
Jenkins 持续集成部署
运维·jenkins
Tlzns1 小时前
Linux网络——UDP的运用
linux·网络·udp
码农土豆1 小时前
PaddlePaddle飞桨Linux系统Docker版安装
linux·docker·paddlepaddle
Hacker_xingchen1 小时前
天融信Linux系统安全问题
linux·运维·系统安全