LDAP-innstillinger
From LimeSurvey Manual
Generelt
Du må aktivere LDAP-støtte i config.php og konfigurere LDAP-parametere i config/ldap.php for å kunne bruke denne funksjonen.
Aktivere LDAP i config.php
- $enableLdap: hvis du vil bruke LDAP-funksjoner i LimeSurvey, må du sette denne parameteren til true (den er satt til false som standard):
'config'=>array( 'debug'=>0, 'debugsql'=>0, 'enableLdap'=>true, )
Definere LDAP-servere
Definer først tilkoblingsalternativene for LDAP-serveren i «application/config/ldap.php». Følgende alternativer er tilgjengelige for hver server:
- $serverId: Et heltall som identifiserer denne LDAP-serveren. Det brukes i spørringsdefinisjoner for å knytte en server til en bestemt spørring;
- $ldap_server[$serverId]['server']: IP-adressen eller DNS-navnet til LDAP-serveren. Hvis du bruker SSL-sikrede tilkoblinger (LDAPs eller LDAP+Start-TLS), må dette navnet samsvare med serverens sertifikat-CN (eller SubjectAlternativeName);
- $ldap_server[$serverId]['port']: TCP-porten LDAP-serveren lytter på. Dette er vanligvis 389 for LDAP og LDAP+Start-TLS, og 636 for LDAPs;
- $ldap_server[$serverId]['protoversion']: Kan være 'ldapv2' eller 'ldapv3', avhengig av protokollen serveren din støtter. 'ldapv3' er den foretrukne protokollen. Hvis du vil bruke krypterte tilkoblinger, må du være oppmerksom på at LDAPs støttes i 'ldapv2'-modus, mens Start-TLS er krypteringsmetoden for 'ldapv3';
- $ldap_server[$serverId]['encrypt']: Definerer hvilken krypteringsmetode som brukes. 'ldaps' støttes for 'ldapv2'-servere, 'start-tls' for 'ldapv3'-servere. Nøkkelordet 'none' brukes for LDAP-kommunikasjon i klartekst;
- Ikke glem at ved kryptering med 'ldaps' eller 'start-tls' må webserveren kunne kontrollere LDAP-serverens sertifikat. Du må derfor definere sertifiseringsinstansen (Certificate Authority) i openldap-biblioteket ditt (dette gjøres vanligvis i filen /etc/openldap/ldap.conf under Linux).
- $ldap_server[$serverId]['referrals']: Dette er en boolsk parameter som bestemmer om referrals skal følges eller ikke (bruk false for ActiveDirectory);
- $ldap_server[$serverId]['encoding']: Dette er en valgfri parameter som angir tegnkodingen LDAP-katalogen bruker for å lagre strenger. Du trenger vanligvis ikke å sette opp denne parameteren, siden standard kodingen, 'utf-8', er standard koding for LDAP-kkataloger. Hvis du imidlertid bruker Active Directory og har problemer med å importere strenger med aksenttegn, kan du prøve å sette denne parameteren til kodingen som brukes i ditt område (for eksempel 'cp850' for Vest-Europa). Du kan se rullegardinlisten «Tegnsett i denne filen» i grensesnittet Importer fra CSV-fil for å se hele listen over støttede kodinger.
Deretter må du definere hvilken autentisering som kreves for å få tilgang til katalogen. Hvis 'anonym' tilgang er tillatt, skal du IKKE sette de to følgende parameterne. Ellers setter du dem tilsvarende:
- $ldap_server[$serverId]['binddn']: DN til 'LDAP'-brukeren som har lov til å lese katalogen;
- $ldap_server[$serverId]['bindpw']: Passord for LDAP-brukeren ovenfor.
Hvis du trenger å definere flere LDAP-servere, legger du til følgende linje for å øke serverID og definere nye parametere:
- $serverId++.
Definere spørringer i config/ldap.php
Advarsel: når et ldap-attributtnavn kreves i en av disse parameterne, må du bare bruke små bokstaver: for eksempel displayname og IKKE displayName.
Se filen config/ldap.php, som inneholder eksempelkonfigurasjoner.
Enkle spørringer
La oss begynne med enkle spørringer. Disse spørringene filtrerer bare LDAP-oppføringer basert på deres egne attributter og plassering. De er vanligvis nok for spørringer mot ActiveDirectory.
- $query_id: er ID-en til LDAP-spørringen;
- $ldap_queries[$query_id]['ldapServerId']: Knytter spørringen til en bestemt server;
- $ldap_queries[$query_id]['name']: Streng som beskriver spørringen. Den vises i grensesnittet;
- $ldap_queries[$query_id]['userbase']: Rot-DN som brukes for brukersøk;
- $ldap_queries[$query_id]['userfilter']: Et filter som brukes til å velge potensielle brukeroppføringer. Det må omsluttes av parenteser;
- $ldap_queries[$query_id]['userscope']: omfanget av LDAP-søket etter brukere ('base', 'one' eller 'sub');
- $ldap_queries[$query_id]['firstname_attr']: Ldap-attributt som kobles til fornavnsfeltet i token-oppføringen;
- $ldap_queries[$query_id]['lastname_attr']: Ldap-attributt som kobles til etternavnsfeltet i token-oppføringen;
- $ldap_queries[$query_id]['email_attr']: Ldap-attributt som kobles til e-postadressefeltet i token-oppføringen.
Valgfritt kan du hente ut mer informasjon fra katalogen:
- $ldap_queries[$query_id]['token_attr']: Ldap-attributt som kobles til token-koden;
- $ldap_queries[$query_id]['language']: Ldap-attributt som kobles til brukerens språkkode;
- $ldap_queries[$query_id]['attr1']: Ldap-attributt som kobles til feltet attribute_1;
- $ldap_queries[$query_id]['attr2']: Ldap-attributt som kobles til feltet attribute_2.
Kombinerte gruppespørringer med DN-medlemmer
La oss nå se hvordan du definerer en mer komplisert spørring.
Følgende spørringer bruker et første LDAP-søk som ser i LDAP-grupper. En LDAP-gruppe er en LDAP-oppføring som inneholder referanser til brukeroppføringer i form av:
- bruker-ID-er (for eksempel posixGroups) ==> Se neste avsnitt
- Eller bruker-DN-er (for eksempel groupofnames og groupofuniquenames) ==> se nedenfor
Her behandler vi grupper som inneholder bruker-DN-er:
- definer $query_id, $ldap_queries[$query_id]['ldapServerId'], $ldap_queries[$query_id]['name'] som forklart ovenfor.
Definer deretter parameterne for gruppefilteret:
- $ldap_queries[$query_id]['groupbase']: Rot-DN der du vil starte søket etter gruppeoppføringer;
- $ldap_queries[$query_id]['groupfilter']: LDAP-filteret som velger potensielle gruppeoppføringer;
- $ldap_queries[$query_id]['groupscope']: Omfanget av LDAP-søket etter grupper ('one', 'base' eller 'sub');
- $ldap_queries[$query_id]['groupmemberattr']: Navnet på LDAP-attributten i gruppeoppføringen som inneholder referanser til brukeroppføringer;
- $ldap_queries[$query_id]['groupmemberisdn']: TRUE.
På dette tidspunktet er alt satt opp slik at det første LDAP-søket finner brukere som tilhører de valgte gruppene. Du kan imidlertid begrense hvilke av disse «brukerkandidatene» som velges ved å bruke et ytterligere filter på dem. Dette er selvsagt valgfritt:
- $ldap_queries[$query_id]['userbase']: Base-DN for LDAP-brukersøket (bare brukerkandidater som samsvarer med denne basen velges);
- $ldap_queries[$query_id]['userscope']: Omfang for LDAP-brukersøket (bare brukerkandidater som samsvarer med userbase+scope velges);
- $ldap_queries[$query_id]['userfilter']: Et filter som brukes på hver brukerkandidatoppføring (på attributtene) for å legge til et ekstra utvalg.
Kombinerte gruppespørringer med UID-medlemmer
La oss nå se hvordan du definerer en kombinert gruppespørring når gruppemedlemmene er bruker-UID-er og ikke bruker-DN-er.
Som for gruppespørringer med DN-medlemmer bruker disse spørringene et første LDAP-søk som leter etter LDAP-gruppeoppføringer og henter medlemmene deres. Disse medlemsverdiene brukes deretter i et brukersøkefilter for å finne tilsvarende oppføringer. Derfor må en ekstra parameter konfigureres for å definere brukerattributten i brukeroppføringen som skal samsvare med medlems-UID-en som finnes i gruppene.
La oss gå gjennom de nødvendige parameterne:
- definer $query_id, $ldap_queries[$query_id]['ldapServerId'], $ldap_queries[$query_id]['name'] som forklart ovenfor
Definer deretter parameterne for gruppefilteret:
- $ldap_queries[$query_id]['groupbase']: Rot-DN der du vil starte søket etter gruppeoppføringer;
- $ldap_queries[$query_id]['groupfilter']: LDAP-filteret som velger potensielle gruppeoppføringer;
- $ldap_queries[$query_id]['groupscope']: Omfanget av LDAP-søket etter grupper ('one', 'base' eller 'sub');
- $ldap_queries[$query_id]['groupmemberattr']: Navnet på LDAP-attributten i gruppeoppføringen som inneholder referanser til brukeroppføringer;
- $ldap_queries[$query_id]['groupmemberisdn']: FALSE;
- $ldap_queries[$query_id]['useridattr']: navnet på brukerattributten som må samsvare med UID-en som finnes i gruppemedlemmene.
På dette tidspunktet er alt satt opp slik at det første LDAP-søket finner bruker-UID-er som tilhører de valgte gruppene, og et brukersøkefilter fylles ut automatisk.
Du kan imidlertid begrense hvilke av disse «brukerkandidatene» som velges ved å utfylle det automatiske brukerfilteret som beregnes fra medlems-UID-ene. Dette er selvsagt valgfritt:
- $ldap_queries[$query_id]['userbase']: Base-DN for LDAP-brukersøket (bare brukerkandidater som samsvarer med denne basen velges);
- $ldap_queries[$query_id]['userscope']: Omfang for LDAP-brukersøket (bare brukerkandidater som samsvarer med userbase+scope velges);
- $ldap_queries[$query_id]['userfilter']: Et filter som brukes på hver brukerkandidatoppføring (på attributtene) for å legge til et ekstra utvalg.
Hva med Active Directory?
Active Directory (AD) er et register fra Microsoft som kan spørres via LDAP-protokollen.
Det er dermed mulig å bruke innholdet til token-spørringer i LimeSurvey, men det krever kunnskap om hvordan AD er organisert.
- LDAP-rotbasen er dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1
==> Hvis for eksempel bedriften din eier DNS-domenet 'my-company.com' og Windows-domenet ditt er 'employees', er rotbasen din dc=employees,dc=my-company,dc=com
- Brukere og brukergrupper er lagret under cn=Users,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1 (merk at dette ikke er ou=users);
- Active Directory-grupper:
- Gruppeobjekter inneholder DN-er for medlemmene i attributtet 'member';
- Gruppemedlemskap er også lagret i attributtet memberOf i hver brukeroppføring. Dette attributtet inneholder DN-ene til gruppene brukeren tilhører;
- noen grupper ligger i CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1:
- For eksempel: cn=Administrator,CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1;
I noen tilfeller er det ikke like enkelt å gjøre spørringer mot en Active Directory, så her er et eksempel på en konfigurasjon for å hente informasjon fra en Active Directory:
//Connection to the active directory Server:
$serverId=0;
$ldap_server[$serverId]['server'] = "10.10.10.10";
$ldap_server[$serverId]['port'] = "389";
$ldap_server[$serverId]['protoversion'] = "ldapv2";
$ldap_server[$serverId]['encrypt'] = "none"; // Most AD LDAP servers will not have encryption set by default
$ldap_server[$serverId]['referrals'] = false;
$ldap_server[$serverId]['binddn'] = "domain\\user";
$ldap_server[$serverId]['bindpw'] = "userpassword";
//$ldap_server[$serverId]['binddn'] = "CN=user,OU=user_group,DC=xxx,DC=yyy"; this one will not work with active directory, that´s why you need to use "domain\\user"
//Here is a sample query for getting all active users of an active directory:
$query_id=0;
$ldap_queries[$query_id]['ldapServerId'] = 0;
$ldap_queries[$query_id]['name'] = 'Staff with an enabled account';
$ldap_queries[$query_id]['userbase'] = 'OU=USER_GROUP,DC=xxx,DC=yyy';
$ldap_queries[$query_id]['userfilter'] = '(&(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))';
//AD has no "account is enabled" attribute, so the filter excludes accounts that have the "disabled" flag (bit 2) set in userAccountControl
$ldap_queries[$query_id]['userscope'] = 'sub';
$ldap_queries[$query_id]['firstname_attr'] = 'givenname';
$ldap_queries[$query_id]['lastname_attr'] = 'sn';
$ldap_queries[$query_id]['email_attr'] = 'mail';
$ldap_queries[$query_id]['token_attr'] = ''; // Leave empty for Auto Token generation by phpsv
$ldap_queries[$query_id]['language'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ldap_queries[$query_id]['attr2'] = '';
//You can also filter on group membership through the memberOf attribute of the user. Here is a sample query for getting all active users that are member of the group "samplegroup" in active directory:
$query_id++;
$ldap_queries[$query_id]['ldapServerId'] = 0;
$ldap_queries[$query_id]['name'] = 'All members of samplegroup';
$ldap_queries[$query_id]['userbase'] = 'OU=USER_GROUP,DC=xxx,DC=yyy';
$ldap_queries[$query_id]['userfilter'] = '(&(objectClass=user)(memberOf=CN=samplegroup,OU=Group Global,OU=USER_GROUP,DC=xxx,DC=yyy)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))';
$ldap_queries[$query_id]['userscope'] = 'sub';
$ldap_queries[$query_id]['firstname_attr'] = 'givenname';
$ldap_queries[$query_id]['lastname_attr'] = 'sn';
$ldap_queries[$query_id]['email_attr'] = 'mail';
$ldap_queries[$query_id]['token_attr'] = ''; // Leave empty for Auto Token generation by phpsv
$ldap_queries[$query_id]['language'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ldap_queries[$query_id]['attr2'] = '';
Et annet eksempel på en brukerspørring:
$ldap_queries[$query_id]['userfilter'] = '(&(objectCategory=Person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))'; // AD doesn't recognise enabled accounts in the normal way, so instead, we check users are not disabled
- Vurder å legge til (mail=*) i brukerfiltrene dine for å hoppe over brukere uten e-postadresse.
Eksempel på gruppespørring:
$ldap_queries[$query_id]['groupfilter'] = '(&(objectClass=group)(cn=Domain Admins))'; // AD doesn't use the standard attribute name for groups, so use this example instead.
Opprette én spørring per Active Directory-gruppe automatisk
Hvis du har gruppene for undersøkelsens deltakere i én organisasjonsenhet (OU), trenger du ikke skrive en spørring for hver gruppe. Koden nedenfor lister opp alle grupper i den OU-en og oppretter én spørring per gruppe. Spørringen inkluderer alle aktive medlemmer av gruppen, også medlemmer av nestede grupper.
Legg til koden i config/ldap.php etter server- og spørringsdefinisjonene dine og før linjen //DO NOT CHANGE BELOW HERE. Angi deretter de fire variablene øverst:
- $groupServerId: $serverId for serveren som skal brukes;
- $groupContainer: DN-en til OU-en som inneholder gruppene. Bare grupper som ligger direkte i denne OU-en blir listet opp, ikke grupper i underordnede OU-er;
- $groupUserBase: rot-DN-en som gruppemedlemmene søkes under;
- $groupNameAttr: gruppeattributtet (med små bokstaver) som brukes som spørringsnavn i brukergrensesnittet, for eksempel 'info' (feltet «Notes» i «Active Directory Users and Computers») eller 'description'. Hvis en gruppe ikke har noen verdi i dette attributtet, brukes cn.
$groupServerId = 0;
$groupContainer = 'OU=Survey groups,DC=xxx,DC=yyy';
$groupUserBase = 'DC=xxx,DC=yyy';
$groupNameAttr = 'info';
$srv = $ldap_server[$groupServerId];
$ds = ldap_connect(($srv['encrypt'] == 'ldaps' ? 'ldaps://' : 'ldap://') . $srv['server'] . ':' . $srv['port']);
if ($ds) {
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, $srv['protoversion'] == 'ldapv3' ? 3 : 2);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
// Never send the bind password if Start-TLS was requested but failed
$secure = $srv['encrypt'] != 'start-tls' || @ldap_start_tls($ds);
$bound = $secure && (empty($srv['binddn']) ? @ldap_bind($ds) : @ldap_bind($ds, $srv['binddn'], $srv['bindpw']));
$result = $bound ? @ldap_list($ds, $groupContainer, '(objectCategory=group)', array('cn', $groupNameAttr)) : false;
$groups = $result ? ldap_get_entries($ds, $result) : array('count' => 0);
for ($i = 0; $i < $groups['count']; $i++) {
$query_id++;
$ldap_queries[$query_id]['ldapServerId'] = $groupServerId;
$ldap_queries[$query_id]['name'] = isset($groups[$i][$groupNameAttr][0]) ? $groups[$i][$groupNameAttr][0] : $groups[$i]['cn'][0];
$ldap_queries[$query_id]['userbase'] = $groupUserBase;
// Enabled users with an email address that are members of the group, directly or through nested groups
$ldap_queries[$query_id]['userfilter'] = '(&(objectCategory=person)(objectClass=user)(mail=*)'
. '(!(userAccountControl:1.2.840.113556.1.4.803:=2))'
. '(memberOf:1.2.840.113556.1.4.1941:=' . ldap_escape($groups[$i]['dn'], '', LDAP_ESCAPE_FILTER) . '))';
$ldap_queries[$query_id]['userscope'] = 'sub';
$ldap_queries[$query_id]['firstname_attr'] = 'givenname';
$ldap_queries[$query_id]['lastname_attr'] = 'sn';
$ldap_queries[$query_id]['email_attr'] = 'mail';
$ldap_queries[$query_id]['token_attr'] = '';
$ldap_queries[$query_id]['language'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ldap_queries[$query_id]['attr2'] = '';
}
ldap_unbind($ds);
}
Ting du bør huske på:
- Koden kobler til katalogen hver gang siden «Importer deltakere fra LDAP» åpnes eller sendes inn, slik at nye grupper dukker opp uten at konfigurasjonen endres. Hvis tilkoblingen eller bindingen mislykkes, viser siden bare spørringene du har definert manuelt.
- Matchingsregelen 1.2.840.113556.1.4.1941 (LDAP_MATCHING_RULE_IN_CHAIN) løser opp nestede grupper. Den finnes bare i Active Directory, så dette eksempelet fungerer ikke med andre LDAP-servere. På slike servere bruker du i stedet en kombinert gruppespørring for hver gruppe.
- For også å liste opp grupper i underordnede OU-er av $groupContainer, bytt ut ldap_list med ldap_search.
- For å liste opp grupper fra mer enn én OU, gjenta koden med andre verdier for de fire variablene.
Du finner mer informasjon om LDAP-strukturen i Active Directory på Active Directory Architecture og Active Directory Technical Specification.