LDAP
Laat directorygebruikers zich aanmelden met hun eigen wachtwoord, en geef ze rollen via hun directorygroepen
- Hoe het werkt
- Instellingen
- Groepen
- Koppelen aan rollen
- Meerdere directory’s
- De verbinding testen
- Voorbeeld voor Active Directory
- Voorbeeld voor OpenLDAP
- Veelvoorkomende valkuilen
Hoe het werkt
AnsibleForms maakt verbinding met de directory via een bindaccount, zoekt de gebruiker op en bindt daarna als die gebruiker om het wachtwoord te controleren:
- De gebruiker meldt zich aan met gebruikersnaam en wachtwoord. Als geen enkele lokale gebruiker die naam heeft, wordt LDAP geprobeerd.
- AnsibleForms bindt met het bindaccount van de referentie van de directory, en doorzoekt de Zoekbasis naar een item waarvan het Gebruikersnaam attribuut gelijk is aan de gebruikersnaam.
- Het bindt als het gevonden item, met het getypte wachtwoord.
- De groepen worden uit het item gelezen (of uit een groepszoekopdracht), gefilterd, en krijgen het voorvoegsel
ldap/.
Een gebruikersnaam in UPN-vorm (jdoe@example.com) die geen gebruiker vindt, wordt één keer opnieuw geprobeerd met het deel vóór de @, zodat gebruikers zich met beide vormen kunnen aanmelden, ook als het Gebruikersnaam attribuut de korte naam bevat. Een verkeerd wachtwoord wordt nooit opnieuw geprobeerd.
Eén set instellingen dient voor Active Directory, OpenLDAP en andere; vanaf 7.3.0 kunnen er meerdere directory’s zijn.
Instellingen
Vanaf 7.3.0 gelden de instellingen per directory. Toegang > LDAP toont de directory’s, in de volgorde waarin een kale gebruikersnaam wordt opgezocht:

