Nastavenia LDAP
From LimeSurvey Manual
Všeobecné
Ak chcete túto funkciu používať, musíte povoliť podporu LDAP v súbore config.php a nakonfigurovať parametre LDAP v súbore config/ldap.php.
Povolenie LDAP v config.php
- $enableLdap: ak chcete v LimeSurvey používať funkcie LDAP, musíte nastaviť tento parameter na true (predvolene je nastavený na false):
'config'=>array( 'debug'=>0, 'debugsql'=>0, 'enableLdap'=>true, )
Definovanie serverov LDAP
Najprv definujte možnosti pripojenia k serveru LDAP v súbore "application/config/ldap.php". Pre každý server sú k dispozícii nasledujúce možnosti:
- $serverId: Celé číslo, ktoré identifikuje tento server LDAP. Používa sa v definíciách dotazov na priradenie servera ku konkrétnemu dotazu;
- $ldap_server[$serverId]['server']: IP adresa alebo názov DNS servera LDAP. Ak používate pripojenia zabezpečené SSL (LDAPs alebo LDAP+Start-TLS), tento názov musí zodpovedať CN certifikátu servera (alebo SubjectAlternativeName);
- $ldap_server[$serverId]['port']: Port TCP, na ktorom server LDAP počúva. Zvyčajne je to 389 pre LDAP a LDAP+Start-TLS a 636 pre LDAPs;
- $ldap_server[$serverId]['protoversion']: Môže byť 'ldapv2' alebo 'ldapv3' podľa protokolu, ktorý váš server podporuje. Preferovaným protokolom je 'ldapv3'. Ak však chcete používať šifrované pripojenia, upozorňujeme, že LDAPs je podporovaný v režime 'ldapv2', zatiaľ čo Start-TLS je metóda šifrovania pre 'ldapv3';
- $ldap_server[$serverId]['encrypt']: Určuje použitú metódu šifrovania. 'ldaps' je podporovaný pre servery 'ldapv2', 'start-tls' pre servery 'ldapv3'. Kľúčové slovo 'none' sa používa pre nešifrovanú komunikáciu LDAP;
- Nezabudnite, že pri šifrovaní 'ldaps' alebo 'start-tls' musí webový server vedieť overiť certifikát servera LDAP. Preto musíte definovať svoju certifikačnú autoritu v knižnici openldap (zvyčajne sa to robí v súbore /etc/openldap/ldap.conf v systéme Linux).
- $ldap_server[$serverId]['referrals']: Je to logický parameter, ktorý určuje, či sa majú nasledovať referrals alebo nie (pre ActiveDirectory použite false);
- $ldap_server[$serverId]['encoding']: Je to voliteľný parameter, ktorý udáva kódovanie, ktoré adresár LDAP používa na ukladanie reťazcov. Tento parameter zvyčajne nemusíte nastavovať, pretože predvolene predpokladané kódovanie 'utf-8' je štandardným kódovaním adresárov LDAP. Ak však používate Active Directory a máte problémy s importom reťazcov s diakritikou, skúste nastaviť tento parameter na kódovanie používané vo vašej oblasti (napríklad 'cp850' pre západnú Európu). Úplný zoznam podporovaných kódovaní nájdete v rozbaľovacom zozname "Znaková sada súboru" v rozhraní Import tokenov z CSV súboru.
Ďalej musíte definovať, aká autentifikácia je potrebná na prístup k adresáru. Ak je povolený 'anonymný' prístup, NENASTAVUJTE nasledujúce dva parametre, v opačnom prípade ich nastavte podľa potreby:
- $ldap_server[$serverId]['binddn']: DN používateľa 'LDAP', ktorý smie čítať adresár;
- $ldap_server[$serverId]['bindpw']: Heslo pre uvedeného používateľa LDAP.
Ak potrebujete definovať ďalšie servery LDAP, pridajte nasledujúci riadok, ktorý zvýši serverID, a definujte nové parametre:
- $serverId++.
Definovanie dotazov v config/ldap.php
Pozor: ak sa v niektorom z týchto parametrov vyžaduje názov atribútu LDAP, používajte iba malé písmená: napríklad displayname a NIE displayName.
Ukážkové konfigurácie nájdete v súbore config/ldap.php.
Jednoduché dotazy
Začnime jednoduchými dotazmi. Tieto dotazy filtrujú záznamy LDAP iba na základe ich vlastných atribútov a umiestnenia. Pre dotazovanie ActiveDirectory zvyčajne postačujú.
- $query_id: je ID dotazu LDAP;
- $ldap_queries[$query_id]['ldapServerId']: Priradí dotaz ku konkrétnemu serveru;
- $ldap_queries[$query_id]['name']: Reťazec popisujúci dotaz. Zobrazí sa v rozhraní;
- $ldap_queries[$query_id]['userbase']: Koreňové DN používané na vyhľadávanie používateľov;
- $ldap_queries[$query_id]['userfilter']: Je to filter používaný na výber potenciálnych záznamov používateľov. Musí byť uzavretý v zátvorkách;
- $ldap_queries[$query_id]['userscope']: rozsah vyhľadávania používateľov v LDAP ('base', 'one' alebo 'sub');
- $ldap_queries[$query_id]['firstname_attr']: Atribút LDAP, ktorý sa priradí do poľa Meno v zázname tokenu;
- $ldap_queries[$query_id]['lastname_attr']: Atribút LDAP, ktorý sa priradí do poľa Priezvisko v zázname tokenu;
- $ldap_queries[$query_id]['email_attr']: Atribút LDAP, ktorý sa priradí do poľa Emailová adresa v zázname tokenu.
Voliteľne môžete z adresára získať ďalšie informácie:
- $ldap_queries[$query_id]['token_attr']: Atribút LDAP, ktorý sa priradí ku kódu tokenu;
- $ldap_queries[$query_id]['language']: Atribút LDAP, ktorý sa priradí ku Kódu jazyka používateľa;
- $ldap_queries[$query_id]['attr1']: Atribút LDAP, ktorý sa priradí do poľa attribute_1;
- $ldap_queries[$query_id]['attr2']: Atribút LDAP, ktorý sa priradí do poľa attribute_2.
Kombinované skupinové dotazy s členmi DN
Pozrime sa teraz, ako definovať zložitejší dotaz.
Nasledujúce dotazy používajú prvé vyhľadávanie LDAP, ktoré prehľadáva skupiny LDAP. Skupina LDAP je záznam LDAP obsahujúci odkazy na záznamy používateľov vo forme:
- ID používateľov (napríklad posixGroups) ==> Pozrite si nasledujúcu časť
- Alebo DN používateľov (napríklad groupofnames a groupofuniquenames) ==> pozrite nižšie
Tu sa zaoberáme skupinami obsahujúcimi DN používateľov:
- definujte $query_id, $ldap_queries[$query_id]['ldapServerId'], $ldap_queries[$query_id]['name'] podľa vyššie uvedeného opisu.
Potom definujte parametre filtra skupín:
- $ldap_queries[$query_id]['groupbase']: Koreňové DN, od ktorého chcete začať vyhľadávať záznamy skupín;
- $ldap_queries[$query_id]['groupfilter']: Filter LDAP, ktorý vyberie potenciálne záznamy skupín;
- $ldap_queries[$query_id]['groupscope']: Rozsah vyhľadávania skupín v LDAP ('one', 'base' alebo 'sub');
- $ldap_queries[$query_id]['groupmemberattr']: Názov atribútu LDAP v zázname skupiny, ktorý bude obsahovať odkazy na záznamy používateľov;
- $ldap_queries[$query_id]['groupmemberisdn']: TRUE.
V tomto bode je všetko pripravené na to, aby prvé vyhľadávanie LDAP našlo používateľov zodpovedajúcich vybraným skupinám. Môžete však obmedziť, ktorí z týchto "kandidátov na používateľov" budú vybraní, a to použitím ďalšieho filtra. Je to, samozrejme, voliteľné:
- $ldap_queries[$query_id]['userbase']: Základné DN pre vyhľadávanie používateľov v LDAP (vyberú sa iba kandidáti na používateľov zodpovedajúci tomuto základu);
- $ldap_queries[$query_id]['userscope']: Rozsah vyhľadávania používateľov v LDAP (vyberú sa iba kandidáti na používateľov zodpovedajúci userbase+scope);
- $ldap_queries[$query_id]['userfilter']: Je to filter, ktorý sa uplatňuje na každý záznam kandidáta na používateľa (podľa jeho atribútov) a pridáva ďalší výber.
Kombinované skupinové dotazy s členmi UID
Pozrime sa teraz, ako definovať kombinovaný skupinový dotaz, keď sú členmi skupiny UID používateľov a nie DN používateľov.
Rovnako ako pri skupinových dotazoch s členmi DN, tieto dotazy používajú prvé vyhľadávanie LDAP, ktoré hľadá záznamy skupín LDAP a získava ich členov. Hodnoty týchto členov sa potom použijú vo filtri vyhľadávania používateľov na nájdenie zodpovedajúcich záznamov. Preto je potrebné nakonfigurovať ďalší parameter, ktorý určuje atribút v zázname používateľa, ktorý má zodpovedať UID člena nájdenému v skupinách.
Prejdime si požadované parametre:
- definujte $query_id, $ldap_queries[$query_id]['ldapServerId'], $ldap_queries[$query_id]['name'] podľa vyššie uvedeného opisu
Potom definujte parametre filtra skupín:
- $ldap_queries[$query_id]['groupbase']: Koreňové DN, od ktorého chcete začať vyhľadávať záznamy skupín;
- $ldap_queries[$query_id]['groupfilter']: Filter LDAP, ktorý vyberie potenciálne záznamy skupín;
- $ldap_queries[$query_id]['groupscope']: Rozsah vyhľadávania skupín v LDAP ('one', 'base' alebo 'sub');
- $ldap_queries[$query_id]['groupmemberattr']: Názov atribútu LDAP v zázname skupiny, ktorý bude obsahovať odkazy na záznamy používateľov;
- $ldap_queries[$query_id]['groupmemberisdn']: FALSE;
- $ldap_queries[$query_id]['useridattr']: názov atribútu používateľa, ktorý musí zodpovedať UID nájdenému medzi členmi skupiny.
V tomto bode je všetko pripravené na to, aby prvé vyhľadávanie LDAP našlo UID používateľov zodpovedajúce vybraným skupinám a filter vyhľadávania používateľov sa vyplní automaticky.
Môžete však obmedziť, ktorí z týchto 'kandidátov na používateľov' budú vybraní, a to doplnením automatického filtra používateľov vypočítaného z UID členov. Je to, samozrejme, voliteľné:
- $ldap_queries[$query_id]['userbase']: Základné DN pre vyhľadávanie používateľov v LDAP (vyberú sa iba kandidáti na používateľov zodpovedajúci tomuto základu);
- $ldap_queries[$query_id]['userscope']: Rozsah vyhľadávania používateľov v LDAP (vyberú sa iba kandidáti na používateľov zodpovedajúci userbase+scope);
- $ldap_queries[$query_id]['userfilter']: Je to filter, ktorý sa uplatňuje na každý záznam kandidáta na používateľa (podľa jeho atribútov) a pridáva ďalší výber.
A čo Active Directory?
Active Directory (AD) je register spoločnosti Microsoft, ktorý je možné dotazovať pomocou protokolu LDAP.
Jeho obsah je potom možné použiť pre dotazy na tokeny v LimeSurvey, vyžaduje to však znalosť toho, ako je AD organizovaný.
- Koreň LDAP je dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1
==> Napríklad, ak vaša spoločnosť vlastní doménu DNS 'my-company.com' a vaša doména Windows je 'employees', potom je váš koreň dc=employees,dc=my-company,dc=com
- Používatelia a skupiny používateľov sú uložení pod cn=Users,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1 (upozorňujeme, že nejde o ou=users);
- Skupiny Active Directory:
- Objekty skupín obsahujú DN členov vo svojom atribúte 'member';
- Členstvo v skupinách je uložené aj v atribúte memberOf každého záznamu používateľa. Tento atribút obsahuje DN skupín, do ktorých používateľ patrí;
- niektoré skupiny sú v CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1:
- Napríklad: cn=Administrator,CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1;
V niektorých prípadoch nie je dotazovanie Active Directory také jednoduché, preto tu uvádzame ukážkovú konfiguráciu na získanie niektorých informácií z 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'] = '';
Ďalší príklad dotazu na používateľov:
$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
- Zvážte pridanie (mail=*) do filtrov používateľov, aby ste preskočili používateľov bez e-mailovej adresy.
Príklad dotazu na skupiny:
$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.
Automatické vytvorenie jedného dotazu pre každú skupinu Active Directory
Ak uchovávate skupiny respondentov prieskumu v jednej organizačnej jednotke (OU), nemusíte písať dotaz pre každú skupinu. Nasledujúci kód zobrazí zoznam všetkých skupín v danej OU a vytvorí jeden dotaz pre každú skupinu. Dotaz zahŕňa všetkých aktívnych členov skupiny vrátane členov vnorených skupín.
Pridajte kód do config/ldap.php za definície servera a dotazov a pred riadok //DO NOT CHANGE BELOW HERE. Potom nastavte štyri premenné na začiatku:
- $groupServerId: hodnota $serverId servera, ktorý sa má použiť;
- $groupContainer: DN organizačnej jednotky (OU), ktorá obsahuje skupiny. Zobrazia sa len skupiny priamo v tejto OU, nie skupiny v podriadených OU;
- $groupUserBase: koreňové DN, pod ktorým sa hľadajú členovia skupín;
- $groupNameAttr: atribút skupiny (malými písmenami) použitý ako názov dotazu v grafickom rozhraní, napríklad 'info' (pole „Notes“ v „Active Directory Users and Computers“) alebo 'description'. Ak skupina nemá v tomto atribúte žiadnu hodnotu, použije sa jej 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);
}
Čo si treba zapamätať:
- Kód sa pripája k adresáru pri každom otvorení alebo odoslaní stránky „Importovať respondentov z LDAP“, takže nové skupiny sa zobrazia bez zmeny konfigurácie. Ak zlyhá pripojenie alebo prihlásenie (bind), stránka zobrazí iba dotazy, ktoré ste definovali ručne.
- Pravidlo zhody 1.2.840.113556.1.4.1941 (LDAP_MATCHING_RULE_IN_CHAIN) rieši vnorené skupiny. Existuje iba v Active Directory, preto tento príklad nefunguje s inými servermi LDAP. Na nich použite namiesto toho pre každú skupinu kombinovaný dotaz na skupiny.
- Ak chcete zobraziť aj skupiny v podriadených OU v $groupContainer, nahraďte ldap_list za ldap_search.
- Ak chcete zobraziť skupiny z viacerých OU, zopakujte kód s inými hodnotami štyroch premenných.
Ďalšie informácie o štruktúre Active Directory LDAP nájdete v dokumentoch Active Directory Architecture a Active Directory Technical Specification.