Mga setting ng LDAP
From LimeSurvey Manual
Pangkalahatan
Kailangan mong i-enable ang suporta sa LDAP sa config.php at i-configure ang mga parameter ng LDAP sa config/ldap.php para magamit ang function na ito.
Pag-enable ng LDAP sa config.php
- $enableLdap: kung nais mong gamitin ang mga function ng LDAP sa LimeSurvey, kailangan mong itakda ang parameter na ito sa true (naka-set ito sa false bilang default):
'config'=>array( 'debug'=>0, 'debugsql'=>0, 'enableLdap'=>true, )
Pagtukoy ng mga LDAP server
Unang tukuyin ang mga opsyon sa koneksyon ng LDAP server sa "application/config/ldap.php". Para sa bawat server, narito ang mga available na opsyon:
- $serverId: Isang integer na tumutukoy sa LDAP server na ito. Ginagamit ito sa mga definition ng query para iugnay ang isang server sa isang partikular na query;
- $ldap_server[$serverId]['server']: Ang IP address o DNS name ng LDAP server. Kung gumagamit ka ng mga koneksyong protektado ng SSL (LDAPs o LDAP+Start-TLS), dapat tumugma ang pangalang ito sa Certificate CN (o SubjectAlternativeName) ng server;
- $ldap_server[$serverId]['port']: Ang TCP port na pinakikinggan ng LDAP server. Karaniwan itong 389 para sa LDAP at LDAP+Start-TLS, at 636 para sa LDAPs;
- $ldap_server[$serverId]['protoversion']: Maaaring 'ldapv2' o 'ldapv3' depende sa protocol na sinusuportahan ng iyong server. Ang 'ldapv3' ang mas ginustong protocol. Gayunpaman, kung nais mong gumamit ng mga naka-encrypt na koneksyon, tandaan na sinusuportahan ang LDAPs sa 'ldapv2' mode samantalang ang Start-TLS ang paraan ng encryption para sa 'ldapv3';
- $ldap_server[$serverId]['encrypt']: Tinutukoy ang paraan ng encryption na gagamitin. Sinusuportahan ang 'ldaps' para sa mga 'ldapv2' server, at 'start-tls' para sa mga 'ldapv3' server. Ginagamit ang keyword na 'none' para sa cleartext na komunikasyon ng LDAP;
- Huwag kalimutan na para sa 'ldaps' o 'start-tls' na encryption, dapat ma-verify ng webserver ang certificate ng LDAP server. Kaya kailangan mong tukuyin ang iyong Certificate Authority sa iyong openldap library (karaniwang ginagawa ito sa file na /etc/openldap/ldap.conf sa linux).
- $ldap_server[$serverId]['referrals']: Isang boolean na parameter na tumutukoy kung susundan ba ang mga referral o hindi (gamitin ang false para sa ActiveDirectory);
- $ldap_server[$serverId]['encoding']: Isang opsyonal na parameter na nagbibigay ng encoding na ginagamit ng LDAP directory para mag-imbak ng mga string. Karaniwang hindi mo kailangang i-set ang parameter na ito dahil ang default na encoding, 'utf-8', ay ang standard na encoding para sa mga LDAP directory. Gayunpaman, kung gumagamit ka ng Active Directory at may problema sa pag-import ng mga string na may accent, subukang i-set ang parameter na ito sa encoding na ginagamit sa inyong lugar (halimbawa 'cp850' para sa West Europe). Maaari mong tingnan ang Drop-down na listahan na "Character set ng file" sa Import Token from CSV file GUI para sa buong listahan ng mga sinusuportahang encoding.
Susunod, kailangan mong tukuyin kung anong authentication ang kailangan para makapasok sa directory. Kung pinapayagan ang 'anonymous' na access, HUWAG i-set ang dalawang sumusunod na parameter; kung hindi, i-set ang mga ito nang naaayon:
- $ldap_server[$serverId]['binddn']: DN ng 'LDAP' user na pinapayagang bumasa ng directory;
- $ldap_server[$serverId]['bindpw']: Password para sa LDAP user sa itaas.
Kung kailangan mong tukuyin ang iba pang LDAP server, idagdag ang sumusunod na linya para dagdagan ang serverID at tukuyin ang mga bagong parameter:
- $serverId++.
Pagtukoy ng mga query sa config/ldap.php
Babala: kapag kinakailangan ang pangalan ng ldap attribute sa isa sa mga parameter na ito, gumamit lamang ng mga pangalang lower case: halimbawa displayname at HINDI displayName.
Tingnan ang file na config/ldap.php dahil naglalaman ito ng mga sample na configuration.
Mga simpleng query
Magsimula tayo sa mga simpleng query. Sinasala lamang ng mga query na ito ang mga LDAP entry batay sa sarili nilang mga attribute at lokasyon. Karaniwan itong sapat para sa pag-query ng ActiveDirectory.
- $query_id: ang id ng LDAP query;
- $ldap_queries[$query_id]['ldapServerId']: Iniuugnay ang query sa isang partikular na server;
- $ldap_queries[$query_id]['name']: String na naglalarawan sa query. Ipapakita ito sa GUI;
- $ldap_queries[$query_id]['userbase']: Root DN na gagamitin para sa paghahanap ng user;
- $ldap_queries[$query_id]['userfilter']: Isang filter na ginagamit para piliin ang mga potensyal na entry ng user. Dapat itong nakapaloob sa mga panaklong;
- $ldap_queries[$query_id]['userscope']: saklaw ng LDAP search para sa mga user ('base', 'one' o 'sub');
- $ldap_queries[$query_id]['firstname_attr']: Ldap attribute na ima-map sa field na Firstname ng token entry;
- $ldap_queries[$query_id]['lastname_attr']: Ldap attribute na ima-map sa field na Lastname ng token entry;
- $ldap_queries[$query_id]['email_attr']: Ldap attribute na ima-map sa field ng email address ng token entry.
Opsyonal, maaari kang kumuha ng karagdagang impormasyon mula sa directory:
- $ldap_queries[$query_id]['token_attr']: Ldap attribute na ima-map sa token code;
- $ldap_queries[$query_id]['language']: Ldap attribute na ima-map sa Code ng wika ng user;
- $ldap_queries[$query_id]['attr1']: Ldap attribute na ima-map sa field na attribute_1;
- $ldap_queries[$query_id]['attr2']: Ldap attribute na ima-map sa field na attribute_2.
Pinagsamang Group Query na may mga DN member
Tingnan naman natin kung paano tukuyin ang mas kumplikadong query.
Gumagamit ang mga sumusunod na query ng unang LDAP search na tumitingin sa mga LDAP group. Ang LDAP group ay isang LDAP entry na naglalaman ng mga reference sa mga entry ng user sa anyo ng:
- mga user id (halimbawa, ang posixGroups) ==> Tingnan ang susunod na seksyon
- O mga user DN (halimbawa, ang groupofnames at groupofuniquenames) ==> tingnan sa ibaba
Dito, tinatalakay natin ang mga group na naglalaman ng mga user DN:
- tukuyin ang $query_id, $ldap_queries[$query_id]['ldapServerId'], $ldap_queries[$query_id]['name'] ayon sa paliwanag sa itaas.
Pagkatapos, tukuyin ang mga parameter ng group filter:
- $ldap_queries[$query_id]['groupbase']: Ang Root DN kung saan mo nais simulan ang paghahanap ng mga group entry;
- $ldap_queries[$query_id]['groupfilter']: Ang LDAP filter na pipili ng mga potensyal na group entry;
- $ldap_queries[$query_id]['groupscope']: Ang saklaw ng LDAP search para sa mga group ('one', 'base' o 'sub');
- $ldap_queries[$query_id]['groupmemberattr']: Ang pangalan ng LDAP attribute sa group entry na maglalaman ng mga reference sa mga entry ng user;
- $ldap_queries[$query_id]['groupmemberisdn']: TRUE.
Sa puntong ito, nakahanda na ang lahat para mahanap ng unang LDAP search ang mga user na tumutugma sa mga napiling group. Gayunpaman, maaari mong limitahan kung alin sa mga "user candidate" na ito ang mapipili sa pamamagitan ng paglalapat ng isa pang filter sa kanila. Opsyonal ito, siyempre:
- $ldap_queries[$query_id]['userbase']: Base DN para sa LDAP search ng user (tanging ang user candidate na tumutugma sa base na ito ang mapipili);
- $ldap_queries[$query_id]['userscope']: Saklaw para sa LDAP search ng user (tanging ang user candidate na tumutugma sa userbase+scope ang mapipili);
- $ldap_queries[$query_id]['userfilter']: Isang filter na inilalapat sa bawat entry ng user candidate (batay sa mga attribute nito) para magdagdag ng isa pang pagpili.
Pinagsamang Group Query na may mga UID member
Tingnan naman natin kung paano tukuyin ang pinagsamang Group query kapag ang mga miyembro ng group ay mga user UID at hindi mga User DN.
Tulad ng mga Group query na may mga DN member, gumagamit ang mga query na ito ng unang LDAP search na naghahanap ng mga LDAP group entry at kumukuha ng kanilang mga miyembro. Ang mga value ng miyembrong ito ay gagamitin sa filter ng paghahanap ng user para hanapin ang mga katugmang entry. Kaya kailangang i-configure ang isa pang parameter para tukuyin ang attribute ng user sa entry ng user na dapat tumugma sa member UID na makikita sa mga group.
Repasuhin natin ang mga kinakailangang parameter:
- tukuyin ang $query_id, $ldap_queries[$query_id]['ldapServerId'], $ldap_queries[$query_id]['name'] ayon sa paliwanag sa itaas
Pagkatapos, tukuyin ang mga parameter ng group filter:
- $ldap_queries[$query_id]['groupbase']: Ang Root DN kung saan mo nais simulan ang paghahanap ng mga group entry;
- $ldap_queries[$query_id]['groupfilter']: Ang LDAP filter na pipili ng mga potensyal na group entry;
- $ldap_queries[$query_id]['groupscope']: Ang saklaw ng LDAP search para sa mga group ('one', 'base' o 'sub');
- $ldap_queries[$query_id]['groupmemberattr']: Ang pangalan ng LDAP attribute sa group entry na maglalaman ng mga reference sa mga entry ng user;
- $ldap_queries[$query_id]['groupmemberisdn']: FALSE;
- $ldap_queries[$query_id]['useridattr']: pangalan ng attribute ng user na dapat tumugma sa UID na makikita sa mga miyembro ng group.
Sa puntong ito, nakahanda na ang lahat para mahanap ng unang LDAP search ang mga UID ng user na tumutugma sa mga napiling group, at awtomatikong pupunan ang filter ng paghahanap ng user.
Gayunpaman, maaari mong limitahan kung alin sa mga 'user candidate' na ito ang mapipili sa pamamagitan ng pagkumpleto sa awtomatikong user filter na nabuo mula sa mga member UID. Opsyonal ito, siyempre:
- $ldap_queries[$query_id]['userbase']: Base DN para sa LDAP search ng user (tanging ang user candidate na tumutugma sa base na ito ang mapipili);
- $ldap_queries[$query_id]['userscope']: Saklaw para sa LDAP search ng user (tanging ang user candidate na tumutugma sa userbase+scope ang mapipili);
- $ldap_queries[$query_id]['userfilter']: Isang filter na inilalapat sa bawat entry ng user candidate (batay sa mga attribute nito) para magdagdag ng isa pang pagpili.
Paano naman ang Active Directory?
Ang Active Directory (AD) ay isang Microsoft registry na maaaring i-query gamit ang LDAP protocol.
Posible itong gamitin para sa mga token query ng LimeSurvey, ngunit kailangan mong malaman kung paano nakaayos ang AD.
- Ang LDAP root base ay dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1
==> Halimbawa, kung ang kumpanya ninyo ay may DNS domain na 'my-company.com' at ang Windows domain ninyo ay 'employees', ang root base ninyo ay dc=employees,dc=my-company,dc=com
- Ang mga user at mga pangkat ng user ay nakaimbak sa ilalim ng cn=Users,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1 (pakitandaan na hindi ito ou=users);
- Mga Grupo ng Active Directory:
- Ang mga group object ay naglalaman ng DN ng mga miyembro sa kanilang 'member' attribute;
- Ang mga pagiging miyembro ng grupo ay nakaimbak din sa memberOf attribute ng bawat user entry. Naglalaman ang attribute na ito ng mga DN ng mga grupong kinabibilangan ng user;
- ang ilang grupo ay nasa CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1:
- Halimbawa: cn=Administrator,CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1;
Sa ilang kaso, hindi gaanong madaling mag-query ng active directory, kaya narito ang isang halimbawang configuration para makakuha ng ilang impormasyon mula sa isang 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'] = '';
Isa pang halimbawa ng User query:
$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
- Isaalang-alang ang pagdagdag ng (mail=*) sa mga user filter ninyo para lampasan ang mga user na walang email address.
Halimbawa ng group query:
$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.
Awtomatikong paggawa ng isang query para sa bawat grupo ng Active Directory
Kung nasa iisang organizational unit (OU) ang mga grupo ng mga kalahok ng inyong survey, hindi na ninyo kailangang magsulat ng query para sa bawat grupo. Inililista ng sumusunod na code ang lahat ng grupo sa OU na iyon at gumagawa ito ng isang query para sa bawat grupo. Kasama sa query ang lahat ng naka-enable na miyembro ng grupo, kabilang ang mga miyembro ng mga nested na grupo.
Idagdag ang code sa config/ldap.php pagkatapos ng mga definition ng server at query ninyo at bago ang linyang //DO NOT CHANGE BELOW HERE. Pagkatapos, itakda ang apat na variable sa itaas:
- $groupServerId: ang $serverId ng server na gagamitin;
- $groupContainer: ang DN ng OU na naglalaman ng mga grupo. Ang mga grupong direktang nasa OU na ito lamang ang nakalista, hindi ang mga grupo sa mga sub-OU;
- $groupUserBase: ang root DN kung saan hahanapin ang mga miyembro ng grupo;
- $groupNameAttr: ang group attribute (sa lower case) na gagamiting pangalan ng query sa GUI, halimbawa 'info' (ang field na "Notes" sa "Active Directory Users and Computers") o 'description'. Kung walang value ang isang grupo sa attribute na ito, gagamitin ang cn nito.
$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);
}
Mga dapat tandaan:
- Kumokonekta ang code sa directory tuwing bubuksan o isusumite ang pahinang "Mag-import ng mga kalahok mula sa LDAP", kaya lumalabas ang mga bagong grupo nang hindi binabago ang configuration. Kung pumalya ang koneksyon o ang bind, ang mga query na manu-mano ninyong dinefine lamang ang ipapakita ng pahina.
- Nireresolba ng matching rule na 1.2.840.113556.1.4.1941 (LDAP_MATCHING_RULE_IN_CHAIN) ang mga nested na grupo. Umiiral lamang ito sa Active Directory, kaya hindi gumagana ang halimbawang ito sa ibang LDAP server. Sa mga iyon, gumamit na lang ng combined group query para sa bawat grupo.
- Para mailista rin ang mga grupo sa mga sub-OU ng $groupContainer, palitan ang ldap_list ng ldap_search.
- Para maglista ng mga grupo mula sa higit sa isang OU, ulitin ang code gamit ang ibang value para sa apat na variable.
Humanap ng karagdagang impormasyon tungkol sa istruktura ng Active Directory LDAP sa Active Directory Architecture at Active Directory Technical Specification.