| Rijmenu | Wat het doet |
|---|---|
| Bewerken | Opent de pagina van de directory |
| Verbinding testen | Probeert een aanmelding met een testgebruikersnaam en -wachtwoord, zie De verbinding testen |
| Inschakelen, Uitschakelen | Schakelt de directory in of uit; main wordt uitgeschakeld in plaats van verwijderd |
| Omhoog, Omlaag | Wijzigt de plaats in de opzoekvolgorde |
| Verwijderen | Verwijdert de directory; bij main getoond maar uitgeschakeld |
Het toevoegen van een directory vraagt de velden in vier stappen, de tabbladen van de pagina. Details bevat Ingeschakeld, de Naam en een Beschrijving:
| Tabblad | Instelling | Betekenis |
|---|---|---|
| Referenties | Referentie | Verplicht. Een ldap-referentie uit Verbindingen > Inloggegevens, die de verbinding bevat, zie hieronder |
| Gebruikers | Zoekbasis | DN waar het zoeken naar gebruikers begint, bijv. OU=Users,DC=example,DC=com. Subbomen worden ook doorzocht |
| Gebruikers | Gebruikersnaam attribuut | Attribuut dat met de aanmeldnaam wordt vergeleken: sAMAccountName in AD (de standaard), uid in OpenLDAP |
| Gebruikers | Mail attribuut | Attribuut met het e-mailadres, meestal mail |
| Gebruikers | Aanmelddomeinen | Domeinen waarvan aanmeldingen als user@domain rechtstreeks naar deze directory gaan, zie Meerdere directory’s |
| Groepen | Groepen attribuut | Attribuut van het gebruikersitem dat de groepen bevat (memberOf, de standaard), of groups met een groepszoekopdracht |
| Groepen | Groepen zoekbasis | DN waar het zoeken naar groepen begint |
| Groepen | Groep klasse | objectClass van de groepen, bijv. group, groupOfNames of posixGroup |
| Groepen | Groepslid attribuut | Attribuut van een groep dat de leden opsomt, bijv. member, uniqueMember of memberUid; standaard member |
| Groepen | Groepslid gebruiker attribuut | Attribuut van de gebruiker dat in die lidwaarden staat, bijv. dn of uid; standaard dn |
| Groepen | Groepfilter | Reguliere expressie; alleen de groepen waarvan de naam overeenkomt blijven over. Leeg houdt elke groep |
De standaardwaarden van de laatste drie groepsvelden gelden alleen als de groepszoekopdracht wordt gebruikt, zie de volgende sectie.
De ldap-referentie bepaalt hoe de directory wordt bereikt en als wie er wordt gezocht:
| Veld | Betekenis |
|---|---|
| Servers | Eén per veld, als host, host:port of ldaps://host:port, in deze volgorde geprobeerd: als er een onbereikbaar is, wordt de volgende geprobeerd |
| Poort | 389 voor gewone LDAP, 636 voor LDAPS |
| TLS inschakelen | Verbinden met LDAPS (ldaps://). StartTLS op poort 389 wordt niet ondersteund |
| Certificaten negeren | De validatie van het servercertificaat overslaan. Alleen getoond met TLS inschakelen |
| Certificaat | Het clientcertificaat dat AnsibleForms aan de servers presenteert, in PEM, wanneer de certificaten worden gecontroleerd |
| CA-bundel | Het CA-certificaat of de CA-certificaten die het servercertificaat hebben ondertekend, in PEM, wanneer de certificaten worden gecontroleerd |
| Bind gebruiker DN | De DN van het serviceaccount dat de directory doorzoekt |
| Bind gebruiker wachtwoord | Het wachtwoord ervan, versleuteld opgeslagen of gelezen uit een secret store |
Alleen een admin kan een ldap-referentie toevoegen of wijzigen, zie Wie een referentie mag wijzigen. Tot en met 7.2.0 waren de servers, TLS en het bindaccount velden van de LDAP-instellingen. De upgrade naar 7.3.0 verplaatst ze naar een referentie, zie Adressen in referenties:
| De directory vóór de upgrade | Waar de servers naartoe gaan |
|---|---|
| Een eigen bind-DN en wachtwoord, geen referentie | Een nieuwe ldap-referentie met de naam <directory>-ldap, zoals main-ldap |
| Een referentie zonder servers | Naar die referentie |
| Een referentie die al andere servers bevat | Een kopie van de referentie met de naam <credential>-<directory>, die de directory dan noemt |
Een naam die al bezet is, krijgt -2, -3 enzovoort. Een directory uit de configuratie-seed blijft zoals hij is: de seed is er eigenaar van.
Groepen
De groepen komen van een van twee plaatsen, en het Groepen attribuut bepaalt welke wordt gebruikt:
- Een attribuut van het gebruikersitem, meestal
memberOf. Dit is de gebruikelijke opzet voor Active Directory, en voor OpenLDAP met de overlaymemberof. - Een groepszoekopdracht, voor directory’s zonder
memberOf. Die draait alleen als Groepen zoekbasis en Groep klasse allebei zijn ingesteld: AnsibleForms zoekt dan naar groepen van die klasse waarvan het Groepslid attribuut het Groepslid gebruiker attribuut van de gebruiker bevat, en slaat het resultaat op in het attribuutgroups. Zet Groepen attribuut opgroupsom het te gebruiken.
Met Groepen attribuut
memberOfdraait een geconfigureerde groepszoekopdracht wel, maar wordt het resultaat niet voor de rollen gebruikt.
Elke groep is een DN, en AnsibleForms houdt de eerste CN: CN=AF-Admins,OU=Groups,DC=example,DC=com wordt AF-Admins. Het Groepfilter wordt dan op die naam toegepast, en de overgebleven groepen krijgen het voorvoegsel ldap/: ldap/AF-Admins.
In grote directory’s houdt het filter tokens en jobs klein; een ongeldige reguliere expressie houdt alle groepen en wordt gelogd.
Koppelen aan rollen
In config.yaml is een LDAP-groep ldap/<group CN> en een LDAP-gebruiker ldap/<username>, beide hoofdlettergevoelig:
roles:
- name: admin
groups:
- local/admins
- ldap/AF-Admins
- name: operator
groups:
- ldap/AF-Operators
users:
- ldap/jdoe
De gebruikersnaam is de waarde van het Gebruikersnaam attribuut zoals de directory die teruggeeft, niet zoals de gebruiker hem typte. Zie Rollen voor de rolinstellingen.
Meerdere directory’s
Vanaf 7.3.0 kunnen er meerdere directory’s zijn, elk met eigen servers, gebruikers en groepen. Hun namen houden hun leden uit elkaar:
| Directory | Gebruikersnaam | Groepen | In een rol |
|---|---|---|---|
main | jdoe | ldap/AF-Admins | ldap/jdoe, ldap/AF-Admins |
Elke andere, zoals corp | corp/jdoe | ldap/corp/AF-Admins | ldap/corp/jdoe, ldap/corp/AF-Admins |
Een gebruiker noemt de directory bij het aanmelden als corp\jdoe of corp/jdoe, of meldt zich aan met een adres van een domein dat de directory bezit. Een kale gebruikersnaam wordt in elke ingeschakelde directory geprobeerd, in hun volgorde, en dat geldt ook voor een naam zoals other\jdoe als er geen directory other heet: die wordt dan opgezocht zoals getypt.
De eerste directory die de gebruiker kent, beslist: een verkeerd wachtwoord daar is het antwoord, en de volgende directory wordt niet geprobeerd, omdat die iemand anders met dezelfde naam kan bevatten. Een directory die onbereikbaar is, wordt overgeslagen.
De directory die tot en met 7.2.0 default heette, heet vanaf 7.3.0 main: de upgrade hernoemt hem, en een nieuwe installatie begint met main. De leden behouden hun korte namen, dus de rollen die ze noemen hoeven niet te worden gewijzigd. De directory main kan niet worden hernoemd, en een directorynaam bevat alleen letters, cijfers, - en _.
De verbinding testen
Verbinding testen vraagt om een testgebruikersnaam en -wachtwoord, en probeert een aanmelding met de instellingen op het scherm, opgeslagen of niet. Bij succes toont het het directory-item van de gebruiker, dat je de exacte attribuutnamen en groeps-DN’s laat zien die je moet gebruiken.
Een testgebruiker die niet bestaat, meldt toch succes: de verbinding en het bindaccount werken, alleen de gebruiker wordt niet gevonden. Typische fouten:
| Bericht | Oorzaak |
|---|---|
Bad server or port (connection failed) | De hostnaam wordt niet opgelost of de poort is niet bereikbaar. |
Wrong binding credentials | De bind-DN of het wachtwoord van de referentie van de directory is onjuist. |
Unable to verify the certificate | Het servercertificaat is niet ondertekend door de CA-bundel van de referentie. |
Certificate is not valid | Het Certificaat of de CA-bundel van de referentie bevat geen geldig PEM-certificaat. |
Voorbeeld voor Active Directory
Dit voorbeeld maakt via LDAPS verbinding met twee domeincontrollers en houdt alleen de groepen waarvan de naam met AF- begint:
| Instelling | Waarde |
|---|---|
| Referentie > Servers | dc01.example.com, daarna dc02.example.com |
| Referentie > Poort | 636 |
| Referentie > TLS inschakelen | aan |
| Referentie > Certificaten negeren | uit, met een clientcertificaat en de CA-keten van de enterprise-CA |
| Referentie > Bind gebruiker DN | CN=svc-ansibleforms,OU=Service Accounts,DC=example,DC=com |
| Zoekbasis | OU=Users,DC=example,DC=com |
| Mail attribuut | mail |
| Gebruikersnaam attribuut | sAMAccountName |
| Groepen attribuut | memberOf |
| Groepfilter | ^AF- |
Leden van CN=AF-Operators,… matchen rollen met ldap/AF-Operators, en melden zich aan als jdoe of jdoe@example.com.
Voorbeeld voor OpenLDAP
Dit voorbeeld gebruikt een groepszoekopdracht op items van het type groupOfNames, zodat het zonder de overlay memberof werkt:
| Instelling | Waarde |
|---|---|
| Referentie > Servers | ldap.example.com |
| Referentie > Poort | 636 |
| Referentie > TLS inschakelen | aan |
| Referentie > Bind gebruiker DN | cn=readonly,dc=example,dc=com |
| Zoekbasis | ou=people,dc=example,dc=com |
| Mail attribuut | mail |
| Gebruikersnaam attribuut | uid |
| Groepen attribuut | groups |
| Groepen zoekbasis | ou=groups,dc=example,dc=com |
| Groep klasse | groupOfNames |
| Groepslid attribuut | member |
| Groepslid gebruiker attribuut | dn |
Een gebruiker die in cn=af-admins,ou=groups,dc=example,dc=com staat, krijgt de groep ldap/af-admins. Gebruik voor groepen van het type posixGroup Groepslid attribuut memberUid en Groepslid gebruiker attribuut uid.
Laat met de overlay memberof de velden van de groepszoekopdracht leeg en zet Groepen attribuut op memberOf.
Veelvoorkomende valkuilen
De meeste LDAP-problemen komen neer op een van deze:
- Een lokale gebruiker met dezelfde naam. Lokale gebruikers worden eerst gecontroleerd, dus de directory wordt nooit naar die naam gevraagd.
- Geen groepen, of de verkeerde. Het Groepen attribuut moet bestaan (
groupsmet een groepszoekopdracht);memberOfslaat nesting over. - Groepsnamen die niet overeenkomen. Gebruik
ldap/<CN>met dezelfde hoofdletters, en controleer of het Groepfilter de groep behoudt. - Groeps-DN’s die niet met een CN beginnen. Alleen de eerste waarde
CN=wordt als groepsnaam gebruikt, dus elke groeps-DN moet metCN=(ofcn=) beginnen. - Certificaten. TLS heeft beide certificaatvelden van de referentie nodig en een overeenkomende servernaam; Certificaten negeren is alleen om te testen.
- Instellingen die niet kunnen worden opgeslagen. Als een directory uit de configuratie-seed komt, is de pagina ervan alleen-lezen: wijzig dan het seedbestand.
Een mislukte aanmelding toont een algemeen bericht. De reden wordt door de server gelogd en in het auditlogboek bewaard, en voor Active Directory wordt ze vertaald vanuit de code van de directory, bijv. Wrong password, Account locked of Password expired.