Membaca data direktori secara cerdas: scope pencarian base, one, sub, dan children, operator filter perbandingan dan logika, contoh filter gabungan siap pakai, seleksi atribut, serta praktik menjaga performa pencarian.

Di episode 8 kalian belajar mengubah dan menghapus data. Episode 9 membahas kemampuan yang paling sering dipakai sehari-hari: membaca data secara cerdas. Kalian akan mempelajari scope pencarian, menyusun filter dengan operator perbandingan dan logika, memilih atribut yang diminta, serta memahami batasan performa pencarian di slapd.
Scope menentukan seberapa jauh pencarian menjangkau dari base DN:
| Scope | Nilai -s | Hasil |
|---|---|---|
| Base | -s base | Hanya entry di base DN itu sendiri |
| One | -s one | Entry anak langsung base, tanpa base |
| Sub | -s sub | Base dan seluruh keturunannya |
| Children | -s children | Semua keturunan, tanpa base |
Perbedaan utama ada di one dan sub: one hanya satu tingkat di bawah, sub menelusuri sampai ke daun. Contoh perbandingan:
ldapsearch -x -D "cn=admin,dc=example,dc=com" -W -b dc=example,dc=com -s base "(objectClass=*)"
ldapsearch -x -D "cn=admin,dc=example,dc=com" -W -b dc=example,dc=com -s one "(objectClass=*)"
ldapsearch -x -D "cn=admin,dc=example,dc=com" -W -b dc=example,dc=com -s sub "(objectClass=*)"Dengan base dc=example,dc=com, -s base hanya mengembalikan domain entry itu sendiri, -s one mengembalikan OU di bawahnya, dan -s sub mengembalikan semuanya termasuk semua user dan grup.
Filter adalah jantung pencarian LDAP. Setiap filter ditulis dalam kurung, misal (uid=budi). Operator dasar:
| Operator | Contoh | Arti |
|---|---|---|
Kesetaraan = | (uid=budi) | Nilai persis sama |
Substring * | (cn=John*) | Awalan, akhiran, atau bagian tengah |
Lebih besar >= | (uidNumber>=1000) | Lebih besar atau sama |
Lebih kecil <= | (uidNumber<=2000) | Lebih kecil atau sama |
Keberadaan =* | (mail=*) | Atribut ada nilainya |
Mendekati ~= | (sn~=santoso) | Mirip, biasanya tanpa index |
Contoh pemakaian dalam ldapsearch:
ldapsearch -x -D "cn=admin,dc=example,dc=com" -W -b "ou=People,dc=example,dc=com" "(cn=Budi*)"Filter (cn=Budi*) mencari semua entry yang cn-nya diawali Budi. Wildcard bisa dipakai di depan, tengah, atau belakang: *@example.com, Bu*i, *Pratama.
Untuk kombinasi, pakai tiga operator logika:
| Operator | Simbol | Semantik |
|---|---|---|
| AND | & | Semua kondisi terpenuhi |
| OR | ` | ` |
| NOT | ! | Negasi kondisi |
Filter gabungan membungkus beberapa filter dalam satu pasang kurung:
(&(objectClass=person)(mail=*@example.com))
(|(uid=budi)(uid=sari))
(!(mail=*))
(&(|(uid=budi)(uid=sari))(objectClass=posixAccount))Aturan praktis: AND menyatukan syarat, OR menyatukan alternatif, dan negasi sering dipakai untuk "semua kecuali". Filter boleh ditumpuk sedalam apa pun, asal kurungnya tetap seimbang.
Beberapa kombinasi yang langsung berguna di direktori nyata:
(uid=john)
(cn=John*)
(&(objectClass=person)(mail=*@example.com))
(|(uid=john)(uid=jane))
(&(objectClass=posixAccount)(uidNumber>=1000))Yang terakhir — semua akun Unix dengan UID minimal 1000 — sering dipakai untuk memisahkan user nyata dari akun sistem:
ldapsearch -x -D "cn=admin,dc=example,dc=com" -W -b "ou=People,dc=example,dc=com" "(&(objectClass=posixAccount)(uidNumber>=1000))"Ingat: filter hanya mencari di dalam base yang ditentukan. Kalau ingin mencakup seluruh tree, naikkan base ke dc=example,dc=com dan pakai -s sub.
Selain filter, kalian bisa mengontrol atribut yang dikembalikan dengan menambahkan daftar atribut setelah filter:
ldapsearch -x -D "cn=admin,dc=example,dc=com" -W -b "ou=People,dc=example,dc=com" "(objectClass=posixAccount)" uid mailAturan seleksi:
* — semua atribut user.+ — atribut operasional seperti entryUUID, createTimestamp, dan modifyTimestamp.userPassword hanya muncul bila ACL mengizinkan pembacaan.ldapsearch -x -D "cn=admin,dc=example,dc=com" -W -b "uid=budi,ou=People,dc=example,dc=com" -s base "(objectClass=*)" +Untuk hanya melihat DN tanpa atribut, gunakan daftar atribut 1.1 — trik klasik yang hemat bandwidth.
Filter yang "mahal" adalah filter yang tidak punya index di server. Di episode indexing nanti kalian akan membuat index untuk cn, uid, sn, mail, member, dan uidNumber. Tanpa index, slapd melakukan pemindaian penuh (full scan) yang melambat seiring membesarnya database.
Pola optimal:
(&(objectClass=posixAccount)(uidNumber>=1000)) jauh lebih efisien daripada (objectClass=posixAccount) sendirian untuk daftar ribuan entry.-z (jumlah entry) dan -l (detik):ldapsearch -z 50 -l 10 -x -D "cn=admin,dc=example,dc=com" -W -b dc=example,dc=com "(objectClass=*)"Opsi -z 50 membatasi maksimal 50 entry, -l 10 membatasi maksimal 10 detik. Server slapd juga menegakkan batasannya sendiri melalui olcLimits, jadi nilai efektifnya adalah yang paling ketat di antara keduanya.
Tip
Kalau pencarian tiba-tiba lambat, cek dulu apakah filter memakai atribut yang sudah di-index. Filter dengan ~= (approximate) dan substring di tengah nilai jarang bisa memanfaatkan index — siapkan olcDbIndex yang sesuai sebelum data membesar.
Episode 9 melengkapi kalian dengan bahasa query LDAP: scope base, one, sub, dan children; operator perbandingan =, *, >=, <=, =*, dan ~=; operator logika &, |, dan !; seleksi atribut termasuk atribut operasional; serta disiplin performa lewat index dan batas ukuran dan waktu.
Inti yang harus dibawa pulang:
sub menjangkau seluruh tree.+ untuk atribut operasional.Di episode 10 berikutnya, kita masuk ke pengamanan akses: access control list. Kalian akan mengatur siapa boleh membaca apa, siapa boleh mengubah apa, dan bagaimana menegakkan prinsip least privilege di direktori.