• 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默认你有,端口映射情况:

    ServicePort(宿主机端口:容器端口)
    MySQL3307:3306
    openLDAP389:389
    phpldapadmin8091:80
    go-ldap-admin8090:80,8888:8888

    拉取:

    git clone https://github.com/eryajf/go-ldap-admin.git

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

    1. tree -N docker-compose
    2. docker-compose
    3. ├── config
    4. │ ├── init.ldif
    5. │ └── my.cnf
    6. └── docker-compose.yaml
    7. 1 directory, 3 files

    拉起:

    1. cd docs/docker-compose
    2. 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的评论才知道是不支持。


    二、原生部署流程

    随手关一下:

    systemctl disable firewalld.service --now

    安装MySQL:5.7数据库

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

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

    wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm
    

    然后进行repo的安装:

    rpm -ivh mysql80-community-release-el7-5.noarch.rpm
    

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

    1. # 关闭8.0
    2. yum-config-manager --disable mysql80-community
    3. # 开启5.7
    4. yum-config-manager --enable mysql57-community

    开始安装:

    yum install mysql-server -y
    

    Mysql,启动!

    systemctl start mysqld
    

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

    grep 'temporary password' /var/log/mysqld.log
    

    登录后对密码进行修改:

    alter user 'root'@'localhost' identified by 'Abc@1234';

    随手执行一下:

    1. use mysql;
    2. update user set host = '%' where user ='root';

    创建数据库

    1. CREATE USER 'ldap'@'localhost' IDENTIFIED BY 'Eryajf@123';
    2. CREATE DATABASE IF NOT EXISTS `go_ldap_admin` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
    3. GRANT ALL PRIVILEGES on `go_ldap_admin`.* to 'ldap'@'localhost';
    4. FLUSH privileges;

    安装openLDAP

    以yum方式安装:

    yum install openldap openldap-clients openldap-servers -y

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

    cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
    

    授权:

    chown -R ldap /var/lib/ldap/DB_CONFIG
    

    启动:

    systemctl enable slapd --now
    

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

    slappasswd -s 123456

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

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

    执行命令以修改配置:

    ldapadd -Y EXTERNAL -H ldapi:/// -f changepwd.ldif
    

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

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

    1. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
    2. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
    3. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
    4. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/collective.ldif
    5. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/corba.ldif
    6. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/duaconf.ldif
    7. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/dyngroup.ldif
    8. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/java.ldif
    9. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/misc.ldif
    10. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/openldap.ldif
    11. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/pmi.ldif
    12. ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif

    修改域名,新增con.ldif

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

    vim con.ldif
    1. dn: olcDatabase={1}monitor,cn=config
    2. changetype: modify
    3. replace: olcAccess
    4. 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
    5. dn: olcDatabase={2}hdb,cn=config
    6. changetype: modify
    7. replace: olcSuffix
    8. olcSuffix: dc=eryajf,dc=net
    9. dn: olcDatabase={2}hdb,cn=config
    10. changetype: modify
    11. replace: olcRootDN
    12. olcRootDN: cn=admin,dc=eryajf,dc=net
    13. dn: olcDatabase={2}hdb,cn=config
    14. changetype: modify
    15. replace: olcRootPW
    16. olcRootPW: {SSHA}LSgYPTUW4zjGtIVtuZ8cRUqqFRv1tWpE
    17. dn: olcDatabase={2}hdb,cn=config
    18. changetype: modify
    19. add: olcAccess
    20. olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=eryajf,dc=net" write by anonymous auth by self write by * none
    21. olcAccess: {1}to dn.base="" by * read
    22. olcAccess: {2}to * by dn="cn=admin,dc=eryajf,dc=net" write by * read

    执行命令以修改:

    ldapmodify -Y EXTERNAL -H ldapi:/// -f con.ldif
    

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

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

    vim add-memberof.ldif
    
    1. dn: cn=module{0},cn=config
    2. cn: modulle{0}
    3. objectClass: olcModuleList
    4. objectclass: top
    5. olcModuleload: memberof.la
    6. olcModulePath: /usr/lib64/openldap
    7. dn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config
    8. objectClass: olcConfig
    9. objectClass: olcMemberOf
    10. objectClass: olcOverlayConfig
    11. objectClass: top
    12. olcOverlay: memberof
    13. olcMemberOfDangling: ignore
    14. olcMemberOfRefInt: TRUE
    15. olcMemberOfGroupOC: groupOfUniqueNames
    16. olcMemberOfMemberAD: uniqueMember
    17. olcMemberOfMemberOfAD: memberOf

    新增refint1.ldif文件:

    vim refint1.ldif
    1. dn: cn=module{0},cn=config
    2. add: olcmoduleload
    3. olcmoduleload: refint

    新增refint2.ldif文件:

    vim refint2.ldif
    1. dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config
    2. objectClass: olcConfig
    3. objectClass: olcOverlayConfig
    4. objectClass: olcRefintConfig
    5. objectClass: top
    6. olcOverlay: refint
    7. olcRefintAttribute: memberof uniqueMember manager owner

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

    ldapadd -Q -Y EXTERNAL -H ldapi:/// -f add-memberof.ldif
    
    ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f refint1.ldif
    
    ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint2.ldif
    


    创建一个组织

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

    vim base.ldif
    1. dn: dc=eryajf,dc=net
    2. objectClass: top
    3. objectClass: dcObject
    4. objectClass: organization
    5. o: Eryajf Company
    6. dc: eryajf
    7. dn: cn=admin,dc=eryajf,dc=net
    8. objectClass: organizationalRole
    9. cn: admin
    10. dn: ou=people,dc=eryajf,dc=net
    11. ou: people
    12. description: 用户根目录
    13. objectClass: organizationalUnit
    14. dn: ou=dingtalkroot,dc=eryajf,dc=net
    15. ou: dingtalkroot
    16. description: 钉钉根部门
    17. objectClass: top
    18. objectClass: organizationalUnit
    19. dn: ou=wecomroot,dc=eryajf,dc=net
    20. ou: wecomroot
    21. description: 企业微信根部门
    22. objectClass: top
    23. objectClass: organizationalUnit
    24. dn: ou=feishuroot,dc=eryajf,dc=net
    25. ou: feishuroot
    26. description: 飞书根部门
    27. objectClass: top
    28. objectClass: organizationalUnit

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

    ldapadd -x -D cn=admin,dc=yaobili,dc=com -W -f base.ldif
    


    安装OpenResty

    配置阿里和openresty的yum源:

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

    安装:

    yum install openresty -y

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

    1. ln -snf /usr/local/openresty/nginx/sbin/nginx /usr/sbin/nginx
    2. ln -snf /usr/local/openresty/nginx/conf /etc/nginx

    启动服务:

    systemctl enable openresty --now

    下载后端

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

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

    下载前端

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

    部署后端

    mkdir -p /data/www && mv go-ldap-admin /data/www

    根据实际情况进行修改:

    vim /data/www/go-ldap-admin/config.yml

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

    钉钉配置钉钉同步 | Go-Ldap-Admin

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

    飞书:配置飞书同步 | Go-Ldap-Admin

     添加系统服务:

    vim /usr/lib/systemd/system/go-ldap-admin.service
    1. [Unit]
    2. Description=Go Ldap Admin Service
    3. [Service]
    4. WorkingDirectory=/data/www/go-ldap-admin/
    5. ExecStart=/data/www/go-ldap-admin/go-ldap-admin
    6. [Install]
    7. WantedBy=multi-user.target

    启动:

    systemctl daemon-reload && systemctl start go-ldap-admin

    部署前端

    移动制品:

    mv go-ldap-admin-ui /data/www//demo-go-ldap-admin.eryajf.net
    

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

    mkdir /etc/nginx/conf && vim /etc/nginx/conf/nginx.conf
    1. server {
    2. listen 80;
    3. server_name demo-go-ldap-admin.eryajf.net;
    4. root /data/www//demo-go-ldap-admin.eryajf.net/dist;
    5. location / {
    6. try_files $uri $uri/ /index.html;
    7. add_header Cache-Control 'no-store';
    8. }
    9. location /api/ {
    10. proxy_set_header Host $http_host;
    11. proxy_set_header X-Real-IP $remote_addr;
    12. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    13. proxy_set_header X-Forwarded-Proto $scheme;
    14. proxy_pass http://127.0.0.1:8888;
    15. }
    16. }

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

    1. nginx -t
    2. nginx -s reload

    确保一下服务都起来了:

    1. systemctl status mysqld
    2. systemctl status slapd
    3. systemctl status go-ldap-admin
    4. systemctl status openresty

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

    http:ip:端口

    http://你的IP/phpldapadmin#/dashboard

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


    三、管理动态字段

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

    下面有图片示例。 

    钉钉

    创建分组的动态关系:

    1. {
    2. "flag": "dingtalk_group", // 字段标识
    3. "attributes": { // 字段属性
    4. "groupName":"custom_name_pinyin", // 分组名称(通常为分组名的拼音)
    5. "remark":"name", // 分组描述
    6. "sourceDeptId":"id", // 部门ID
    7. "sourceDeptParentId":"parentid" // 父部门ID
    8. }
    9. }

     创建用户的动态关系:

    1. {
    2. "flag": "dingtalk_user", // 字段标识
    3. "attributes": { // 字段属性
    4. "username":"custom_name_pinyin", // 用户名(通常为用户名拼音)
    5. "nickname":"name", // 中文名字
    6. "givenName":"name", // 花名
    7. "mail":"email", // 邮箱
    8. "jobNumber":"job_number", // 工号
    9. "mobile":"mobile", // 手机号
    10. "avatar":"avatar", // 头像
    11. "postalAddress":"work_place", // 地址
    12. "position":"title", // 职位
    13. "introduction":"remark", // 说明
    14. "sourceUserId":"userid", // 源用户ID
    15. "sourceUnionId":"unionid" // 源用户唯一ID
    16. }
    17. }

    企业微信

     创建分组的动态关系:

    1. {
    2. "flag": "wecom_group",
    3. "attributes": {
    4. "groupName":"custom_name_pinyin",
    5. "remark":"name",
    6. "sourceDeptId":"id",
    7. "sourceDeptParentId":"parentid"
    8. }
    9. }

    创建用户的动态关系:

    1. {
    2. "flag": "wecom_user",
    3. "attributes": {
    4. "username":"custom_name_pinyin",
    5. "nickname":"name",
    6. "givenName":"alias",
    7. "mail":"email",
    8. "jobNumber":"mobile",
    9. "mobile":"mobile",
    10. "avatar":"avatar",
    11. "postalAddress":"address",
    12. "position":"external_position",
    13. "introduction":"name",
    14. "sourceUserId":"userid",
    15. "sourceUnionId":"userid"
    16. }
    17. }

    飞书

    创建分组的动态关系:

    1. {
    2. "flag": "feishu_group",
    3. "attributes": {
    4. "groupName":"department_id",
    5. "remark":"name",
    6. "sourceDeptId":"open_department_id",
    7. "sourceDeptParentId":"parent_department_id"
    8. }
    9. }

    创建用户的动态关系:

    1. {
    2. "flag": "feishu_user",
    3. "attributes": {
    4. "username":"custom_name_pinyin",
    5. "nickname":"name",
    6. "givenName":"name",
    7. "mail":"email",
    8. "jobNumber":"employee_no",
    9. "mobile":"mobile",
    10. "avatar":"avatar",
    11. "postalAddress":"work_station",
    12. "position":"job_title",
    13. "introduction":"name",
    14. "sourceUserId":"user_id",
    15. "sourceUnionId":"union_id"
    16. }
    17. }

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

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

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


    四、部分报错

    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

    vim base.ldif
    1. dn: dc=改成你的,dc=改成你的
    2. o: ldapit
    3. objectclass: dcObject
    4. objectclass: organization

     执行,记得修改内容:

    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

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

  • 相关阅读:
    matplotlib如何保存高分辨率图(亲测)
    spring IOC 为什么能降低耦合
    Day982.各大开放平台是如何使用OAuth 2.0 -OAuth 2.0
    10 个杀手级的 Python 自动化脚本
    网关概念+Nginx正反向代理+负载均衡+Spring Cloud Gateway
    Himall商城Web帮助类 获得http请求数据
    湖南省政协副主席赖明勇一行莅临麒麟信安调研
    科技云报道:从百度智能云的探索,看懂边缘云的过去和未来
    preview_220624,Day08_DM层建设实战,
    OBIA:900+ 患者、193w+ 影像,中科院基因组所发布我国首个生物影像共享数据库
  • 原文地址:https://blog.csdn.net/Trollz/article/details/133344769