zoukankan      html  css  js  c++  java
  • python 调用ldap同步密码

    1. windows + python2.7 安装 python-ldap
      https://www.lfd.uci.edu/~gohlke/pythonlibs/#python-ldap

    2.python 同步密码

    # encoding: utf-8
    """
      Created by Jeff Liu on 2019/12/2
    """
    import ldap
    import re
    
    PORTAL_LDAP = {
        'bind_dn': '',
        'bind_pass': '',
        'ldap_server': '',
        'port':"",
        'user_dn': '',
        'group_dn': ''
    }
    DEVOPS_LDAP = {
        'bind_dn': '',
        'bind_pass': '',
        'ldap_server': '',
        'port':"",
        'user_dn': '',
        'group_dn': ''
    }
    
    
    def connect_ldap(my_ldap):
        """
        建立ldap连接
        :param my_ldap: ldap连接信息
        :return: 返回ldap连接对象
        """
        ip = my_ldap['ldap_server']
        port = my_ldap['port']
        bind_dn = my_ldap['bind_dn']
        bind_pass = my_ldap['bind_pass']
        # 如果是ldaps, 需要指定CA cert file
        # ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, "/path/to/ldaps.cert.file")
        # 如果是self-signed cert, 加上这行
        ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
        # 初始化LDAP连接
        ldap_connect = ldap.initialize('ldap://' + ip + ':' + port)
        ldap_connect.set_option(ldap.OPT_REFERRALS, 0)
        ldap_connect.protocol_version = ldap.VERSION3
        ldap_connect.simple_bind_s(bind_dn, bind_pass)
        print("ldap: {} is connected.".format(ip))
        return ldap_connect
    
    
    def get_password(ldap_connect, uid, user_dn):
        """
        获取用户密码(加密)
        :param ldap_connect: ldap连接对象
        :param uid: 用户账号
        :param user_dn: 用户base dn
        :return: 用户密码信息
        """
        try:
            result_set = ldap_connect.search_s(user_dn, ldap.SCOPE_SUBTREE, 'uid=' + uid)
            name, attrs = result_set[0]
            if hasattr(attrs, 'has_key') and attrs.has_key('uid'):
                userPassword = attrs['userPassword'][0]
                return userPassword
            else:
                print "get_password error: %s not found." %uid
                return None
        except Exception, e:
            print "get_password error: uid=%s, %s" %(uid, str(e))
            return None
    
    
    def change_password(ldap_to_connect, uid, user_dn, new_password):
        """
        修改用户密码
        :param ldap_to_connect: ldap连接对象
        :param uid: 用户账号
        :param user_dn: 用户base dn
        :param new_password: 新密码
        :return: 用户密码
        """
        try:
            dn = 'uid=%s, %s' %(uid, user_dn)
            modlist = [(ldap.MOD_REPLACE, 'userPassword', new_password)]
            ldap_to_connect.modify_s(dn, modlist)
            return True
        except Exception,e:
            print "change_password error: %s, %s" %(uid ,str(e))
            return False
    
    
    def get_group_member(ldap_to_connect, cn, group_dn):
        """
        获取组成员
        :param ldap_to_connect: ldap连接对象
        :param cn: 组名称
        :param group_dn: 组base dn
        :return: 组成员列表
        """
        try:
            result_set = ldap_to_connect.search_s(group_dn, ldap.SCOPE_SUBTREE, 'cn=' + cn)
            name, attrs = result_set[0]
            user_pattern = 'uid=(.*?),.*'
            user_list = []
            if hasattr(attrs, 'has_key') and attrs.has_key('uniqueMember'):
                member_list_dn = attrs['uniqueMember']
                for m in member_list_dn:
                    username = re.findall(user_pattern, m)
                    if username:
                        user_list.append(username[0])
                return user_list
            else:
                print "get_group_member error: key not found."
                return None
        except Exception, e:
            print "get_group_member error: ", str(e)
            return None
    
    
    def add_group_member(ldap_to, groupname, group_dn, user_dn, user_list):
        """
        添加组成员信息
        :param ldap_to: ldap连接对象
        :param groupname: ldap组名称
        :param group_dn: ldap group base dn
        :param user_list: 用户列表 ['1111','2222']
        :return: 返回 False/True
        """
        user_dn_list = []
        for user in user_list:
            user_dn_list.append('uid=%s,%s' %(user, user_dn))
        ldap_to_connect = connect_ldap(ldap_to)
        modlist = []
        if len(user_dn_list) == 0:
            modlist.append((ldap.MOD_REPLACE, 'uniqueMember', ""))
        for index in range(len(user_dn_list)):
            if index == 0:
                modlist.append((ldap.MOD_REPLACE, 'uniqueMember', str(user_dn_list[index])))
            else:
                modlist.append((ldap.MOD_ADD, 'uniqueMember', str(user_dn_list[index])))
        try:
            modifyDN = "cn=%s,%s" % (groupname, group_dn)
            print(modifyDN)
            print(modlist)
            ldap_to_connect.modify_s(modifyDN, modlist)
            return True
        except ldap.LDAPError, e:
            print("add_group_member: %s add group memeber failed,reason: %s" % (groupname, str(e)))
        return False
    
    
    def sync(group_name, ldap_from, ldap_to):
        """
        同步用户组成员密码
        :param group_name: 组名称
        :param ldap_from: ldap 来源server
        :param ldap_to: ldap 目标server
        :return: dict 更新结果
        """
        ldap_to_connect = connect_ldap(ldap_to)
        ldap_from_connect = connect_ldap(ldap_from)
        user_list = get_group_member(ldap_to_connect, group_name, ldap_to['group_dn'])
        count = 0
        for user in user_list:
            user_password = get_password(ldap_from_connect, user, ldap_from['user_dn'])
            if user_password:
                if change_password(ldap_to_connect, user, ldap_to['user_dn'], user_password):
                    count += 1
                    print "changed: ", user
        ldap_to_connect.unbind_s()
        ldap_from_connect.unbind_s()
        return {'success': count, 'total': len(user_list)}
    
    
    if __name__ == '__main__':
        # 同步jenkins群组
        result = sync("oa-jenkins", PORTAL_LDAP, DEVOPS_LDAP)
        print(result)
        # 同步gitlab群组
        result = sync("oa-gitlab", PORTAL_LDAP, DEVOPS_LDAP)
        print(result)
        # 同步组成员
        #user_list = []
        #result = add_group_member(DEVOPS_LDAP, 'oa-jenkins', DEVOPS_LDAP['group_dn'], DEVOPS_LDAP['user_dn'], user_list)
        print(result)
    
    
    
  • 相关阅读:
    MyCat简介+Mybatis实现多租户(链接)
    mybatis的sql执行过程底层源码分析和缓存原理分析
    推荐算法数据集
    CentOS系统初始化
    NAT
    VRRP
    BGP协议的原理及应用
    ospf协议的重分发
    静态路由的原理与配置、动态路由
    OSPF (企业内部使用的动态路由协议)
  • 原文地址:https://www.cnblogs.com/doraman/p/11969593.html
Copyright © 2011-2022 走看看