0

正常に動作する Python を使用して Active Directory サーバーにクエリを実行しようとしました。しかし、暗号化されていない資格情報をネットワーク上で送信したくないので、LDAP を使用したいと考えています。これを行う簡単な方法はありますか?これまでに見つけたのは、このオプションを追加する必要があるということだけでした:

l.set_option(ldap.OPT_X_TLS_CACERTFILE,'/path/to/my/Ca.pem')

しかし、実際には、CA証明書または正しい証明書を取得して、それを検証したくありません。確かに、セキュリティの観点から、通信パートナーが正しいことを確認する必要がありますが、内部ネットワークは気にせず、これをより簡単に処理したいと考えています。LDAP URL を ldap から ldaps に変更すると、次のエラーが発生します。

Traceback (most recent call last):
  File "./ldap-to-sql.py", line 21, in <module>
    bind = l.simple_bind_s(USERNAME, PASS)
  File "/usr/local/lib/python2.7/site-packages/ldap/ldapobject.py", line 214, in simple_bind_s
    msgid = self.simple_bind(who,cred,serverctrls,clientctrls)
  File "/usr/local/lib/python2.7/site-packages/ldap/ldapobject.py", line 208, in simple_bind
    return self._ldap_call(self._l.simple_bind,who,cred,RequestControlTuples(serverctrls),RequestControlTuples(clientctrls))
  File "/usr/local/lib/python2.7/site-packages/ldap/ldapobject.py", line 106, in _ldap_call
    result = func(*args,**kwargs)
ldap.SERVER_DOWN: {'info': 'SSLHandshake() failed: misc. bad certificate (-9825)', 'desc': "Can't contact LDAP server"}
4

2 に答える 2

1

私は Samba4 DC と python ldap モジュールでいくつかのテストを行っていましたが、この例を実行しました:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

import ldap, ldapurl, subprocess, sys, shlex, os

GrupoLDAP = "Domain Users" #Grupo a recuperar
CACert = '/etc/cert/ca.cert.pem' #Certificado CA

ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, CACert)
ldap.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_HARD)

proto = 'ldaps' #Protocolo
server = 'domain.com' #Dirección del servidor (mismo nombre del Certificado)
port = 636 #Puerto seguro para ldaps

try:
    url = ldapurl.LDAPUrl(urlscheme=proto, hostport="%s:%s" % (server, str(port))).initializeUrl()
    ldap_obj = ldap.initialize(url)
    ldap_obj.simple_bind_s('user@domain.com','PassWord')

    base = 'OU=Users,DC=domain,DC=com' #Ruta y UO del grupo

    scope = ldap.SCOPE_SUBTREE

    query = '(&(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))'

    res_attrs = ['sAMAccountName', 'cn']
    #res_attrs = ['*']
    res = ldap_obj.search_s(base, scope, query, res_attrs)
except ldap.LDAPError as Error:
    print "Ha ocurrido un error al conectar o realizar la query al servidor LDAP:\n\n%s" % Error
    sys.exit(1)

証明書は、CN に FQDN が必要であり、証明書エラーを回避するために CA 証明書によって署名されている必要があります。同じ FQDN に 2 番目の DC を追加するまでは機能していましたが、DC が 1 つしかない場合は機能するはずです。Windows LDAP でどのように機能するかはわかりませんが、似ているようです。

ごきげんよう!!

于 2015-06-23T21:35:35.273 に答える