itop3 基于LDAP收集器进行AD域账号同步

iTop专栏

[1]基于Centos7+Apache2.4+Mysql5.7+PHP7.3环境安装itop3

[2] itop 初始化配置

[3] itop 二次开发-修改Web UI


一、概述

itop支持使用AD域用户登录,目前同步AD用户有两种方法:

  • Data collector for LDAP 数据收集器(官方)
  • AD_import_accounts.php 域同步脚本(民间大神)

通过对两种方法进行对比使用,虽然域同步脚本更加容易实现,但是从功能完整上来说,更加推荐LDAP数据收集器,故后续主要介绍官方提供的LDAP收集器使用方法。

此文档编写时,Data collector for LDAP最新版本为1.2.7,虽然官方文档还有一些小BUG,但笔者将实施步骤记录,帮助大家少走弯路。

建议:多看官方参考文档,了解主要思路,不要照抄文档配置,本文抛砖引玉,望举一反三

官方参考文档:Data collector for LDAP 文档

下载地址:Data collector for LDAP 安装包

二、技术原理

image-20220303135129674

AD域同步分为两部分

  • person同步(联系人)
  • User同步(账户)

image-20220303135421560

三、前期准备

1.php建议安装7.3以上,支持分页功能需要7.3以上

2.同步账户需要REST角色(以admin为同步账户介绍)

image-20220303140344411

3.收集器不要放置在Web目录,防止可以从外部访问配置文件,例如放置在/opt/itop/ldap-data-collector

四、配置文件介绍

ldap-data-collector文件如下

image-20220304100623031

下载好收集器ldap-data-collector,需要编辑的文件如下

  1. /opt/itop/ldap-data-collector/collectors/params.distrib.xml
  2. /opt/itop/ldap-data-collector/conf/params.distrib.xml
  3. /opt/itop/ldap-data-collector/conf/params.local.xml

其中conf/params.local.xmlconf/params.distrib.xml复制得到,当配置参数相同时,params.local.xml优先级高于params.distrib.xml

#解压ldap收集器
mkdir /opt/itop/ && cd /opt/itop/
unzip Data-collector-for-LDAP.zip

#复制配置文件
cd ldap-data-collector/conf
cp params.distrib.xml params.local.xml

五、配置单AD域同步

1.编辑配置文件conf/params.local.xml

vim conf/params.local.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- conf/params.local.xml - 用于配置个性化参数 -->
<parameters>
  <itop_url>http://localhost/</itop_url>
  <itop_login>admin</itop_login>
  <itop_password>adminpassword</itop_password>
  <contact_to_notify>john.doe@demo.com</contact_to_notify>
  <synchro_user>admin</synchro_user>
 <!--  BUG1 <ldapuri>ldap://localhost:389</ldaphost> -->
  <ldapuri>ldap://localhost:389</ldapuri>
  <ldapdn>DC=company,DC=com</ldapdn>
 <!--  BUG2 <ldaplogin>CN=ITOP-LDAP,DC=company,DC=com</ldaplogin> -->
  <ldaplogin>company\user</ldaplogin>
  <ldappassword>password</ldappassword>
  <page_size>1000</page_size>
  <prefix></prefix>
  <json_placeholders>
    <full_load_interval>604800</full_load_interval><!-- 7 days (in seconds): 7*24*60*60 -->
    <users_target_class>UserLDAP</users_target_class>
    <synchro_status>production</synchro_status>
  </json_placeholders>
</parameters>

注意:这里有官方文档的BUG

<!-- BUG 1  -->
    <!-- <ldapuri>ldap://localhost:389</ldaphost> 改为-->
         <ldapuri>ldap://localhost:389</ldapuri>
<!-- BUG 2  -->
    <!-- <ldaplogin>CN=ITOP-LDAP,DC=company,DC=com</ldaplogin> 改为-->
         <ldaplogin>company\user</ldaplogin>

以上配置文件的含义,请参考官方文档解释

参数 含义 举例
itop_url itop登录地址 http://localhost/
itop_login 拥有REST角色、创建联系人权限的账号 admin
itop_password password
contact_to_notify 当同步错误时,通知联系人
synchro_user 拥有REST角色的用户,和itop_login保持一致即可 admin
ldapuri LDAP 服务器地址 ldap://localhost:389
ldapdn LDAP 公司DN,如果同步某个OU,则加上OU=xx,即可
ldaplogin 连接到LDAP 服务器用户 company\user
ldappassword password
page_size 同步分页的大小 1000
prefix 每个LDAP服务器的标签,同步多LDAP服务器才会用到
full_load_interval 当账号已不存在LDAP中,账号保留时间 604800
users_target_class 同步用户类,UserLDAP 或者 UserExternal UserLDAP
synchro_status 同步状态 production

2.编辑配置文件collectors/params.distrib.xml

