Pythoni LDAP liides25. Feb '16

Sissejuhatus

Microsoft Active Directory'st ning Samba-baasil domeenikontrollerist saab andmeid pärida üle LDAP protokolli. Mõlemad toetavad ka GSSAPI-t, mis võimaldab autentida osapooli ning krüpteerida liiklust.

Python 3.x jaoks pole veel saadaval LDAP-i moodulit mis toetaks Kerberost ja GSSAPI-t. Python 2.x jaoks saab säärase mooduli paigaldada:

apt-get install python-ldap

Igaks juhuks veendu, et ka vastavad SASL moodulid ning Kerberose tööriistad on paigaldatud:

apt-get install krb5-user libsasl2-modules-gssapi-heimdal

Kasutaja kontoga

Järgnevas näites küsitakse kasutajate nimed ja e-posti aadressid AD-st üle LDAP-i kasutades SASL teeke autentimiseks ning ka transportkihi krüpteerimiseks analoogselt ldapsearch käsule. Näide eeldab et on autenditud Kerberosega -- logi sisse domeeni kontoga või tee lihtsalt:

kinit kasutaja@EXAMPLE.COM

Pista järgnev .py faili ning käivita see Python abil:

#!/usr/bin/python2
import ldap, ldap.sasl
conn = ldap.initialize('ldap://dc1.example.com')
conn.set_option(ldap.OPT_REFERRALS, 0)
conn.sasl_interactive_bind_s('', ldap.sasl.gssapi())
attribs = 'cn','mail', 'userPrincipalName'
search_filter = '(&(objectClass=user)(objectCategory=person))'
r = conn.search_s('dc=example,dc=com', ldap.SCOPE_SUBTREE, search_filter, attribs)
for dn,entry in r:
    if not dn: continue
    full_name, = entry.get("cn")
    mail, = entry.get("mail") or entry.get("userPrincipalName") or (None,)
    if not mail: continue
    print "%s <%s>, " % (full_name, mail),

Masina kontoga

Arvuti domeeni liitmisel luuakse /etc/krb5.keytab, mille abil saab masin end tuvastada domeenikontrollerile. Täielikult automatiseeritud variant mida peab käitama root kasutaja õigustes ning mille saab näiteks croni pista oleks järgnev:

import ldap, ldap.sasl
from subprocess import call
from ConfigParser import ConfigParser

cp = ConfigParser()
cp.read("/etc/samba/smb.conf")
domain = cp.get("global", "realm").lower()
base = ",".join(["dc=" + j for j in domain.split(".")])
cmd = "kinit", "-k", cp.get("global", "netbios name") + "$"
call(cmd)

conn = ldap.initialize('ldap://' + domain)
conn.set_option(ldap.OPT_REFERRALS, 0)
conn.sasl_interactive_bind_s('', ldap.sasl.gssapi())

attribs = 'cn','mail', 'userPrincipalName'
search_filter = '(&(objectClass=user)(objectCategory=person))'

for dn,entry in conn.search_s(base, ldap.SCOPE_SUBTREE, search_filter, attribs):
    if not dn: continue
    full_name, = entry.get("cn")
    mail, = entry.get("mail") or entry.get("userPrincipalName") or (None,)
    if not mail: continue
    print "%s <%s>, " % (full_name, mail),

Kokkuvõte

Käesolevatele koodijuppidele võib leida tosin huvitavat rakendusala - sisselogimisel võrguketaste lisamine järjehoidjatesse, printerite lisamine grupipoliitika alusel vms aga sellest juba järgmine kord.

Python LDAP Kerberos GSSAPI