LDAP-asetukset
From LimeSurvey Manual
Yleistä
Tämän toiminnon käyttö edellyttää, että LDAP-tuki otetaan käyttöön tiedostossa config.php ja LDAP-parametrit määritetään tiedostossa config/ldap.php.
LDAPin käyttöönotto tiedostossa config.php
- $enableLdap: jos haluat käyttää LDAP-toimintoja LimeSurveyssä, tämän parametrin arvoksi täytyy asettaa true (oletuksena arvo on false):
'config'=>array( 'debug'=>0, 'debugsql'=>0, 'enableLdap'=>true, )
LDAP-palvelimien määrittäminen
Määritä ensin LDAP-palvelinyhteyksien asetukset tiedostossa "application/config/ldap.php". Jokaiselle palvelimelle on käytettävissä seuraavat asetukset:
- $serverId: kokonaisluku, joka tunnistaa tämän LDAP-palvelimen. Sitä käytetään kyselyjen määrityksissä palvelimen liittämiseksi tiettyyn kyselyyn;
- $ldap_server[$serverId]['server']: LDAP-palvelimen IP-osoite tai DNS-nimi. Jos käytät SSL-suojattuja yhteyksiä (LDAPs tai LDAP+Start-TLS), nimen on vastattava palvelimen varmenteen CN-arvoa (tai SubjectAlternativeNamea);
- $ldap_server[$serverId]['port']: TCP-portti, jota LDAP-palvelin kuuntelee. Tämä on yleensä 389 LDAPille ja LDAP+Start-TLS:lle sekä 636 LDAPs:lle;
- $ldap_server[$serverId]['protoversion']: Voi olla 'ldapv2' tai 'ldapv3' sen mukaan, mitä protokollaa palvelimesi tukee. 'ldapv3' on suositeltava protokolla. Huomaa kuitenkin, että jos haluat käyttää salattuja yhteyksiä, LDAPs on tuettu 'ldapv2'-tilassa, kun taas Start-TLS on 'ldapv3':n salaustapa;
- $ldap_server[$serverId]['encrypt']: Määrittää käytettävän salaustavan. 'ldaps' on tuettu 'ldapv2'-palvelimille ja 'start-tls' 'ldapv3'-palvelimille. Avainsanaa 'none' käytetään salaamattomaan LDAP-viestintään;
- Muista, että 'ldaps'- tai 'start-tls'-salauksessa verkkopalvelimen täytyy pystyä tarkistamaan LDAP-palvelimen varmenne. Siksi varmenteen myöntäjä (Certificate Authority) täytyy määrittää openldap-kirjastossa (Linuxissa tämä tehdään yleensä tiedostossa /etc/openldap/ldap.conf).
- $ldap_server[$serverId]['referrals']: Totuusarvoparametri, joka määrittää, seurataanko viittauksia (referrals) vai ei (käytä arvoa false ActiveDirectoryn kanssa);
- $ldap_server[$serverId]['encoding']: Valinnainen parametri, joka kertoo, mitä merkkikoodausta LDAP-hakemisto käyttää merkkijonojen tallentamiseen. Tätä parametria ei yleensä tarvitse asettaa, koska oletuksena oletettu koodaus 'utf-8' on LDAP-hakemistojen vakiokoodaus. Jos kuitenkin käytät Active Directorya ja aksenttimerkkejä sisältävien merkkijonojen tuonnissa on ongelmia, kokeile asettaa tämä parametri alueellasi käytettyyn koodaukseen (esimerkiksi 'cp850' Länsi-Euroopassa). Täydellisen luettelon tuetuista koodauksista löydät CSV-tiedoston tuontinäkymän pudotusvalikosta "Tiedoston merkistö".
Seuraavaksi sinun täytyy määrittää, mikä todennus tarvitaan hakemiston käyttämiseen. Jos 'anonymous'-käyttö on sallittu, ÄLÄ aseta kahta seuraavaa parametria, muussa tapauksessa aseta ne vastaavasti:
- $ldap_server[$serverId]['binddn']: sellaisen 'LDAP'-käyttäjän DN, jolla on oikeus lukea hakemistoa;
- $ldap_server[$serverId]['bindpw']: yllä mainitun LDAP-käyttäjän salasana.
Jos sinun täytyy määrittää muita LDAP-palvelimia, lisää seuraava rivi kasvattamaan serverID:tä ja määritä uudet parametrit:
- $serverId++.
Kyselyjen määrittäminen tiedostossa config/ldap.php
Huomio: kun jokin näistä parametreista edellyttää ldap-attribuutin nimeä, käytä vain pieniä kirjaimia: esimerkiksi displayname EIKÄ displayName.
Katso tiedosto config/ldap.php, sillä se sisältää esimerkkimäärityksiä.
Yksinkertaiset kyselyt
Aloitetaan yksinkertaisilla kyselyillä. Nämä kyselyt suodattavat LDAP-merkintöjä vain niiden omien attribuuttien ja sijainnin perusteella. Ne riittävät yleensä ActiveDirectoryn kyselyyn.
- $query_id: on LDAP-kyselyn tunniste;
- $ldap_queries[$query_id]['ldapServerId']: Liittää kyselyn tiettyyn palvelimeen;
- $ldap_queries[$query_id]['name']: Kyselyn kuvaava merkkijono. Se näytetään käyttöliittymässä;
- $ldap_queries[$query_id]['userbase']: Juuri-DN, jota käytetään käyttäjähauissa;
- $ldap_queries[$query_id]['userfilter']: Suodatin, jolla valitaan mahdolliset käyttäjämerkinnät. Sen täytyy olla sulkeiden sisällä;
- $ldap_queries[$query_id]['userscope']: LDAP-käyttäjähaun laajuus ('base', 'one' tai 'sub');
- $ldap_queries[$query_id]['firstname_attr']: Ldap-attribuutti, joka yhdistetään token-merkinnän Etunimi-kenttään;
- $ldap_queries[$query_id]['lastname_attr']: Ldap-attribuutti, joka yhdistetään token-merkinnän Sukunimi-kenttään;
- $ldap_queries[$query_id]['email_attr']: Ldap-attribuutti, joka yhdistetään token-merkinnän sähköpostiosoite-kenttään.
Halutessasi voit hakea hakemistosta lisätietoja:
- $ldap_queries[$query_id]['token_attr']: Ldap-attribuutti, joka yhdistetään token-koodiin;
- $ldap_queries[$query_id]['language']: Ldap-attribuutti, joka yhdistetään käyttäjän kielikoodiin;
- $ldap_queries[$query_id]['attr1']: Ldap-attribuutti, joka yhdistetään attribute_1-kenttään;
- $ldap_queries[$query_id]['attr2']: Ldap-attribuutti, joka yhdistetään attribute_2-kenttään.
Yhdistetyt ryhmäkyselyt DN-jäsenillä
Katsotaan nyt, miten määritetään monimutkaisempi kysely.
Seuraavat kyselyt käyttävät ensin LDAP-hakua, joka etsii LDAP-ryhmistä. LDAP-ryhmä on LDAP-merkintä, joka sisältää viittauksia käyttäjien merkintöihin jommassakummassa seuraavista muodoista:
- käyttäjätunnukset (esimerkiksi posixGroups) ==> Katso seuraava osio
- tai käyttäjien DN:t (esimerkiksi groupofnames ja groupofuniquenames) ==> katso alla
Tässä käsitellään ryhmiä, jotka sisältävät käyttäjien DN:t:
- määritä $query_id, $ldap_queries[$query_id]['ldapServerId'], $ldap_queries[$query_id]['name'] kuten edellä on selitetty.
Määritä sitten ryhmäsuodattimen parametrit:
- $ldap_queries[$query_id]['groupbase']: Juuri-DN, josta haluat aloittaa ryhmämerkintöjen etsinnän;
- $ldap_queries[$query_id]['groupfilter']: LDAP-suodatin, joka valitsee mahdolliset ryhmämerkinnät;
- $ldap_queries[$query_id]['groupscope']: LDAP-ryhmähaun laajuus ('one', 'base' tai 'sub');
- $ldap_queries[$query_id]['groupmemberattr']: Ryhmämerkinnän LDAP-attribuutin nimi, joka sisältää viittaukset käyttäjien merkintöihin;
- $ldap_queries[$query_id]['groupmemberisdn']: TRUE.
Tässä vaiheessa kaikki on valmiina, jotta ensimmäinen LDAP-haku löytää valittuja ryhmiä vastaavat käyttäjät. Voit kuitenkin rajata, mitkä näistä "käyttäjäehdokkaista" valitaan, käyttämällä niihin toista suodatinta. Tämä on tietenkin valinnaista:
- $ldap_queries[$query_id]['userbase']: Käyttäjien LDAP-haun perus-DN (vain tähän kantaan sopivat käyttäjäehdokkaat valitaan);
- $ldap_queries[$query_id]['userscope']: Käyttäjien LDAP-haun laajuus (vain userbase+scope-määritykseen sopivat käyttäjäehdokkaat valitaan);
- $ldap_queries[$query_id]['userfilter']: Suodatin, jota sovelletaan jokaiseen käyttäjäehdokkaan merkintään (sen attribuutteihin) lisävalintana.
Yhdistetyt ryhmäkyselyt UID-jäsenillä
Katsotaan nyt, miten määritetään yhdistetty ryhmäkysely, kun ryhmän jäsenet ovat käyttäjien UID-tunnuksia eivätkä käyttäjien DN:iä.
Kuten DN-jäsenillä toimivat ryhmäkyselyt, nämä kyselyt käyttävät ensin LDAP-hakua, joka etsii LDAP-ryhmämerkinnät ja hakee niiden jäsenet. Näitä jäsenarvoja käytetään sitten käyttäjähaun suodattimessa vastaavien merkintöjen etsimiseen. Siksi täytyy määrittää toinen parametri, joka kertoo käyttäjämerkinnän attribuutin, jonka tulee vastata ryhmistä löytyvää jäsenen UID-tunnusta.
Käydään läpi tarvittavat parametrit:
- määritä $query_id, $ldap_queries[$query_id]['ldapServerId'], $ldap_queries[$query_id]['name'] kuten edellä on selitetty
Määritä sitten ryhmäsuodattimen parametrit:
- $ldap_queries[$query_id]['groupbase']: Juuri-DN, josta haluat aloittaa ryhmämerkintöjen etsinnän;
- $ldap_queries[$query_id]['groupfilter']: LDAP-suodatin, joka valitsee mahdolliset ryhmämerkinnät;
- $ldap_queries[$query_id]['groupscope']: LDAP-ryhmähaun laajuus ('one', 'base' tai 'sub');
- $ldap_queries[$query_id]['groupmemberattr']: Ryhmämerkinnän LDAP-attribuutin nimi, joka sisältää viittaukset käyttäjien merkintöihin;
- $ldap_queries[$query_id]['groupmemberisdn']: FALSE;
- $ldap_queries[$query_id]['useridattr']: sen käyttäjäattribuutin nimi, jonka täytyy vastata ryhmän jäsenistä löytyvää UID-tunnusta.
Tässä vaiheessa kaikki on valmiina, jotta ensimmäinen LDAP-haku löytää valittuja ryhmiä vastaavat käyttäjien UID-tunnukset, ja käyttäjähaun suodatin täytetään automaattisesti.
Voit kuitenkin rajata, mitkä näistä 'käyttäjäehdokkaista' valitaan, täydentämällä jäsenten UID-tunnuksista laskettua automaattista käyttäjäsuodatinta. Tämä on tietenkin valinnaista:
- $ldap_queries[$query_id]['userbase']: Käyttäjien LDAP-haun perus-DN (vain tähän kantaan sopivat käyttäjäehdokkaat valitaan);
- $ldap_queries[$query_id]['userscope']: Käyttäjien LDAP-haun laajuus (vain userbase+scope-määritykseen sopivat käyttäjäehdokkaat valitaan);
- $ldap_queries[$query_id]['userfilter']: Suodatin, jota sovelletaan jokaiseen käyttäjäehdokkaan merkintään (sen attribuutteihin) lisävalintana.
Entä Active Directory?
Active Directory (AD) on Microsoftin hakemisto, jota voi kysellä LDAP-protokollan avulla.
Sen sisältöä on siis mahdollista käyttää LimeSurveyn tokenkyselyissä, mutta se edellyttää tietämystä siitä, miten AD on organisoitu.
- LDAP-juuripolku on dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1
==> Jos esimerkiksi yrityksesi omistaa DNS-verkkotunnuksen 'my-company.com' ja Windows-toimialueesi on 'employees', juuripolkusi on dc=employees,dc=my-company,dc=com
- Käyttäjät ja käyttäjäryhmät on tallennettu polun cn=Users,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1 alle (huomaa, että tämä ei ole ou=users);
- Active Directoryn ryhmät:
- Ryhmäobjektit sisältävät jäsenten DN-tunnukset 'member'-attribuutissaan;
- Ryhmäjäsenyydet tallennetaan myös jokaisen käyttäjäkohteen memberOf-attribuuttiin. Tämä attribuutti sisältää niiden ryhmien DN-tunnukset, joihin käyttäjä kuuluu;
- jotkin ryhmät sijaitsevat polussa CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1:
- Esimerkiksi: cn=Administrator,CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1;
Joissakin tapauksissa Active Directoryn kyseleminen ei ole yhtä helppoa, joten tässä on esimerkkimääritys tietojen hakemiseksi Active Directorystä:
//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'] = '';
Toinen esimerkki käyttäjäkyselystä:
$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
- Harkitse lausekkeen (mail=*) lisäämistä käyttäjäsuodattimiisi, jotta ohitat käyttäjät, joilla ei ole sähköpostiosoitetta.
Esimerkki ryhmäkyselystä:
$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.
Yhden kyselyn luominen automaattisesti jokaista Active Directory -ryhmää varten
Jos säilytät kyselyn osallistujien ryhmiä yhdessä organisaatioyksikössä (OU), sinun ei tarvitse kirjoittaa kyselyä jokaiselle ryhmälle. Seuraava koodi listaa kaikki kyseisen OU:n ryhmät ja luo yhden kyselyn ryhmää kohden. Kysely sisältää kaikki ryhmän aktiiviset jäsenet, mukaan lukien sisäkkäisten ryhmien jäsenet.
Lisää koodi tiedostoon config/ldap.php palvelin- ja kyselymääritystesi jälkeen ja ennen riviä //DO NOT CHANGE BELOW HERE. Aseta sitten neljä muuttujaa yläosassa:
- $groupServerId: käytettävän palvelimen $serverId;
- $groupContainer: ryhmät sisältävän OU:n DN. Vain suoraan tässä OU:ssa olevat ryhmät listataan, ei alemman tason OU:iden ryhmiä;
- $groupUserBase: juuri-DN, jonka alta ryhmän jäseniä etsitään;
- $groupNameAttr: ryhmän attribuutti (pienillä kirjaimilla), jota käytetään kyselyn nimenä käyttöliittymässä, esimerkiksi 'info' ("Notes"-kenttä sovelluksessa "Active Directory Users and Computers") tai 'description'. Jos ryhmällä ei ole arvoa tässä attribuutissa, käytetään sen cn-arvoa.
$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);
}
Huomioitavaa:
- Koodi muodostaa yhteyden hakemistoon aina, kun sivu "Tuo osallistujat LDAP:sta" avataan tai lähetetään, joten uudet ryhmät näkyvät ilman määritysten muuttamista. Jos yhteys tai sidonta epäonnistuu, sivulla näkyvät vain käsin määrittelemäsi kyselyt.
- Vastaavuussääntö 1.2.840.113556.1.4.1941 (LDAP_MATCHING_RULE_IN_CHAIN) selvittää sisäkkäiset ryhmät. Se on olemassa vain Active Directoryssä, joten tämä esimerkki ei toimi muiden LDAP-palvelinten kanssa. Käytä niissä jokaiselle ryhmälle yhdistettyä ryhmäkyselyä.
- Jos haluat listata myös ryhmät, jotka ovat $groupContainer-yksikön alemman tason OU:issa, korvaa ldap_list funktiolla ldap_search.
- Jos haluat listata ryhmiä useammasta kuin yhdestä OU:sta, toista koodi käyttäen muita arvoja neljälle muuttujalle.
Lisätietoja Active Directoryn LDAP-rakenteesta löydät sivuilta Active Directory Architecture ja Active Directory Technical Specification.