Episode pamungkas: merangkai seluruh pelajaran episode 0-24 menjadi satu arsitektur Vault enterprise production-grade — dari cluster HA, integrasi Kubernetes, dynamic database credentials, Transit untuk PII, hingga OIDC, audit ke Loki, dan snapshot harian — lengkap dengan checklist kesiapan.

Setelah di episode 24 sebelumnya kita membangun observability dan troubleshooting — sehingga Vault kita tidak hanya aman dan tersedia, tapi juga bisa diamati — pada episode kali ini, episode terakhir dari seri Belajar Secret Management dengan HashiCorp Vault, kita akan merangkai seluruh perjalanan kalian menjadi satu kesatuan: arsitektur Vault enterprise production-grade end-to-end.
Perjalanan ini dimulai di episode 0 dengan pertanyaan sederhana: "apa itu secret management dan mengapa dunia butuh Vault?" Dua puluh lima episode kemudian, kalian tidak lagi bertanya apa — melainkan bagaimana merancang sistem secret management yang hidup, aman, terukur, dan bisa dioperasikan di skala organisasi. Di antara keduanya, kalian telah mempelajari arsitektur dan unsealing, secrets engines (KV, dynamic database, Transit, PKI, TOTP/SSH/AWS), autentikasi dan otorisasi, identitas, leases, response wrapping, integrasi dengan aplikasi dan Kubernetes, CI/CD dan IaC, hingga HA, auto-unseal, hardening, multi-tenancy, dan observability.
Semua keterampilan itu selama ini terasa terpisah-pisah. Di dunia kerja nyata, mereka berjalan sebagai satu sistem. Episode ini akan merancang satu arsitektur untuk sebuah perusahaan fiksi — sebut saja PT Nusantara Fintech — yang ingin mengamankan seluruh secret-nya dengan Vault: infrastruktur cloud, aplikasi di Kubernetes, database, data PII pelanggan, sampai akses manusia. Ini bukan episode tentang fitur — ini episode tentang cara berpikir seorang security/platform engineer saat merancang secret management yang sesungguhnya.
Kita akan merancang sistem dengan lima lapisan yang saling terhubung:
Berikut alur request end-to-end pada arsitektur ini:
| Dari | Ke | Via | Secret yang Diambil |
|---|---|---|---|
| Pod di EKS (aplikasi backend) | Vault | Kubernetes Auth + Agent Injector | Dynamic DB credentials |
| Backend service | Vault | AppRole | Transit key untuk enkripsi PII |
| Engineer / Admin | Vault | OIDC (Okta) | KV secret sesuai policy |
| CI/CD pipeline | Vault | OIDC / AppRole | KV secret & PKI cert |
Peta setiap komponen ke episode asalnya:
| Lapisan | Komponen | Episode Referensi |
|---|---|---|
| Infrastructure | 3-node Raft HA cluster + AWS KMS auto-unseal + TLS | 3, 20, 21, 22 |
| Kubernetes | Vault Agent Sidecar Injector + K8s Auth | 17, 14 |
| Database | Dynamic PostgreSQL credentials (TTL 1h) | 5, 12 |
| Aplikasi | Transit EaaS untuk PII | 6 |
| Human & Governance | OIDC Okta + audit Loki + Raft snapshot harian | 10, 11, 22, 24 |
| Landasan | Policies, Identity, Leases, Response Wrapping | 9, 10, 11, 12, 13 |
Note
Perhatikan pola pentingnya: setiap akses berasal dari mesin yang ter-autentikasi — bukan dari kredensial statis yang diketik manusia. Vault menjadi trust anchor: ia mengeluarkan kredensial berumur pendek, mencatat setiap akses, dan bisa mencabut semuanya seketika. Ini filosofi zero-trust yang kita bangun dari episode 1.
Fondasi arsitektur adalah 3-node Vault HA cluster dengan Raft (episode 20), AWS KMS auto-unseal (episode 21), dan TLS wajib (episode 22). Server config per node:
seal "awskms" {
region = "ap-southeast-1"
kms_key_id = "1234abcd-5678-90ef-ghij-klmnopqrstuv"
}
storage "raft" {
path = "/opt/vault/data"
node_id = "vault-node-1"
retry_join {
leader_api_addr = "https://10.0.0.11:8200"
}
retry_join {
leader_api_addr = "https://10.0.0.12:8200"
}
retry_join {
leader_api_addr = "https://10.0.0.13:8200"
}
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = false
tls_cert_file = "/etc/vault.d/tls/vault.crt"
tls_key_file = "/etc/vault.d/tls/vault.key"
tls_min_version = "tls12"
}
api_addr = "https://10.0.0.11:8200"
cluster_addr = "https://10.0.0.11:8201"
disable_mlock = false
telemetry {
prometheus_retention_time = "24h"
disable_hostname = true
}Keputusan arsitektural pada layer ini:
disable_mlock = false — traffic terenkripsi, kunci tidak bisa di-swap ke disk.Aplikasi backend PT Nusantara Fintech berjalan di EKS. Pod tidak memegang secret sama sekali — ia mendapatkan secret lewat Vault Agent Sidecar Injector (episode 17) yang diotomasi lewat annotations. Yang perlu disiapkan terlebih dahulu: mengaktifkan Kubernetes auth method di Vault dan menulis policy untuk service account aplikasi.
vault auth enable kubernetes
vault write auth/kubernetes/config \
kubernetes_host="https://EKS_CLUSTER_ENDPOINT:443" \
token_reviewer_jwt="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
vault write auth/kubernetes/role/backend \
bound_service_account_names=backend-sa \
bound_service_account_namespaces=backend \
policies=backend-k8s \
ttl=1hpath "database/creds/backend-role" {
capabilities = ["read"]
}Setelah itu, deployment Pod cukup ditambahkan annotations untuk memicu injector:
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-api
namespace: backend
spec:
replicas: 3
template:
metadata:
annotations:
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/role: "backend"
vault.hashicorp.com/agent-inject-secret-dbcreds: "database/creds/backend-role"
vault.hashicorp.com/agent-inject-template-dbcreds: |
{{- with secret "database/creds/backend-role" -}}
DB_HOST={{ .Data.host }}
DB_USER={{ .Data.username }}
DB_PASSWORD={{ .Data.password }}
{{- end -}}
spec:
serviceAccountName: backend-sa
containers:
- name: backend-api
image: nusantara/backend-api:1.4.2
env:
- name: DB_CONFIG
value: /vault/secrets/dbcredsHasilnya: Pod boot, injector memasang container Vault Agent sebagai sidecar, Agent melakukan login via K8s auth, mengambil dynamic credentials database, dan merendernya ke file /vault/secrets/dbcreds (episode 14 & 17). Aplikasi membaca file tersebut — tanpa menyentuh Vault API sama sekali, tanpa token di kode.
Tip
Perhatikan template: credentials yang di-render hanya valid selama TTL lease-nya (1 jam). Agent secara berkala me-renew lease; jika aplikasi mati lebih lama dari TTL, credential otomatis dicabut. Inilah kekuatan dynamic secrets: credential yang bocor bukanlah bencana, melainkan kebocoran kredensial berumur pendek.
Semua credential database PT Nusantara Fintech tidak pernah statis. Vault membuka koneksi administratif ke PostgreSQL dan mengeluarkan kredensial on-demand untuk tiap aplikasi (episode 5):
vault secrets enable -path=database database
vault write database/config/postgres \
plugin_name=postgresql-database-plugin \
allowed_roles="backend-role,reporting-role" \
connection_url="postgresql://{{username}}:{{password}}@postgres.internal:5432/nusantara?sslmode=verify-full" \
username="vault_admin" \
password="$(cat /etc/vault.d/db-admin-pass)" \
verify_connection=true
vault write database/roles/backend-role \
db_name=postgres \
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
default_ttl="1h" \
max_ttl="24h"Setiap kali aplikasi (lewat sidecar Agent) membaca database/creds/backend-role, Vault membuat user PostgreSQL baru secara real-time dengan TTL 1 jam, lengkap dengan VALID UNTIL yang memastikan user tersebut mati sendiri di level database meskipun Vault mati. Tidak ada lagi password permanen yang dirotasi manual — rotasi adalah sesuatu yang otomatis terjadi setiap jam.
Important
Di produksi, kredensial admin database (vault_admin) sebaiknya diambil dari Vault juga (bootstrap via response wrapping, episode 13), disimpan di lokasi terenkripsi, dan TTL-nya pendek. Jangan pernah menulis password admin database di file konfigurasi yang sama dengan kredensial KMS — kalian akan membuat satu titik kegagalan sekaligus satu titik kebocoran.
Data sensitif pelanggan — NIK, nomor kartu kredit — tidak boleh disimpan dalam bentuk plaintext di database aplikasi. Dengan Transit engine (episode 6), PT Nusantara Fintech mengenkripsi PII di dalam aplikasi sementara key-nya dikelola terpusat oleh Vault. Data tetap di aplikasi; hanya key yang di Vault.
vault secrets enable -path=transit transit
vault write -f transit/keys/pii-key \
type=aes256-gcm96 \
auto_rotate_period="720h"Backend memanggil Vault untuk enkripsi dan dekripsi:
PLAINTEXT_B64=$(printf '%s' "1234-5678-9012-3456" | base64)
vault write transit/encrypt/pii-key \
plaintext="$PLAINTEXT_B64"Key Value
--- -----
ciphertext vault:v1:abc123...xyzvault write transit/decrypt/pii-key \
ciphertext="vault:v1:abc123...xyz"Saat keamanan menuntut, key dirotasi tanpa mengubah aplikasi:
vault write -f transit/keys/pii-key/rotateNilai ciphertext lama tetap bisa didekripsi (versioned key), dan data baru otomatis dienkripsi dengan versi terbaru. Rotasi menjadi operasi satu perintah, bukan migrasi data. Inilah perbedaan utama EaaS vs enkripsi aplikasi tradisional yang kita bahas di episode 6: kunci tidak pernah hidup di kode aplikasi.
Akses manusia ke Vault — engineer, admin, auditor — tidak boleh lewat token statis. Mereka login lewat OIDC dengan identity provider perusahaan (Okta / Azure AD), sehingga akses mengikuti status kepegawaian: karyawan yang keluar dari perusahaan otomatis kehilangan akses (episode 10 & 11).
vault auth enable oidc
vault write auth/oidc/config \
oidc_discovery_url="https://nusantara.okta.com" \
oidc_client_id="VAULT_CLIENT_ID" \
oidc_client_secret="REDACTED" \
default_role="engineer"
vault write auth/oidc/role/engineer \
allowed_redirect_uris="https://vault.nusantara.internal/ui/vault/auth/oidc/oidc/callback" \
user_claim="email" \
groups_claim="groups" \
policies="default"Identitas yang login — dengan policy default plus group-based policy dari Okta — membentuk Entity dengan alias OIDC (episode 11). Grup Okta (mis. platform-team, data-team) dipetakan ke policy internal Vault, sehingga governance mengalir dari satu sumber: manajemen identitas perusahaan.
Semua akses dicatat oleh audit device (episode 22) dan dikirim ke Grafana Loki untuk query dan alerting:
vault audit enable file file_path=/var/log/vault/audit.log log_raw=falsescrape_configs:
- job_name: vault-audit
static_configs:
- targets:
- localhost
labels:
job: vault-audit
__path__: /var/log/vault/audit.logTerakhir, snapshot Raft harian menjamin pemulihan saat bencana (episode 22), dikirim ke bucket S3 terpisah di region lain:
0 2 * * * vault /usr/local/bin/scripts/vault-snapshot-daily.sh
# Isi script: vault operator raft snapshot save -> aws s3 cp (bucket terpisah, KMS-encrypted)Sebelum arsitektur kalian layak disebut production-grade, lewati seluruh checklist berikut — hasil sintesis seluruh seri:
| No | Item | Episode | Status |
|---|---|---|---|
| 1 | Minimal 3 node Raft, node_id unik, disk lokal | 20 | ☐ |
| 2 | Quorum & toleransi dipahami; failover terlatih | 20 | ☐ |
| 3 | Auto-unseal via Cloud KMS aktif; Recovery Keys aman | 21 | ☐ |
| 4 | disable_mlock = false + CAP_IPC_LOCK, swap off | 22 | ☐ |
| 5 | TLS wajib (tls12 min) di semua endpoint | 22 | ☐ |
| 6 | Root Token di-revoke; tidak ada token tak terbatas | 3, 9 | ☐ |
| 7 | Policy least privilege + review berkala | 9, 10 | ☐ |
| 8 | Semua akses via auth method modern (OIDC/K8s/AppRole) | 10, 14 | ☐ |
| 9 | Dynamic secrets untuk DB/cloud; TTL pendek | 5, 8, 12 | ☐ |
| 10 | PII dienkripsi via Transit; key dirotasi berkala | 6 | ☐ |
| 11 | Audit device aktif + ship ke SIEM/Loki | 22, 24 | ☐ |
| 12 | Telemetry Prometheus + alarm vault_core_unsealed | 24 | ☐ |
| 13 | Snapshot Raft harian + upload ke bucket terpisah | 22 | ☐ |
| 14 | Prosedur restore diuji (recovery drill terjadwal) | 22 | ☐ |
| 15 | Runbook troubleshooting + on-call tersedia | 24 | ☐ |
| 16 | Versi Vault di-patch secara terjadwal | 22 | ☐ |
Important
Jadikan checklist ini gerbang, bukan aspirasi. Di tim yang sehat, item yang belum tercentang berarti arsitektur belum boleh menyentuh production. Idealnya, sebagian besar item di-enforce oleh otomasi — pipeline, IaC, dan monitoring — karena mesin selalu lebih andal daripada niat baik.
Mari kita lihat peta besar yang sudah kalian lalui bersama selama dua puluh enam episode:
| Fase | Episode | Materi Inti |
|---|---|---|
| Fundamentals | 0–3 | Setup environment, problem statement & secret sprawl, ekosistem tools, arsitektur & unsealing |
| Secrets Engines | 4–8 | KV v1/v2, dynamic database, Transit EaaS, PKI CA, TOTP/SSH/AWS |
| Auth & Identity | 9–13 | Policies, auth methods, identity engine, leases & TTL, response wrapping |
| Integrasi Aplikasi | 14–17 | Vault Agent, caching & templates, SDK aplikasi, Kubernetes |
| CI/CD & IaC | 18–19 | GitHub Actions & GitLab CI, Terraform & Ansible |
| Produksi | 20–25 | HA & Raft, auto-unseal, hardening, namespaces, observability, arsitektur enterprise |
Dari sekadar menjalankan vault server -dev di episode 0, kalian kini mampu merancang sistem di mana seluruh secret perusahaan dikelola oleh satu platform yang tersedia, terukur, teraudit, dan bisa dipulihkan. Itu adalah kemampuan langka yang bernilai sangat tinggi di pasar kerja security, DevOps, SRE, dan cloud engineering.
Selamat — kalian telah menyelesaikan seri Belajar Secret Management dengan HashiCorp Vault dari episode 0 hingga episode 25!
Di episode pamungkas ini kita telah merangkai arsitektur enterprise end-to-end untuk PT Nusantara Fintech: infrastructure layer (cluster 3-node Raft + AWS KMS auto-unseal + TLS), Kubernetes integration (Agent Sidecar Injector + K8s auth di EKS), database security (dynamic PostgreSQL credentials TTL 1 jam), application security (Transit untuk enkripsi PII), dan human access & governance (OIDC via Okta, audit ke Grafana Loki, snapshot harian). Kita menutupnya dengan checklist kesiapan produksi yang menjadikan seluruh pelajaran seri ini sebagai satu gerbang menuju production.
Namun yang paling berharga bukanlah konfigurasinya — melainkan cara berpikir yang sekarang kalian miliki:
Perjalanan kalian tidak berhenti di sini. Beberapa langkah berikutnya yang bisa kalian ambil untuk terus tumbuh:
Ingatlah kalimat dari episode 3: Vault bukan sekadar gudang rahasia — ia adalah sistem kepercayaan untuk seluruh organisasi. Kepercayaan bahwa secret dijaga, akses diawasi, dan recovery dimungkinkan. Engineer yang bisa memberikan kepercayaan itu adalah engineer yang diandalkan organisasi.
Terima kasih sudah menemani perjalanan ini sampai akhir. Sekarang — buka terminal, inisialisasi cluster Vault pertama kalian, dan jadikan secret management sebagai sesuatu yang bisa dipertanggungjawabkan. Selamat berkarya sebagai engineer keamanan dan infrastruktur yang sesungguhnya! 🔐🚀