vim collectors/params.distrib.xml

<?xml version="1.0" encoding="UTF-8"?>
<parameters>
        <!--  填写LDAP信息账号信息 -->
        <ldapuri>ldap://localhost:389</ldapuri>
        <ldapdn>DC=company,DC=com</ldapdn>
        <ldaplogin>company\user</ldaplogin>
        <ldappassword>PASSWORD</ldappassword>
        <!-- Parameters for Person synchronization -->
        <ldappersonfilter>(objectClass=person)</ldappersonfilter>
        <itop_group_pattern>/^CN=itop-(.*),OU=.*/</itop_group_pattern>
        <person_fields>
                <!-- 重要: 映射LDAP用户与联系人 ,后续如果增加字段映射也在这里改  -->
                <primary_key>samaccountname</primary_key>
                <name>givenname</name>
                <first_name>sn</first_name>
                <email>mail</email>
                <phone>telephonenumber</phone>
                <mobile_phone>mobile</mobile_phone>
                <function>title</function>
                <employee_number>employeenumber</employee_number>
        </person_fields>
        <person_defaults>
            <!--  同步到iTop的组织名称,不是组织ID ,请完整填写-->
            <org_id>Demo</org_id>
            <status>active</status>
        </person_defaults>

        <!--重要 : 同步参数设置 -->
        <collect_person_only>no</collect_person_only>
        <ldapuserfilter>(&amp;(objectClass=person)(samaccountname=*))</ldapuserfilter>
        <synchronize_profiles>no</synchronize_profiles>
        <user_fields>
                <!--  映射LDAP用户与联系人 -->
                <primary_key>samaccountname</primary_key>
                <login>samaccountname</login>
                 <!--  重要:关联用户与联系人 默认是mail -->
                <contactid>mail</contactid>
        </user_fields>
        <user_defaults>
                <!--  默认角色 语言 -->
                <profile>Portal user</profile>
                <language>ZH CN</language>
        </user_defaults>
        <!-- 此参数在多域或多OU环境同步时候才会用到 -->
        <prefix></prefix>
        <json_placeholders>
                <!-- 
                <prefix></prefix>
                <persons_data_table>synchro_data_PersonAD</persons_data_table>
                <users_data_table></users_data_table>
                 -->
                <prefix>$prefix$</prefix>
                <persons_data_table>synchro_data_$prefix$ldap_persons</persons_data_table>
            <users_target_class>UserLDAP</users_target_class>
                <users_data_table>synchro_data_$prefix$ldap_users</users_data_table>
            <full_load_interval>604800</full_load_interval><!-- 7 days (in seconds): 7*24*60*60 -->
            <synchro_status>production</synchro_status>
            <profile_list_update_policy>write_if_empty</profile_list_update_policy>
        </json_placeholders>
</parameters>

注意:此份配置文档非常重要,主要是映射联系人、用户和LDAP字段的映射关系,并且将联系人与用户相关联。

例如,下面更改了中文姓名的顺序。

<!--  <name>sn</name>  -->
<!--  <first_name>givenname</first_name> -->
<!--  姓名调到改为: -->
<name>givenname</name>
<first_name>sn</first_name>

3.测试iTop REST API连接

php toolkit/testconnection.php

成功后会提示如下界面,如果未出现,请检查以上配置文件

image-20220303163718523

常见错误:

如果未给同步用户(admin),赋予REST Services User角色,则会提示以下错误

image-20220304132824940

4.测试LDAP 同步用户

php collectors/bin/ldap-test.php

能返回如下信息则配置成功

image-20220304084153353

常见错误:

未使用这种格式 &lt;ldaplogin&gt;dgqy\80310&lt;/ldaplogin&gt;,会提示如下错误

image-20220304083915411

5.测试LDAP收集功能

php exec.php --console_log_level=9 --collect_only

image-20220304132842238

6.测试正常,运行同步命令

php exec.php

image-20220304132854606

登录联系人页面查看

image-20220304133558564

image-20220304084710665

注意:同步后的联系人无法修改

image-20220304084830951

需要手动修改,可以点击配置-同步数据源-属性修改,将加锁修改为解锁就能修改了。但是每次同步后会重新加锁,如果需要一直解锁,需要修改收集器内的策略json文件iTopPersonLDAPCollector.jsoniTopUserLDAPCollector.json,这里不做介绍

image-20220304085014617

7.配置定时同步任务

以上完成同步后,需要使用crontab配置定时任务

编写同步脚本

vim /opt/itop/cron/ldap-data-collector-cron.sh

#!/bin/bash
# 用于ldap数据收集执行脚本
echo "开始进行LDAP数据同步"
php /opt/itop/ldap-data-collector/exec.php  --config_file='/opt/itop/ldap-data-collector/conf/params.local.xml' >> /opt/itop/cron/params.local.xml.log 2>&1
echo "LDAP同步完成"

