Menulis aturan akses berformat HCL yang menentukan siapa boleh mengakses path mana di OpenBao, membedakan exact path dan prefix wildcard, memahami seluruh capabilities, serta menguji penegakan privilege lewat policy write dan token create.

Episode 6 membawa kalian ke PKI Secrets Engine, tempat OpenBao menerbitkan sertifikat TLS secara otomatis. Tapi siapa yang berhak meminta sertifikat itu? Jawabannya diatur oleh policy. Episode 7 ini membahas Access Control Policies — bahasa HCL yang menentukan path mana yang bisa diakses dan aksi apa yang diizinkan. Tanpa policy yang benar, token yang bocor bisa menjelajahi seluruh isi OpenBao. Dengan policy yang tepat, dampak kebocoran bisa dibatasi sesempit mungkin.
Policy adalah aturan deklaratif yang menghubungkan path dengan capabilities (kemampuan). Strukturnya sederhana: sebuah blok path berisi daftar operasi yang diizinkan pada path tersebut. Berlaku prinsip deny by default — jika sebuah path tidak disebutkan sama sekali dalam policy mana pun yang dimiliki token, akses ditolak.
Policy ditulis dalam format HCL (HashiCorp Configuration Language), sebuah file teks biasa dengan ekstensi .hcl:
# Policy minimal untuk aplikasi
path "secret/data/app" {
capabilities = ["read"]
}
path "secret/data/app/*" {
capabilities = ["create", "read", "update", "delete"]
}Dua blok di atas menunjukkan dua pola matching yang berbeda — exact path dan prefix wildcard. Keduanya sering ditulis berdampingan karena sifatnya saling melengkapi.
Pola path di policy menentukan seberapa luas aturan itu berlaku:
| Pola | Mencocokkan | Contoh operasi |
|---|---|---|
secret/data/app | Tepat satu path | Baca secret app |
secret/data/app/* | Semua sub-path di bawahnya | Kelola key apa pun di bawah app |
secret/data/app/ | Sub-path dengan akhiran slash | Semua turunan tanpa menyentuh app itu sendiri |
Perbedaan ini krusial: secret/data/app hanya mencakup path persis itu, sedangkan secret/data/app/* mencakup turunannya — misalnya secret/data/app/backend dan secret/data/app/frontend. Untuk menutup keduanya sekaligus, kalian menulis dua baris seperti contoh di atas.
Ada juga operator + yang mencocokkan tepat satu segmen — berguna ketika ingin membatasi pada satu level saja tanpa wildcard yang terlalu luas, misalnya secret/data/+/db.
Kaidah pengambilan keputusan: OpenBao memakai longest prefix match. Jika beberapa aturan bertabrakan, aturan yang paling spesifik menang. Dan jika salah satu capabilities-nya deny, deny selalu mengalahkan izin apa pun.
Capabilities adalah operasi yang diizinkan pada sebuah path. Berikut daftar lengkapnya:
| Capability | Arti |
|---|---|
create | Membuat data baru pada path |
read | Membaca data yang ada |
update | Memperbarui data yang sudah ada |
delete | Menghapus data |
list | Mendaftar isi sebuah path |
sudo | Akses istimewa yang butuh token berhak sudo (misal menulis policy) |
deny | Menolak semua akses, mengalahkan capabilities lain |
Perhatikan sudo — kemampuan yang mengizinkan operasi sensitif seperti sys/policy atau auth/token. Capability ini hanya pantas diberikan ke pengguna yang sangat tepercaya. Sementara deny berfungsi sebagai pengaman terakhir: menempatkannya di sebuah path menjamin token tidak akan pernah menyentuh path tersebut, apa pun policy lain yang ia miliki.
Menerapkan policy semudah menulis file lalu mengunggahnya ke OpenBao:
bao policy write my-policy policy.hcl
bao policy read my-policy
bao policy listbao policy write my-policy policy.hcl mengambil isi policy.hcl dan menyimpannya sebagai policy bernama my-policy. Policy yang sudah terpasang dapat dibaca ulang untuk keperluan audit, dan dihapus dengan bao policy delete ketika tidak lagi dibutuhkan.
Policy baru terasa dampaknya ketika dibuat token yang terikat padanya. Token dibuat dengan menempelkan policy:
bao token create -policy=my-policy -format=jsonToken yang dihasilkan hanya mewarisi capabilities dari my-policy (ditambah policy bawaan). Uji dengan token tersebut:
export VAULT_TOKEN="s.xxxxxxxxxxxx"
bao kv get secret/data/app
bao kv get secret/data/lainbao kv get secret/data/app berhasil karena path itu tercakup policy. Sebaliknya, bao kv get secret/data/lain ditolak dengan permission denied karena tidak ada satupun policy token yang mencakup path itu. Inilah penegakan privilege yang sebenarnya: akses mengikuti policy, bukan keinginan.
Warning
Mulailah selalu dari policy terkecil lalu tambahkan hanya yang dibutuhkan. Prinsip least privilege berlaku ketat di sini — sebuah token yang beredar di kode aplikasi seharusnya tidak membawa capabilities sudo atau akses ke secret/data/* penuh.
Beberapa pola yang membuat policy lebih aman dan mudah dipelihara:
app-backend, app-frontend, atau admin-audit, bukan menumpuk semua akses ke satu policy raksasa.read-only tidak perlu create dan update.bao policy list lalu bao policy read setiap policy, pastikan tidak ada aturan yang sudah usang masih tertinggal.Policy bukan sekali tulis lalu dilupakan. Ia berkembang bersama arsitektur, dan sama seperti kode, ia layak di-review rutin.
Pada episode 7 ini kalian menulis Access Control Policies berformat HCL, membedakan exact path dan prefix wildcard, mengenal seluruh capabilities dari create sampai deny, menerapkan policy lewat bao policy write, dan menguji penegakan privilege dengan token yang terikat policy.
Inti yang harus dibawa pulang:
deny selalu menang.+ dan * secara sadar — wildcard yang terlalu luas adalah risiko.Di episode 8 berikutnya, kita membahas siapa yang membawa policy itu: Authentication Methods — bagaimana pengguna dan mesin mengidentifikasi diri lewat token, userpass, AppRole, dan SSO seperti OIDC, GitHub, Okta, serta Azure AD.