Menerapkan kebijakan password pada OpenLDAP dengan ppolicy overlay: pwdMinLength, pwdMaxLength, pwdMaxAge, pwdInHistory, lockout akun, grace login, password hashing SSHA, serta validasi eksternal cracklib.

Di episode 11 kalian mengenal overlay sebagai mekanisme modular OpenLDAP, termasuk sekilas tentang ppolicy dan syncprov. Episode 12 ini menurunkan konsep itu menjadi praktik nyata: kebijakan password lengkap yang mengatur panjang, umur, sejarah, dan lockout akun. Ini salah satu fitur yang paling sering diminta begitu organisasi mulai memperlakukan LDAP sebagai sumber kebenaran autentikasi — karena tanpa kebijakan, userPassword hanyalah kata sandi tanpa aturan.
ppolicy adalah overlay yang menghadirkan atribut kebijakan password ke dalam direktori. Modul ini menegakkan aturan kualitas, umur, sejarah, dan lockout pada setiap operasi bind dan perubahan password, tanpa mengubah kode aplikasi klien sama sekali.
Kualitas password (quality requirements) diukur lewat pwdCheckQuality dan pwdMinLength: level kualitas menentukan seberapa ketat password baru diuji, sementara panjang minimum menjadi garis dasar keamanan. Penerapan kebijakan (policy application) dilakukan per-entri lewat pwdPolicySubentry, atau secara global lewat policy default yang dipasang di konfigurasi overlay.
dn: cn=module{0},cn=config
objectClass: olcModuleList
olcModulePath: /usr/lib/ldap
olcModuleLoad: ppolicy.laPada Debian dan Ubuntu, modul overlay tinggal di /usr/lib/ldap dan dimuat dengan olcModuleLoad: ppolicy.la. Jika kalian menulis modul ulang (misalnya setelah kompilasi dari sumber), jangan lupa jalankan slaptest -u untuk memastikan konfigurasi valid.
Kebijakan didefinisikan sebagai sebuah entry dengan objectClass pwdPolicy. Atribut-atributnya bekerja berpasangan untuk membentuk aturan yang utuh:
| Atribut | Fungsi |
|---|---|
pwdMinLength | Panjang minimum password |
pwdMaxLength | Panjang maksimum password |
pwdMinAge | Umur minimum sebelum password boleh diganti (detik) |
pwdMaxAge | Umur maksimum sebelum password kedaluwarsa (detik) |
pwdInHistory | Jumlah password lama yang tidak boleh dipakai ulang |
pwdCheckQuality | Level pengecekan kualitas (0, 1, atau 2) |
pwdMaxFailure | Batas kegagalan bind sebelum akun dikunci |
pwdLockout | Aktifkan atau nonaktifkan lockout akun |
pwdLockoutDuration | Durasi lockout dalam detik |
pwdGraceAuthNLimit | Jumlah grace login setelah password kedaluwarsa |
Dua atribut operasional menyertai mekanisme ini: pwdChangedTime mencatat kapan password terakhir diubah, dan pwdFailureTime mencatat setiap waktu kegagalan bind — keduanya diisi otomatis oleh overlay, tidak perlu di-set manual. pwdMaxAge dan pwdMinAge dalam satuan detik, jadi 90 hari sama dengan 7776000.
Entry kebijakan dibuat seperti entry biasa, tetapi dengan objectClass pwdPolicy dan person (untuk atribut cn dan sn):
dn: cn=default,ou=policies,dc=example,dc=com
objectClass: pwdPolicy
objectClass: person
cn: default
sn: default policy
pwdAttribute: userPassword
pwdMinLength: 12
pwdMaxLength: 64
pwdMinAge: 1
pwdMaxAge: 7776000
pwdInHistory: 5
pwdCheckQuality: 2
pwdMaxFailure: 5
pwdLockout: TRUE
pwdLockoutDuration: 900
pwdGraceAuthNLimit: 3Masukkan dengan ldapadd -x -D cn=admin,dc=example,dc=com -W dari file LDIF ini. pwdCheckQuality: 2 berarti kualitas dicek saat password diset dan saat bind pertama kali; pwdLockout: TRUE dengan pwdMaxFailure: 5 dan pwdLockoutDuration: 900 mengunci akun 15 menit setelah lima kegagalan.
Agar overlay tahu kebijakan mana yang menjadi default, pasang olcPPolicyDefault pada konfigurasi overlay di cn=config:
dn: olcOverlay=ppolicy,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcPPolicyConfig
olcOverlay: ppolicy
olcPPolicyDefault: cn=default,ou=policies,dc=example,dc=com
olcPPolicyHashCleartext: FALSE
olcPPolicyUseLockout: TRUEUrutan efektif sebuah kebijakan mengikuti kaidah ini:
pwdPolicySubentry, kebijakan tersebut yang berlaku (per-user policy).olcPPolicyDefault menjadi fallback untuk seluruh database.Kebijakan per-user dipasang langsung di entry orangnya, misalnya pada uid=budi,ou=people,dc=example,dc=com ditambahkan pwdPolicySubentry: cn=strict,ou=policies,dc=example,dc=com. Ini berguna untuk akun-akun sensitif seperti admin atau akun service yang butuh aturan lebih ketat.
Cara password disimpan di userPassword menentukan seberapa besar usaha yang dibutuhkan penyerang untuk membaliknya. OpenLDAP menyimpan nilai password bersama label skema hash:
| Skema | Kekuatan | Catatan |
|---|---|---|
{SSHA} | Sedang | Salted SHA-1, standar default lama |
{SSHA256} | Baik | Salted SHA-256 |
{SSHA512} | Baik | Salted SHA-512, rekomendasi modern |
{CRYPT} | Tergantung | Memakai crypt sistem, bisa dipakai dengan shadow |
{MD5} | Lemah | Tanpa salt, deprecated |
{ARGON2} | Kuat | Argon2, modern, butuh dukungan build slapd |
Default hash diatur pada cn=config dengan olcPasswordHash. Untuk nilai yang lebih aman dibanding {SSHA} bawaan, ubah ke {SSHA512}:
dn: cn=config
changetype: modify
replace: olcPasswordHash
olcPasswordHash: {SSHA512}Perlu diingat: mengubah default hanya memengaruhi password yang di-hash setelahnya. Password lama tetap memakai skema lamanya sampai user mengganti password.
pwdMinLength dan pwdCheckQuality hanya mengecek bentuk dasar. Untuk aturan yang lebih cerdas — misalnya melarang kata yang ada di kamus atau kombinasi keyboard — ppolicy mendukung validasi eksternal melalui pwdCheckModule pada entry policy:
dn: cn=default,ou=policies,dc=example,dc=com
changetype: modify
replace: pwdCheckModule
pwdCheckModule: check_password.soModul ini bisa mengintegrasikan cracklib, pustaka yang sama dengan cracklib-unix yang dipakai pam_cracklib di sistem Linux, atau validator kustom yang kalian tulis sendiri dan kompilasi sebagai pustaka berbagi. Di Debian dan Ubuntu, pastikan paket pendukung modul terpasang dan modul berada di direktori yang terbaca oleh slapd. Ini lapisan opsional — banyak deployment memilih tetap di pwdCheckQuality demi kesederhanaan.
Setiap bagian kebijakan harus diuji terpisah, dan semua pengujian bisa dilakukan dengan client standard:
ldapmodify -x -D uid=budi,ou=people,dc=example,dc=com -W
ldapwhoami -x -D uid=budi,ou=people,dc=example,dc=com -w salah
ldapsearch -x -D cn=admin,dc=example,dc=com -W \
-b uid=budi,ou=people,dc=example,dc=com pwdAccountLockedTimepwdChangedTime ikut ter-update.pwdAccountLockedTime muncul.pwdMaxAge kecil, tunggu sampai lewat, lalu bind; server menolak dengan result code 49 dan pesan password expired.pwdGraceAuthNLimit, dan pesan peringatan kedaluwarsa muncul di hasil bind.Important
Waspadai satu jebakan umum: mengetes lockout terhadap akun admin. Jika cn=admin ikut kebijakan default dan terkunci, jalan masuk utama ke direktori ikut terkunci. Dalam lab, beri admin pwdPolicySubentry menunjuk kebijakan longgar, atau uji lockout pada akun user biasa dulu.
Pada episode 12 ini kalian menerapkan ppolicy overlay: memuat modul, memahami atribut pwdMinLength sampai pwdGraceAuthNLimit, membuat policy entry default dan per-user, memilih skema hash dari {SSHA} hingga {ARGON2}, mengaktifkan validasi eksternal lewat pwdCheckModule, dan menguji perubahan password, lockout, kedaluwarsa, serta grace login.
Inti yang harus dibawa pulang:
ppolicy.la, pasang olcPPolicyDefault, dan buat entry pwdPolicy.pwdPolicySubentry mengalahkan policy default, policy default mengalahkan tanpa policy.{SSHA512} dan hindari {MD5} yang deprecated.Di episode 13 berikutnya, kita membahas LDAP replication — bagaimana satu provider mendistribusikan datanya ke consumer dengan syncrepl, dari refreshOnly hingga multi-master. Kebijakan password yang kalian buat di sini akan ikut tereplikasi dan harus berperilaku identik di semua server.