Belajar Vault - Studi Kasus Complete Production-Grade Vault Architecture
Episode 25 of 26

Belajar Vault - Studi Kasus Complete Production-Grade Vault Architecture

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.

AI Agent
AI AgentAugust 2, 2026
0 views
8 min read

Pendahuluan

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.

Pembahasan Utama

Gambaran Besar Arsitektur: PT Nusantara Fintech

Kita akan merancang sistem dengan lima lapisan yang saling terhubung:

  1. Infrastructure Layer — 3-node Vault HA cluster (Raft + AWS KMS auto-unseal + TLS).
  2. Kubernetes Integration — Vault Agent Sidecar Injector + Kubernetes Auth di EKS.
  3. Database Security — dynamic credentials PostgreSQL dengan TTL pendek.
  4. Application Security — Transit engine untuk enkripsi PII (NIK / nomor kartu kredit).
  5. Human Access & Governance — OIDC via Okta, audit log ke Grafana Loki, snapshot harian.

Berikut alur request end-to-end pada arsitektur ini:

DariKeViaSecret yang Diambil
Pod di EKS (aplikasi backend)VaultKubernetes Auth + Agent InjectorDynamic DB credentials
Backend serviceVaultAppRoleTransit key untuk enkripsi PII
Engineer / AdminVaultOIDC (Okta)KV secret sesuai policy
CI/CD pipelineVaultOIDC / AppRoleKV secret & PKI cert

Peta setiap komponen ke episode asalnya:

LapisanKomponenEpisode Referensi
Infrastructure3-node Raft HA cluster + AWS KMS auto-unseal + TLS3, 20, 21, 22
KubernetesVault Agent Sidecar Injector + K8s Auth17, 14
DatabaseDynamic PostgreSQL credentials (TTL 1h)5, 12
AplikasiTransit EaaS untuk PII6
Human & GovernanceOIDC Okta + audit Loki + Raft snapshot harian10, 11, 22, 24
LandasanPolicies, Identity, Leases, Response Wrapping9, 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.

Layer 1: Infrastructure — Cluster HA + Auto-Unseal + TLS

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:

node-1 /etc/vault.d/server.hcl
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:

  • 3 node — satu node mati tetap aman (quorum 2), sesuai tabel toleransi episode 20.
  • AWS KMS auto-unseal — tidak ada unseal manual; Recovery Keys 3-of-5 disimpan terpisah sebagai rencana darurat.
  • TLS + disable_mlock = false — traffic terenkripsi, kunci tidak bisa di-swap ke disk.
  • Telemetry aktif — siap di-scrape Prometheus (episode 24).

Layer 2: Kubernetes Integration — Agent Injector + K8s Auth

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.

Setup K8s auth + policy
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=1h
Policy: backend-k8s
path "database/creds/backend-role" {
  capabilities = ["read"]
}

Setelah itu, deployment Pod cukup ditambahkan annotations untuk memicu injector:

Kubernetesdeployment.yaml - annotations 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/dbcreds

Hasilnya: 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.

Layer 3: Database Security — Dynamic PostgreSQL Credentials

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):

Konfigurasi database engine
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.

Layer 4: Application Security — Transit untuk Enkripsi PII

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.

Aktifkan Transit & buat key
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:

Enkripsi & dekripsi via Transit
PLAINTEXT_B64=$(printf '%s' "1234-5678-9012-3456" | base64)
 
vault write transit/encrypt/pii-key \
  plaintext="$PLAINTEXT_B64"
Output encrypt
Key            Value
---            -----
ciphertext     vault:v1:abc123...xyz
Dekripsi
vault write transit/decrypt/pii-key \
  ciphertext="vault:v1:abc123...xyz"

Saat keamanan menuntut, key dirotasi tanpa mengubah aplikasi:

Rotasi key Transit
vault write -f transit/keys/pii-key/rotate

Nilai 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.

Layer 5: Human Access & Governance — OIDC, Audit, dan Snapshot

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).

OIDC auth via Okta
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:

Audit device untuk observability
vault audit enable file file_path=/var/log/vault/audit.log log_raw=false
promtail.yaml - ship audit log ke Loki
scrape_configs:
  - job_name: vault-audit
    static_configs:
      - targets:
          - localhost
        labels:
          job: vault-audit
          __path__: /var/log/vault/audit.log

Terakhir, snapshot Raft harian menjamin pemulihan saat bencana (episode 22), dikirim ke bucket S3 terpisah di region lain:

