Merancang schema dan DIT LDAP yang sehat sejak awal: prinsip desain, perbandingan DIT flat dan hierarkis, kapan membuat schema kustom beserta alokasi OID, normalisasi data, serta strategi migrasi schema yang aman tanpa merusak sistem yang berjalan.

Di episode 27 kalian menangani masalah setelah terjadi. Episode 28 ini membahas cara menghindari sebagian besar masalah itu sejak desain: schema design best practices. Schema adalah kontrak data directory — sekali entry tersebar di berbagai sistem, mengubah kontrak ini jadi mahal. Karena itu keputusan desain di tahap awal menentukan biaya perawatan bertahun-tahun ke depan: bagaimana bentuk DIT, object class apa yang dipakai, kapan membuat schema kustom, dan bagaimana menormalkan data agar tidak duplikatif.
Lima prinsip yang menuntun hampir semua keputusan desain:
dc sebagai root, ou sebagai cabang fungsional, dan entry di bawahnya.inetOrgPerson dan posixAccount untuk pengguna, organizationalUnit untuk cabang, groupOfNames atau posixGroup untuk grup.uid untuk login, cn untuk nama tampilan, mail untuk alamat email; konsisten di semua entry.Pertanyaan pertama yang harus dijawab: flat atau hierarkis?
| Aspek | Flat | Hierarkis |
|---|---|---|
| Struktur | Semua entry di satu level | Cabang ou berdasarkan fungsi |
| Keuntungan | Sederhana, search cepat | Pemisahan kebijakan dan ACL per cabang |
| Kerugian | Sulit memisahkan kebijakan | Perlu perencanaan, mudah kelebihan cabang |
| Cocok untuk | Organisasi kecil, beban sederhana | Organisasi dengan banyak unit dan kebijakan |
Pendekatan modern yang direkomendasikan: domain-based structure dengan dc=example,dc=com sebagai root, lalu cabang fungsional yang sedikit: ou=people untuk akun, ou=groups untuk grup, ou=services untuk akun layanan. Ini memakai naming context berbasis domain, bukan gaya lama o=Company yang berakar pada X.500. Batasi jumlah ou — setiap cabang baru harus menjawab pertanyaan "kebijakan apa yang berbeda di sini?". Kalau tidak ada perbedaan kebijakan, tambahkan cabang hanya menambah kompleksitas tanpa manfaat.
Schema kustom adalah keputusan yang harus ditunda sampai benar-benar diperlukan. Tanya dulu: apakah kebutuhan ini sudah dijawab object class standar? employeeNumber, employeeType, departmentNumber sudah ada di schema inetOrgPerson — jangan membuat ulang. Extend schema hanya bila:
Bila harus membuat schema kustom, definisikan olcAttributeTypes dan olcObjectClasses sebagai entry schema baru:
dn: cn=company,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: company
olcAttributeTypes: ( 1.3.6.1.4.1.99999.1.1.1 NAME 'employeeID'
EQUALITY caseIgnoreMatch
SUBSTR caseIgnoreSubstringsMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
olcObjectClasses: ( 1.3.6.1.4.1.99999.1.1.2 NAME 'companyEmployee'
SUP top AUXILIARY
MUST ( employeeID )
MAY ( employeeStatus ) )Contoh di atas memakai OID di bawah 1.3.6.1.4.1.99999 — itu placeholder. Di production, kalian harus mendapatkan OID dari nomor enterprise (PEN) yang didaftarkan ke IANA, dan menyusun sub-OID di bawahnya secara rapi. SINGLE-VALUE menegaskan atribut hanya boleh satu nilai. Simpan definisi ini sebagai file LDIF di repo agar bisa diaudit dan di-versioning.
Untuk object class baru, bedakan dua jenis: STRUCTURAL membentuk hierarki entry (hanya satu per entry), sedangkan AUXILIARY menambah atribut ke entry tanpa mengubah strukturnya. Pola yang direkomendasikan adalah memakai object class standar sebagai structural (misal inetOrgPerson), lalu menempelkan class auxiliary kustom bila perlu.
Contoh pemakaiannya: sebuah entry person biasa menjadi entry yang punya employeeID begitu class auxiliary companyEmployee ditambahkan lewat ldapmodify. Keuntungan pola ini: seluruh struktur tetap standar, hanya atribut tambahan yang kustom. Schema kustom yang ditulis rapi dan dipakai konsisten jauh lebih baik daripada schema yang menyalin definisi setengah jadi dari blog yang tidak jelas sumbernya.
Data yang duplikat adalah sumber inkonsistensi yang paling umum di directory. Prinsipnya:
| Atribut | Isi | Cocok untuk |
|---|---|---|
member | DN penuh entry anggota | groupOfNames, struktur berbasis DN |
memberUid | Nilai uid sebagai string | posixGroup, grup untuk sistem POSIX |
Pilih member (berbasis DN) saat anggota bisa dari cabang mana pun dan kalian ingin referensi kuat; memberUid lebih sederhana untuk otentikasi POSIX. Jangan mencampur keduanya untuk grup yang sama.
mail, telephoneNumber) pas untuk data yang melekat pada satu identitas. Kalau datanya punya atribut sendiri yang perlu dicari (misalnya riwayat sertifikasi), buat entry terpisah dan referensikan — bukan menumpuk semuanya di satu entry.Contoh nyata normalisasi: satu user boleh punya beberapa alamat email. Menyimpannya sebagai mail multi-valued itu tepat; menyimpan "departemen" sebagai teks di setiap user itu tidak tepat kalau sudah ada entry departemen yang bisa direferensikan. Setiap kali kalian tergoda menyalin data, tanya: "kalau nilai sumbernya berubah, siapa yang akan memperbarui salinannya?"
Schema akan berkembang, dan perkembangan itu harus aman:
obsolete jauh lebih aman daripada menghapusnya.ldapmodify.Important
Schema menyebar ke seluruh sistem yang mengonsumsi LDAP. Perubahan schema yang tidak dikomunikasikan — misalnya menandai atribut wajib (MUST) yang sebelumnya opsional — bisa langsung mematahkan aplikasi yang menulis entry. Perlakuan schema seperti API publik: versioning, komunikasi, dan uji sebelum rilis.
Tip
Sebelum menambah schema kustom, cek dulu schema yang sudah ada dengan ldapsearch -b "cn=schema,cn=config" olcObjectClasses. Banyak kebutuhan "kustom" ternyata sudah tersedia di cosine, inetorgperson, atau nis — tinggal di-load.
Pada episode 28 ini, kalian menerapkan prinsip desain schema, merancang DIT flat atau hierarkis berbasis domain, memutuskan kapan membuat schema kustom beserta alokasi OID, menormalkan data dengan referensi DN, dan merencanakan migrasi schema yang aditif dan teruji.
Inti yang harus dibawa pulang:
inetOrgPerson, posixAccount, dan object class lain sebelum membuat sendiri.Di episode 29 berikutnya, kita membahas sisi governance: compliance dan security auditing — bagaimana identity store harus dipantau untuk memenuhi kebutuhan audit, memenuhi pertimbangan regulasi, dan dikaitkan dengan SIEM.