创建定时任务

crontab -e

#每天12点30 , 23点30进行LDAP同步
30 12,23 * * * /bin/bash /opt/itop/cron/ldap-data-collector-cron.sh

验证定时状态

image-20220304085839358

六、(进阶)多域多OU AD账户同步

​ 上文介绍了单个域环境单个OU的用户同步到iTop某个组织中(&lt;org_id&gt;&lt;/org_id&gt;指定组织),如果需要一个或多个域环境,多个OU的用户分配同步到iTop的不同组织中,则需要对每一个对应关系编写一份配置文件,并且使用&lt;prefix&gt;&lt;/prefix&gt;参数进行区分

以下以一个域内qyyls两个OU分别同步到iTop不同组织内为例

1.在conf下创建每个OU对应的xml文件

params.local.xml修改为带后缀的文件

image-20220304132946491

vim params.local.qy.xml

<ldapdn>OU=对应的组织名,DC=dgqy,DC=com</ldapdn>
<prefix>qy</prefix>
<data_path>%APPROOT%/data-qy</data_path>

        <person_defaults>
                <org_id>iTop组织名-qy</org_id>
                <status>active</status>
        </person_defaults>

vim params.local.yls.xml

<ldapdn>OU=对应的组织名,DC=dgqy,DC=com</ldapdn>
<prefix>yls</prefix>
<data_path>%APPROOT%/data-yls</data_path>

        <person_defaults>
                <org_id>iTop组织名-yls</org_id>
                <status>active</status>
        </person_defaults>

以上简化配置文件,是为了为了避免itop和网址被多次指定,并将params.local.xml文件内的公共部分添加到conf/params.distrib.xmlcollectors/params.distrib.xml

其他配置参数参考步骤五中配置文件

vim conf/params.distrib.xml

image-20220304112401160

vim collectors/params.distrib.xml

image-20220304134115615

2.执行每个收集器,查看是否成功(同上)

php exec.php  --config_file='conf/params.local.qy.xml'
php exec.php  --config_file='conf/params.local.yls.xml'

3.配置定时同步任务

以上完成同步后,均为手动执行同步,需要自动同步,需要使用crontab

编写同步脚本

vim /opt/itop/cron/ldap-data-collector-cron.sh

#!/bin/bash
# 用于ldap数据收集执行脚本
echo "开始进行LDAP数据同步"
php /opt/itop/ldap-data-collector/exec.php  --config_file='/opt/itop/ldap-data-collector/conf/params.local.qy.xml' >> /opt/itop/cron/params.local.qy.xml.log 2>&1
php /opt/itop/ldap-data-collector/exec.php  --config_file='/opt/itop/ldap-data-collector/conf/params.local.yls.xml' >> /opt/itop/cron/params.local.yls.xml.log 2>&1
echo "LDAP同步完成"

创建定时任务

crontab -e

#每天12点30 , 23点30进行LDAP同步
30 12,23 * * * /bin/bash /opt/itop/cron/ldap-data-collector-cron.sh

查看同步数据源

image-20220304091051577

七、开启LDAP登录

打开web页面,编辑配置文件

image-20220304135500528

找到如下配置项,

    'authent-ldap' => array (
        'host' => '192.168.0.42',
        'port' => 389,
        'default_user' => 'itop@dgqy.com',
        'default_pwd' => '123456',
        'base_dn' => 'dc=dgqy,dc=com',
        'user_query' => '(&(samaccountname=%1$s))',
        'options' => array (
          17 => 3,
          8 => 0,
        ),

保存后,同步的LDAP用户就可以登录了

八、(可选)其他问题

​ 以上同步AD的前提都是基于AD域中存在mail,如果企业内部未配置邮箱,则同步时会发生问题,这里介绍如何将联系人与账号关联从mail-mail更改为登录名-员工编号相关联

image-20220304091738112

image-20220304091932685

1.修改配置文件collectors/iTopUserLDAPCollector.json

vim collectors/iTopUserLDAPCollector.json

contactid 改为 employee_number,为将账户关联联系人中的员工编号,如果两者相等,则自动关联

image-20220304134351488

2.修改配置文件vim collectors/params.distrib.xml

vim collectors/params.distrib.xml

mail改为samaccountname 登录账号

   <!-- Parameters for User synchronization -->
        <collect_person_only>no</collect_person_only>
        <ldapuserfilter>(&amp;(objectClass=person)(samaccountname=*))</ldapuserfilter>
        <synchronize_profiles>yes</synchronize_profiles>
        <user_fields>
                <!--  Mapping between LDAP fields and iTop UserLDAP's object fields -->
                <primary_key>samaccountname</primary_key>
                <login>samaccountname</login>

                <contactid>samaccountname</contactid>
        </user_fields>

image-20220304134424064

更改完,后续参考第五步,完成同步即可