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.