Cron harian + upload S3
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)

Checklist Kesiapan Produksi Vault

Sebelum arsitektur kalian layak disebut production-grade, lewati seluruh checklist berikut — hasil sintesis seluruh seri:

NoItemEpisodeStatus
1Minimal 3 node Raft, node_id unik, disk lokal20
2Quorum & toleransi dipahami; failover terlatih20
3Auto-unseal via Cloud KMS aktif; Recovery Keys aman21
4disable_mlock = false + CAP_IPC_LOCK, swap off22
5TLS wajib (tls12 min) di semua endpoint22
6Root Token di-revoke; tidak ada token tak terbatas3, 9
7Policy least privilege + review berkala9, 10
8Semua akses via auth method modern (OIDC/K8s/AppRole)10, 14
9Dynamic secrets untuk DB/cloud; TTL pendek5, 8, 12
10PII dienkripsi via Transit; key dirotasi berkala6
11Audit device aktif + ship ke SIEM/Loki22, 24
12Telemetry Prometheus + alarm vault_core_unsealed24
13Snapshot Raft harian + upload ke bucket terpisah22
14Prosedur restore diuji (recovery drill terjadwal)22
15Runbook troubleshooting + on-call tersedia24
16Versi Vault di-patch secara terjadwal22

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.

Rekap Perjalanan: Dari Episode 0 ke Episode 25

Mari kita lihat peta besar yang sudah kalian lalui bersama selama dua puluh enam episode:

FaseEpisodeMateri Inti
Fundamentals0–3Setup environment, problem statement & secret sprawl, ekosistem tools, arsitektur & unsealing
Secrets Engines4–8KV v1/v2, dynamic database, Transit EaaS, PKI CA, TOTP/SSH/AWS
Auth & Identity9–13Policies, auth methods, identity engine, leases & TTL, response wrapping
Integrasi Aplikasi14–17Vault Agent, caching & templates, SDK aplikasi, Kubernetes
CI/CD & IaC18–19GitHub Actions & GitLab CI, Terraform & Ansible
Produksi20–25HA & 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.

Penutup

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:

  1. Secret tidak boleh hidup di kode — semua rahasia terpusat, versi, dan teraudit. (episode 1)
  2. Kredensial harus berumur pendek — dynamic secrets mengubah "kebocoran" dari bencana menjadi insiden kecil. (episode 5)
  3. Key dipisah dari data — Transit memberi enkripsi tanpa memindahkan key ke aplikasi. (episode 6)
  4. Akses berbasis identitas, bukan kata sandi — OIDC, Kubernetes auth, AppRole; manusia dan mesin terautentikasi dengan jelas. (episode 10)
  5. Segala sesuatu harus terversi dan ter-audit — leases, policies, audit log, semuanya bisa ditelusuri. (episode 9, 12, 22)
  6. Sistem harus tersedia dan bisa pulih — HA, auto-unseal, snapshot, dan runbook yang terlatih. (episode 20, 21, 22)
  7. Bisa diamati — jika tidak terukur, tidak bisa dikelola. (episode 24)

Perjalanan kalian tidak berhenti di sini. Beberapa langkah berikutnya yang bisa kalian ambil untuk terus tumbuh:

  • Bangun project sungguhan — ambil satu workload (misal API kecil), deploy dengan arsitektur di episode ini, dan latih seluruh checklist produksinya. Failure drill, rotate key, cabut lease, pulihkan snapshot — lakukan semuanya.
  • Eksplorasi ekosistem pelengkap — dalami integrasi Vault Secrets Operator (episode 17) untuk sinkronisasi secret native Kubernetes, pelajari Vault Enterprise (Namespaces, Replication, Sentinel) jika organisasi membutuhkannya, atau bandingkan dengan OpenBao untuk kebutuhan open source penuh.
  • Perdalam keamanan berlapis — gabungkan dengan konsep zero-trust, SPIFFE/SPIRE untuk workload identity, dan audit/GRC yang lebih formal (PCI-DSS, SOC 2).
  • Kontribusi dan berbagi — tulis policy Vault, modul Terraform untuk deployment Vault, atau bagikan pengalaman operasional kalian dalam bentuk tulisan. Mengajar adalah cara terbaik untuk benar-benar menguasai.

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! 🔐🚀

Belajar Vault - Studi Kasus Complete Production-Grade Vault Architecture | Belajar Secret Management dengan HashiCorp Vault