python-ldap操作によるAD/LDAPユーザーおよび組織構造の管理

10223 ワード

LDAP/ADは2つの応用が最も広範な認証サーバーであり、ADはマイクロソフトがLDAPに基づいて開発したものであり、Windowsプラットフォームに応用されているが、LDAPは主にLinuxプラットフォームに応用されている(LDAPはWindowsプラットフォームでは少ない).ADがLDAPの拡張に基づいている以上、LDAPのほとんどのプロトコルは、ADがオリジナルでサポートすることができ、AD認証サーバの操作と管理に大きな便利さを提供します.
ソフトウェア開発の過程で、多くの会社がAD/LDAPを自分のユーザー認証システムに採用している.本稿では、Python言語で提供されるPython-LDapフレームワークを通じて、AD/LDAPのユーザー、組織構造などを操作し、管理することに重点を置いている.
基本概念:
o– organization(  -  )
ou – organization unit(    /  )
c - countryName(  )
dc - domainComponent(    )
sn – suer name(    )
cn - common name(    )
dn - distinguished name(    )

ADとLDAPのフィールドと意味:
  • ユーザテーブルフィールド対応:
               
            dn
        userPrincipalName(AD)/cn(LDAP)
        userPassword
            displayName
            physicalDeliveryOfficeName
        title
        mail
            telephoneNumber
            homePhone
  • 組織構造表対応:
               
            dn
            ou
            description
  • ADにユーザ
  • を作成する.
    
    import ldap
    def create_ad_user(username, unicode_password, org_dn):
        l = ldap.initialize('ldap://172.16.1.163:636') #use secure port default:636
        l.protocol_version = 3
        l.set_option(ldap.OPT_REFERRALS, 0)
        l.simple_bind_s('Administrator', 'P@ssword')
        user = {}
        user['objectclass'] = ['top', 'person', 'organizationalPerson', 'user']
        user_dn = 'cn=%s,%s' % (username,org_dn)
        user['userPrincipalName'] = '%s@%s' % (username, domain)
        user['userAccountControl'] = '66048' # active user account
        user['unicodePwd'] = unicode_password
        ldif = modlist.addModlist(user)
        ret, _ = l.add_s(user_dn, ldif)
        print ret
  • LDAPにユーザ
    import ldap
    def create_ldap_user(username, password, org_dn):
    l = ldap.initialize('ldap://172.16.1.163:389')
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s('Administrator', 'P@ssword')
    user = {}
    user['objectclass'] = ['top', 'person', 'inetOrgPerson']
    user['cn'] = username
    user['sn'] = user['cn']
    user['password'] = password
    user_dn = 'cn=%s,%s' % (username,org_dn)
    ldif = modlist.addModlist(user)
    ret, _ = l.add_s(user_dn, ldif)
    print ret
  • を作成する.
  • AD/LDAPユーザ基本情報
    import ldap
    def modify_user(username):
    firstname = 'Abel'
    lastname = 'Lee'
    l = ldap.initialize('ldap://172.16.1.163:389')
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s('Administrator', 'P@ssword')
    cn = username
    dn = 'cn=%s,ou=org1,dc=testad,dc=com' % cn
    old = {'description': 'old description'}
    new = {'description': 'new description'}
    ldif = ldap.modifyModlist(old, new)
    ret = l.modify_s(dn, ldif)
    l.unbind_s()
    print ret
  • を修正する.
  • AD/LDAPユーザ
    import ldap
    def delete_users(user_dn):
    l = ldap.initialize('ldap://172.16.1.163:389')
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s('Administrator', 'P@ssword')
    ret = l.delete_s(user_dn)
    l.unbind_s()
    print ret
  • を削除する.
  • ADユーザ情報
    import ldap
    def describe_ad_users(org_dn='', usernames = []):
    l = ldap.initialize('ldap://172.16.1.163:389')
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s('Administrator', 'P@ssword')
    USER_ATTRS = ['userAccountControl','displayName','description','homePhone','physicalDeliveryOfficeName','title','mail','telephoneNumber']
    filterstr = '(&(objectclass=user)'
    if len(usernames) > 0:
        filterstr = filterstr + '(|'
    for username in usernames:
        username = '%s@%s' % (username, domain)
        userPrincipalName = '(userPrincipalName=%s)' % username
        filterstr += userPrincipalName
    if len(usernames) > 0:
        filterstr += '))'
    else:
        filterstr += ')'
    if org_dn:
        ret = l.search_s(org_dn, ldap.SCOPE_SUBTREE, filterstr, 
                                           attrlist=USER_ATTRS)
    else:
        ret = l.search_s(base_dn, ldap.SCOPE_SUBTREE, filterstr, 
                                           attrlist=USER_ATTRS) 
    print ret
  • を問い合わせる.
  • LDAPのユーザ
    import ldap
    def describe_ldap_users(org_dn='', usernames = []):
    l = ldap.initialize('ldap://172.16.1.163:389')
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s('Administrator', 'P@ssword')
    USER_ATTRS = ['userAccountControl','displayName','description','homePhone','physicalDeliveryOfficeName','title','mail','telephoneNumber']
    filterstr = '(&(objectclass=person)'
    if len(usernames) > 0:
        filterstr = filterstr + '(|'
    for cn in usernames:
        cn = '(cn=%s)' % cn
        filterstr += cn
    if len(usernames) > 0:
        filterstr += '))'
    else:
        filterstr += ')'
    if org_dn:
        ret = l.search_s(org_dn, ldap.SCOPE_SUBTREE, filterstr, 
                                           attrlist=USER_ATTRS)
    else:
        ret = l.search_s(base_dn, ldap.SCOPE_SUBTREE, filterstr, 
                                           attrlist=USER_ATTRS) 
    print ret
  • を問い合わせる.
  • ADユーザ認証
    import ldap
    def login_ad(user_dn, password):
    l = ldap.initialize('ldap://172.16.1.163:389')
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s(user_dn, password)
    cn = user_dn.split(',')[0].split('=')
    base_dn = 'dc=testad,dc=com'
    domain = 'testad.com'
    username = '%s@%s' % (cn[1], domain)
    ret = l.search_s(base_dn, ldap.SCOPE_SUBTREE,"(userPrincipalName=%s)" % username, ["userPrincipalName"])
    if ret is None or len(ret) == 0:
        return False
    return True
  • LDAPユーザ認証
    import ldap
    def login_ldap(user_dn, password):
    l = ldap.initialize('ldap://172.16.1.163:389')
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s(user_dn, password)
    cn = user_dn.split(',')[0].split('=')
    base_dn = 'dc=testad,dc=com'
    ret = l.search_s(base_dn, ldap.SCOPE_SUBTREE,"%s=%s" % (cn[0], cn[1]))
    if ret is None or len(ret) == 0:
        return False
    return True
  • ADユーザパスワードを設定し、ADユーザパスワードを変更するには、まず認証してから
    import ldap
    def set_ad_password(user_dn, unicode_password):
    l = ldap.initialize('ldap://172.16.1.163:636') #use secure port
    l.simple_bind_s('Administrator', 'P@ssword')
    param_pwd = [(ldap.MOD_REPLACE, 'unicodePwd', [password_utf16]), (ldap.MOD_REPLACE, 'unicodePwd', [password_utf16])]
    ret,_ = l.modify_s(user_dn, param_pwd)
    print ret
  • を設定することができる.
  • LDAPユーザパスワード
    import ldap
    def set_ldap_password(user_dn, password):
    l = ldap.initialize('ldap://172.16.1.163:389')
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s('Administrator', 'P@ssword')
    l.passwd_s(user_dn, None, password)
  • を設定する.
  • LDAPユーザパスワード
    import ldap
    def modify_ldap_password(user_dn, old_password, new_password):
    l = ldap.initialize('ldap://172.16.1.163:389')
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s('Administrator', 'P@ssword')
    l.passwd_s(user_dn, old_password, new_password)
  • を変更する.
  • AD/LDAP組織
    import ldap
    def create_ou(parent_dn, ou):
    l = ldap.initialize('ldap://172.16.1.163:389')
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s('Administrator', 'P@ssword')
    attrs= {'ou': ou}
    attrs['description'] = 'this is description'
    attrs['objectClass'] = ['organizationalUnit','top']
    dn = 'ou=%s,%s' % (attrs['ou'], parent_dn)
    ldif = modlist.addModlist(attrs)
    ret, _ = l.add_s(dn,ldif)
    print ret
  • を作成する.
  • AD/LDAP組織構造
    import ldap
    def modify_ou(attrs={'description': 'new_description'}):
    l = ldap.initialize('ldap://172.16.1.163:389')
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s('Administrator', 'P@ssword')
    old_attrs = {'description': 'old_description'}
    ldif = modlist.modifyModlist(old_attrs, attrs)
    l.modify_s(dn,ldif)
  • を修正する.
  • AD/LDAP組織
    import ldap
    def delete_ou(dn):
    l = ldap.initialize('ldap://172.16.1.163:389')
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0) 
    l.simple_bind_s('Administrator', 'P@ssword')
    l.delete_s(dn)
  • を削除する.
  • クエリーAD/LDAP組織
    import ldap
    def describe_ou(parent_dn='', org_dns=[]):
    ORGANIZATION_ATTRS = ['ou', 'description']
    l = ldap.initialize('ldap://172.16.1.163:389')
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s('Administrator', 'P@ssword')
    filterstr = '(&(objectclass=organizationalUnit)'
    for dn in org_dns:
        objectGUID = '(ou=%s)' % dn
        filterstr += objectGUID
    filterstr += ')'
    if parent_dn:
        ret = l.search_s(parent_dn, ldap.SCOPE_SUBTREE, filterstr, 
                                       attrlist=ORGANIZATION_ATTRS)
    else:
        ret = l.search_s(base_dn, ldap.SCOPE_SUBTREE, filterstr, 
                                       attrlist=ORGANIZATION_ATTRS)
    print ret
  • ユーザが属する組織構造を変更する
    import ldap
    def change_user_in_ou(user_dn, new_org_dn):
    l = ldap.initialize('ldap://172.16.1.163:389')
    l.protocol_version = 3
    l.set_option(ldap.OPT_REFERRALS, 0)
    l.simple_bind_s('Administrator', 'P@ssword')
    cn = user_dn.split(',')[0]
    ret = l.rename_s(user_dn, cn, new_org_dn)
    print ret
  • .
    注意:ADとLDAPでは、ユーザーの作成、ユーザーのクエリーなどの操作で、ポートとクエリーフィールドが異なりますので、特に注意してください.また、コードが不明確な場合は、伝言討論を歓迎します.
    転載先:https://blog.51cto.com/14207158/2352634