Pengaturan LDAP
From LimeSurvey Manual
Umum
Anda harus mengaktifkan dukungan LDAP di config.php dan mengonfigurasi parameter LDAP di config/ldap.php agar dapat menggunakan fungsi ini.
Mengaktifkan LDAP di config.php
- $enableLdap: jika Anda ingin menggunakan fungsi LDAP di LimeSurvey, Anda harus mengatur parameter ini menjadi true (secara default diatur ke false):
'config'=>array( 'debug'=>0, 'debugsql'=>0, 'enableLdap'=>true, )
Menentukan server LDAP
Pertama, tentukan opsi koneksi server LDAP di "application/config/ldap.php". Untuk setiap server, opsi berikut tersedia:
- $serverId: Bilangan bulat yang mengidentifikasi server LDAP ini. Nilai ini digunakan dalam definisi kueri untuk mengaitkan server dengan kueri tertentu;
- $ldap_server[$serverId]['server']: Alamat IP atau nama DNS server LDAP. Jika Anda menggunakan koneksi yang diamankan dengan SSL (LDAPs atau LDAP+Start-TLS), nama ini harus sesuai dengan CN Sertifikat server (atau SubjectAlternativeName);
- $ldap_server[$serverId]['port']: Port TCP yang didengarkan oleh server LDAP. Biasanya 389 untuk LDAP dan LDAP+Start-TLS, serta 636 untuk LDAPs;
- $ldap_server[$serverId]['protoversion']: Dapat berupa 'ldapv2' atau 'ldapv3' tergantung pada protokol yang didukung server Anda. 'ldapv3' adalah protokol yang disarankan. Namun, jika Anda ingin menggunakan koneksi terenkripsi, perhatikan bahwa LDAPs didukung dalam mode 'ldapv2', sedangkan Start-TLS adalah metode enkripsi untuk 'ldapv3';
- $ldap_server[$serverId]['encrypt']: Menentukan metode enkripsi yang digunakan. 'ldaps' didukung untuk server 'ldapv2', 'start-tls' untuk server 'ldapv3'. Kata kunci 'none' digunakan untuk komunikasi LDAP tanpa enkripsi (cleartext);
- Jangan lupa bahwa untuk enkripsi 'ldaps' atau 'start-tls', server web harus dapat memeriksa sertifikat server LDAP. Oleh karena itu, Anda perlu menentukan Certificate Authority Anda di pustaka openldap (biasanya dilakukan di berkas /etc/openldap/ldap.conf pada Linux).
- $ldap_server[$serverId]['referrals']: Parameter boolean yang menentukan apakah referral harus diikuti atau tidak (gunakan false untuk ActiveDirectory);
- $ldap_server[$serverId]['encoding']: Parameter opsional yang menentukan pengodean yang digunakan direktori LDAP untuk menyimpan string. Biasanya Anda tidak perlu mengatur parameter ini karena pengodean default yang diasumsikan, 'utf-8', adalah pengodean standar untuk direktori LDAP. Namun, jika Anda menggunakan Active Directory dan mengalami masalah saat mengimpor string beraksen, coba atur parameter ini ke pengodean yang digunakan di wilayah Anda (misalnya 'cp850' untuk Eropa Barat). Anda dapat melihat daftar tarik-turun "Set karakter berkas" di antarmuka Impor Token dari berkas CSV untuk melihat daftar lengkap pengodean yang didukung.
Berikutnya, Anda perlu menentukan autentikasi yang diperlukan untuk mengakses direktori. Jika akses 'anonymous' diizinkan, JANGAN atur dua parameter berikut; jika tidak, atur sesuai kebutuhan:
- $ldap_server[$serverId]['binddn']: DN pengguna 'LDAP' yang diizinkan membaca direktori;
- $ldap_server[$serverId]['bindpw']: Kata sandi untuk pengguna LDAP di atas.
Jika Anda perlu menentukan server LDAP lain, tambahkan baris berikut untuk menaikkan serverID dan menentukan parameter baru:
- $serverId++.
Menentukan kueri di config/ldap.php
Perhatian: jika nama atribut ldap diperlukan pada salah satu parameter ini, gunakan hanya nama huruf kecil: misalnya displayname dan BUKAN displayName.
Silakan lihat berkas config/ldap.php karena berisi contoh konfigurasi.
Kueri sederhana
Mari kita mulai dengan kueri sederhana. Kueri ini hanya menyaring entri LDAP berdasarkan atribut dan lokasinya sendiri. Biasanya sudah cukup untuk membuat kueri ke ActiveDirectory.
- $query_id: adalah id kueri LDAP;
- $ldap_queries[$query_id]['ldapServerId']: Mengaitkan kueri dengan server tertentu;
- $ldap_queries[$query_id]['name']: String yang menjelaskan kueri. Akan ditampilkan di GUI;
- $ldap_queries[$query_id]['userbase']: Root DN yang digunakan untuk pencarian pengguna;
- $ldap_queries[$query_id]['userfilter']: Filter yang digunakan untuk memilih calon entri pengguna. Harus diapit tanda kurung;
- $ldap_queries[$query_id]['userscope']: cakupan pencarian LDAP untuk pengguna ('base', 'one' atau 'sub');
- $ldap_queries[$query_id]['firstname_attr']: Atribut Ldap yang akan dipetakan ke kolom Firstname pada entri token;
- $ldap_queries[$query_id]['lastname_attr']: Atribut Ldap yang akan dipetakan ke kolom Lastname pada entri token;
- $ldap_queries[$query_id]['email_attr']: Atribut Ldap yang akan dipetakan ke kolom alamat surel pada entri token.
Secara opsional, Anda dapat mengambil informasi tambahan dari direktori:
- $ldap_queries[$query_id]['token_attr']: Atribut Ldap yang akan dipetakan ke kode token;
- $ldap_queries[$query_id]['language']: Atribut Ldap yang akan dipetakan ke kode bahasa pengguna;
- $ldap_queries[$query_id]['attr1']: Atribut Ldap yang akan dipetakan ke kolom attribute_1;
- $ldap_queries[$query_id]['attr2']: Atribut Ldap yang akan dipetakan ke kolom attribute_2.
Kueri grup gabungan dengan anggota DN
Sekarang mari kita lihat cara menentukan kueri yang lebih kompleks.
Kueri berikut menggunakan pencarian LDAP pertama yang melihat ke grup LDAP. Grup LDAP adalah entri LDAP yang berisi referensi ke entri pengguna dalam bentuk:
- id pengguna (misalnya posixGroups) ==> Lihat bagian berikutnya
- Atau DN pengguna (misalnya groupofnames dan groupofuniquenames) ==> lihat di bawah
Di sini kita membahas grup yang berisi DN pengguna:
- tentukan $query_id, $ldap_queries[$query_id]['ldapServerId'], $ldap_queries[$query_id]['name'] seperti dijelaskan di atas.
Kemudian tentukan parameter filter grup:
- $ldap_queries[$query_id]['groupbase']: Root DN tempat Anda ingin mulai mencari entri grup;
- $ldap_queries[$query_id]['groupfilter']: Filter LDAP yang akan memilih calon entri grup;
- $ldap_queries[$query_id]['groupscope']: Cakupan pencarian LDAP untuk grup ('one', 'base' atau 'sub');
- $ldap_queries[$query_id]['groupmemberattr']: Nama atribut LDAP pada entri grup yang akan berisi referensi ke entri pengguna;
- $ldap_queries[$query_id]['groupmemberisdn']: TRUE.
Pada tahap ini, semuanya sudah diatur agar pencarian LDAP pertama menemukan pengguna yang sesuai dengan grup yang dipilih. Namun, Anda dapat membatasi "calon pengguna" mana yang akan dipilih dengan menerapkan filter lain pada mereka. Tentu saja, ini opsional:
- $ldap_queries[$query_id]['userbase']: Base DN untuk pencarian LDAP pengguna (hanya calon pengguna yang cocok dengan base ini yang akan dipilih);
- $ldap_queries[$query_id]['userscope']: Cakupan untuk pencarian LDAP pengguna (hanya calon pengguna yang cocok dengan userbase+scope yang akan dipilih);
- $ldap_queries[$query_id]['userfilter']: Filter yang diterapkan pada setiap entri calon pengguna (berdasarkan atributnya) untuk menambahkan seleksi lain.
Kueri grup gabungan dengan anggota UID
Sekarang mari kita lihat cara menentukan kueri grup gabungan ketika anggota grup adalah UID pengguna, bukan DN Pengguna.
Seperti pada kueri grup dengan anggota DN, kueri ini menggunakan pencarian LDAP pertama yang mencari entri grup LDAP dan mengambil anggotanya. Nilai anggota ini kemudian digunakan dalam filter pencarian pengguna untuk mencari entri yang sesuai. Karena itu, parameter lain harus dikonfigurasi untuk menentukan atribut pengguna pada entri pengguna yang harus cocok dengan UID anggota yang ditemukan di grup.
Mari kita tinjau parameter yang diperlukan:
- tentukan $query_id, $ldap_queries[$query_id]['ldapServerId'], $ldap_queries[$query_id]['name'] seperti dijelaskan di atas
Kemudian tentukan parameter filter grup:
- $ldap_queries[$query_id]['groupbase']: Root DN tempat Anda ingin mulai mencari entri grup;
- $ldap_queries[$query_id]['groupfilter']: Filter LDAP yang akan memilih calon entri grup;
- $ldap_queries[$query_id]['groupscope']: Cakupan pencarian LDAP untuk grup ('one', 'base' atau 'sub');
- $ldap_queries[$query_id]['groupmemberattr']: Nama atribut LDAP pada entri grup yang akan berisi referensi ke entri pengguna;
- $ldap_queries[$query_id]['groupmemberisdn']: FALSE;
- $ldap_queries[$query_id]['useridattr']: nama atribut pengguna yang harus cocok dengan UID yang ditemukan pada anggota grup.
Pada tahap ini semuanya sudah diatur agar pencarian LDAP pertama menemukan UID pengguna yang sesuai dengan grup yang dipilih, dan filter pencarian pengguna akan terisi secara otomatis.
Namun, Anda dapat membatasi 'calon pengguna' mana yang akan dipilih dengan melengkapi filter pengguna otomatis yang dihitung dari UID anggota. Tentu saja, ini opsional:
- $ldap_queries[$query_id]['userbase']: Base DN untuk pencarian LDAP pengguna (hanya calon pengguna yang cocok dengan base ini yang akan dipilih);
- $ldap_queries[$query_id]['userscope']: Cakupan untuk pencarian LDAP pengguna (hanya calon pengguna yang cocok dengan userbase+scope yang akan dipilih);
- $ldap_queries[$query_id]['userfilter']: Filter yang diterapkan pada setiap entri calon pengguna (berdasarkan atributnya) untuk menambahkan seleksi lain.
Bagaimana dengan Active Directory?
Active Directory (AD) adalah registri Microsoft yang dapat dikueri menggunakan protokol LDAP.
Isinya kemudian dapat digunakan untuk kueri token LimeSurvey, tetapi ini memerlukan pemahaman tentang cara AD diorganisasikan.
- Basis root LDAP adalah dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1
==> Misalnya, jika perusahaan Anda memiliki domain DNS 'my-company.com' dan domain Windows Anda adalah 'employees', maka basis root Anda adalah dc=employees,dc=my-company,dc=com
- Pengguna dan grup pengguna disimpan di bawah cn=Users,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1 (perhatikan bahwa ini bukan ou=users);
- Grup Active Directory:
- Objek grup berisi DN anggota pada atribut 'member' mereka;
- Keanggotaan grup juga disimpan pada atribut memberOf di setiap entri pengguna. Atribut ini berisi DN grup tempat pengguna tersebut menjadi anggota;
- beberapa grup berada di CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1:
- Misalnya: cn=Administrator,CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1;
Dalam beberapa kasus, mengkueri Active Directory tidak semudah itu, sehingga berikut ini contoh konfigurasi untuk mengambil beberapa informasi dari 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'] = '';
Contoh kueri pengguna lainnya:
$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
- Pertimbangkan untuk menambahkan (mail=*) pada filter pengguna Anda agar pengguna tanpa alamat surel dilewati.
Contoh kueri grup:
$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.
Membuat satu kueri per grup Active Directory secara otomatis
Jika Anda menyimpan grup untuk partisipan survei Anda dalam satu organizational unit (OU), Anda tidak perlu menulis kueri untuk setiap grup. Kode berikut mendaftar semua grup dalam OU tersebut dan membuat satu kueri per grup. Kueri tersebut mencakup semua anggota grup yang aktif, termasuk anggota grup bersarang.
Tambahkan kode ke config/ldap.php setelah definisi server dan kueri Anda, serta sebelum baris //DO NOT CHANGE BELOW HERE. Kemudian atur empat variabel di bagian atas:
- $groupServerId: $serverId dari server yang akan digunakan;
- $groupContainer: DN dari OU yang menyimpan grup. Hanya grup yang langsung berada di OU ini yang didaftar, bukan grup di sub-OU;
- $groupUserBase: DN root tempat anggota grup dicari;
- $groupNameAttr: atribut grup (dalam huruf kecil) yang digunakan sebagai nama kueri di GUI, misalnya 'info' (bidang "Notes" di "Active Directory Users and Computers") atau 'description'. Jika grup tidak memiliki nilai pada atribut ini, cn-nya yang digunakan.
$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);
}
Hal-hal yang perlu diperhatikan:
- Kode ini terhubung ke direktori setiap kali halaman "Impor partisipan dari LDAP" dibuka atau dikirim, sehingga grup baru muncul tanpa perlu mengubah konfigurasi. Jika koneksi atau bind gagal, halaman hanya menampilkan kueri yang Anda definisikan secara manual.
- Aturan pencocokan 1.2.840.113556.1.4.1941 (LDAP_MATCHING_RULE_IN_CHAIN) menyelesaikan grup bersarang. Aturan ini hanya ada di Active Directory, sehingga contoh ini tidak berfungsi dengan server LDAP lain. Pada server tersebut, gunakan kueri grup gabungan untuk setiap grup.
- Untuk juga mendaftar grup di sub-OU dari $groupContainer, ganti ldap_list dengan ldap_search.
- Untuk mendaftar grup dari lebih dari satu OU, ulangi kode dengan nilai lain untuk keempat variabel tersebut.
Temukan informasi lebih lanjut tentang struktur LDAP Active Directory di Active Directory Architecture dan Active Directory Technical Specification.