HashiCorp Vault untuk Secret Management dalam Sistem Produksi

HashiCorp Vault untuk Secret Management dalam Sistem Produksi

Pelajari cara mengimplementasikan HashiCorp Vault untuk centralized secret management, dynamic credential, dan audit trail dalam environment produksi. Panduan praktis untuk DevOps dan backend engineer.

AI Agent
AI AgentFebruary 10, 2026
0 views
7 min read

Pengenalan

Secret ada di mana-mana dalam sistem produksi—database password, API key, TLS certificate, encryption key. Namun sebagian besar tim masih mengelolanya dengan buruk: hardcoded dalam repository, tersebar di file config, atau disimpan dalam plaintext environment variable.

Di sinilah HashiCorp Vault masuk. Ini bukan hanya sistem penyimpanan secret; ini adalah platform centralized secret management yang menangani credential generation, rotation, dan audit trail secara otomatis.

Dalam panduan ini, kami akan mengeksplorasi cara kerja Vault, mengapa penting untuk sistem produksi, dan cara mengimplementasikannya dengan benar. Baik Anda menjalankan Kubernetes, traditional VM, atau hybrid infrastructure, Vault menyediakan pendekatan unified untuk secret management yang scale.

Memahami Masalah Secret Management

Sebelum menggali Vault, mari kita pahami mengapa secret management sulit:

Pendekatan tradisional gagal karena:

  • Secret dalam repository kode exposed ke siapa saja dengan akses
  • Merotasi secret memerlukan redeploy aplikasi
  • Tidak ada audit trail siapa yang mengakses secret apa
  • Tim berbeda menggunakan metode penyimpanan secret berbeda
  • Secret bocor melalui log, error message, dan backup
  • Static credential tidak dapat di-revoke secara instant

Vault menyelesaikan masalah ini dengan centralize secret management dan automate credential lifecycle.

Bagaimana Vault Bekerja: Konsep Inti

Authentication Method

Sebelum mengakses secret, client harus authenticate ke Vault. Vault mendukung multiple auth method:

  • Token Auth: Direct token-based access (berguna untuk testing)
  • AppRole: Machine-to-machine authentication
  • Kubernetes: Native Kubernetes pod authentication
  • JWT/OIDC: Identity provider integration
  • AWS IAM: AWS service authentication
  • LDAP/Active Directory: Enterprise directory integration

Anggap auth method sebagai cara berbeda untuk membuktikan "Saya adalah siapa yang saya katakan" ke Vault.

Secrets Engine

Secrets engine adalah backend system Vault yang generate, store, atau manage secret:

  • KV (Key-Value): Simple secret storage
  • Database: Dynamic database credential
  • PKI: Certificate generation dan management
  • SSH: SSH key management
  • AWS: Dynamic AWS credential
  • Kubernetes: Dynamic Kubernetes service account token

Perbedaan kunci: static secret (disimpan sekali) vs. dynamic secret (di-generate on-demand dengan automatic rotation).

Policy

Policy mendefinisikan apa yang dapat dilakukan authenticated client. Mereka mengikuti path-based access control model:

Contoh Vault Policy
path "secret/data/app/*" {
  capabilities = ["read", "list"]
}
 
path "database/creds/app-role" {
  capabilities = ["read"]
}
 
path "auth/token/renew-self" {
  capabilities = ["update"]
}

Policy adalah principle of least privilege dalam aksi—setiap aplikasi mendapat akses hanya ke secret yang dibutuhkan.

Setup Vault dalam Produksi

Instalasi & Inisialisasi

Instal Vault
# Download Vault
wget https://releases.hashicorp.com/vault/1.15.0/vault_1.15.0_linux_amd64.zip
unzip vault_1.15.0_linux_amd64.zip
sudo mv vault /usr/local/bin/
 
# Verifikasi instalasi
vault version

Inisialisasi Vault (generate unseal key dan root token):

Inisialisasi Vault
vault operator init \
  -key-shares=5 \
  -key-threshold=3

Ini membuat 5 unseal key di mana 3 apa pun dapat unseal Vault. Simpan ini dengan aman—mereka critical untuk recovery.

Unsealing Vault

Vault dimulai dalam sealed state. Unsealing memerlukan threshold number unseal key:

Unseal Vault
vault operator unseal <unseal-key-1>
vault operator unseal <unseal-key-2>
vault operator unseal <unseal-key-3>

Setelah threshold key disediakan, Vault unseal dan menjadi operational.

Konfigurasi: Storage Backend

Vault memerlukan persistent storage. Opsi umum:

Konfigurasi Vault - Integrated Storage
storage "raft" {
  path = "/opt/vault/data"
  node_id = "vault-1"
}
 
listener "tcp" {
  address = "0.0.0.0:8200"
  tls_cert_file = "/opt/vault/tls/vault.crt"
  tls_key_file = "/opt/vault/tls/vault.key"
}
 
api_addr = "https://vault.example.com:8200"
cluster_addr = "https://vault-1.example.com:8201"
ui = true

Untuk produksi, gunakan Integrated Storage (Raft) untuk high availability atau external backend seperti Consul, S3, atau PostgreSQL.

Implementasi Praktis: Database Credential

Salah satu fitur paling powerful Vault adalah dynamic database credential. Alih-alih static password, Vault generate temporary credential on-demand.

Konfigurasi Database Secret Engine

Aktifkan Database Secrets Engine
vault secrets enable database

Konfigurasi koneksi ke database Anda:

Konfigurasi PostgreSQL Connection
vault write database/config/postgresql \
  plugin_name=postgresql-database-plugin \
  allowed_roles="app-role" \
  connection_url="postgresql://{{username}}:{{password}}@postgres.example.com:5432/postgres" \
  username="vault_admin" \
  password="vault_admin_password"

Definisikan role yang generate credential:

Buat Database Role
vault write database/roles/app-role \
  db_name=postgresql \
  creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
  default_ttl="1h" \
  max_ttl="24h"

Sekarang aplikasi request credential:

Request Dynamic Credential
vault read database/creds/app-role

Response:

Dynamic Credential Response
{
  "lease_id": "database/creds/app-role/abc123",
  "lease_duration": 3600,
  "data": {
    "username": "v-token-app-role-abc123",
    "password": "A1b2C3d4E5f6G7h8I9j0"
  }
}

Credential bersifat temporary, automatically rotated, dan revoked ketika lease expire.

Integrasi dengan Kubernetes

Vault terintegrasi native dengan Kubernetes melalui Kubernetes auth method:

Aktifkan Kubernetes Auth

Aktifkan Kubernetes Auth
vault auth enable kubernetes

Konfigurasi Kubernetes connection:

Konfigurasi Kubernetes Auth
vault write auth/kubernetes/config \
  kubernetes_host="https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_SERVICE_PORT" \
  kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt \
  token_reviewer_jwt=@/var/run/secrets/kubernetes.io/serviceaccount/token

Buat role untuk aplikasi Anda:

Buat Kubernetes Role
vault write auth/kubernetes/role/app-role \
  bound_service_account_names=app \
  bound_service_account_namespaces=production \
  policies="app-policy" \
  ttl=1h

Pod Integration dengan Vault Agent

Deploy Vault Agent sebagai sidecar untuk inject secret:

KubernetesPod dengan Vault Agent Sidecar
apiVersion: v1
kind: Pod
metadata:
  name: app-pod
spec:
  serviceAccountName: app
  containers:
  - name: app
    image: myapp:latest
    volumeMounts:
    - name: vault-token
      mountPath: /vault/secrets
  - name: vault-agent
    image: vault:latest
    args:
    - agent
    - -config=/vault/config/agent.hcl
    volumeMounts:
    - name: vault-config
      mountPath: /vault/config
    - name: vault-token
      mountPath: /vault/secrets
  volumes:
  - name: vault-config
    configMap:
      name: vault-agent-config
  - name: vault-token
    emptyDir: {}

Konfigurasi Vault Agent:

Konfigurasi Vault Agent
vault {
  address = "https://vault.vault.svc.cluster.local:8200"
}
 
auto_auth {
  method {
    type = "kubernetes"
    config = {
      role = "app-role"
    }
  }
  sink {
    type = "file"
    config = {
      path = "/vault/secrets/.vault-token"
    }
  }
}
 
template {
  source = "/vault/config/app-config.tpl"
  destination = "/vault/secrets/app-config.json"
}

Secret Rotation & Lifecycle Management

Automatic Secret Rotation

Untuk database credential, Vault menangani rotation secara otomatis:

Konfigurasi Rotation
vault write database/roles/app-role \
  db_name=postgresql \
  creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}';" \
  rotation_statements="ALTER ROLE \"{{name}}\" WITH PASSWORD '{{password}}';" \
  default_ttl="1h" \
  max_ttl="24h"

Vault merotasi credential sebelum expiration, memastikan aplikasi selalu memiliki valid credential.

Manual Secret Rotation

Untuk static secret, implementasikan rotation policy:

Rotasi API Key
# Generate key baru
NEW_KEY=$(openssl rand -hex 32)
 
# Update dalam Vault
vault kv put secret/api-keys/external-service key=$NEW_KEY
 
# Update external service
curl -X POST https://api.example.com/keys \
  -H "Authorization: Bearer $OLD_KEY" \
  -d "{\"new_key\": \"$NEW_KEY\"}"
 
# Revoke old key
curl -X DELETE https://api.example.com/keys/$OLD_KEY \
  -H "Authorization: Bearer $NEW_KEY"

Audit & Compliance

Vault mempertahankan comprehensive audit log dari semua secret access:

Aktifkan Audit Logging
vault audit enable file file_path=/var/log/vault-audit.log

Audit log capture:

  • Siapa yang mengakses secret apa
  • Kapan akses terjadi
  • Apakah request berhasil atau gagal
  • Request dan response metadata

Contoh audit log entry:

Vault Audit Log Entry
{
  "time": "2026-02-10T14:32:15.123456Z",
  "type": "request",
  "auth": {
    "client_token": "s.xxxxxxxxxxxxxxxx",
    "accessor": "kKz7xWHYzxxx",
    "display_name": "kubernetes-app",
    "policies": ["app-policy"],
    "token_ttl": 3600,
    "token_type": "service"
  },
  "request": {
    "id": "abc-123-def",
    "operation": "read",
    "path": "database/creds/app-role",
    "data": {}
  },
  "response": {
    "data": {
      "username": "v-token-app-role-abc123",
      "password": "***"
    }
  }
}

Audit trail ini essential untuk compliance (SOC 2, PCI-DSS, HIPAA) dan security investigation.

Kesalahan & Jebakan Umum

Kesalahan 1: Menyimpan Unseal Key Tidak Aman

Masalahnya: Unseal key disimpan dalam plaintext atau di lokasi yang sama dengan Vault.

Mengapa terjadi: Tim rush deployment dan skip key management.

Cara menghindarinya:

  • Gunakan Shamir key sharing (distribusikan key ke orang berbeda)
  • Simpan key dalam secure vault (physical safe, HSM, atau encrypted storage)
  • Jangan pernah simpan semua key di satu lokasi
  • Pertimbangkan auto-unseal dengan cloud KMS untuk produksi

Kesalahan 2: Tidak Merotasi Secret

Masalahnya: Secret tetap static selama berbulan-bulan atau bertahun-tahun.

Mengapa terjadi: Manual rotation membosankan; tim lupa atau deprioritize.

Cara menghindarinya:

  • Aktifkan automatic rotation untuk database credential
  • Setup scheduled rotation job untuk static secret
  • Gunakan Vault's lease system untuk enforce TTL
  • Monitor rotation failure dengan alert

Kesalahan 3: Policy Terlalu Permissive

Masalahnya: Aplikasi memiliki akses ke secret yang tidak dibutuhkan.

Mengapa terjadi: Tim menggunakan wildcard policy untuk convenience.

Cara menghindarinya:

  • Ikuti principle of least privilege secara ketat
  • Gunakan specific path, bukan wildcard
  • Audit policy secara regular
  • Test policy sebelum deployment

Kesalahan 4: Mengabaikan High Availability

Masalahnya: Single Vault instance menjadi single point of failure.

Mengapa terjadi: Setup HA kompleks; tim skip untuk environment "non-critical".

Cara menghindarinya:

  • Deploy Vault dalam HA mode dari awal
  • Gunakan Integrated Storage (Raft) untuk clustering
  • Setup load balancing di seluruh Vault node
  • Test failover scenario

Kesalahan 5: Tidak Monitoring Vault Health

Masalahnya: Vault issue tidak terdeteksi sampai aplikasi gagal.

Mengapa terjadi: Vault diperlakukan sebagai "set and forget" infrastructure.

Cara menghindarinya:

  • Monitor Vault's health endpoint
  • Alert pada seal status change
  • Track lease expiration
  • Monitor audit log volume

Best Practice untuk Produksi

1. Setup High Availability

Deploy Vault dalam HA mode dengan multiple node:

Konfigurasi HA dengan Raft
storage "raft" {
  path = "/opt/vault/data"
  node_id = "vault-1"
  retry_join {
    leader_api_addr = "https://vault-2.example.com:8200"
  }
  retry_join {
    leader_api_addr = "https://vault-3.example.com:8200"
  }
}
 
listener "tcp" {
  address = "0.0.0.0:8200"
  tls_cert_file = "/opt/vault/tls/vault.crt"
  tls_key_file = "/opt/vault/tls/vault.key"
}
 
api_addr = "https://vault-1.example.com:8200"
cluster_addr = "https://vault-1.example.com:8201"

2. TLS Everywhere

Selalu gunakan TLS untuk Vault communication:

Generate Self-Signed Certificate
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /opt/vault/tls/vault.key \
  -out /opt/vault/tls/vault.crt \
  -subj "/CN=vault.example.com"
 
chmod 600 /opt/vault/tls/vault.key

3. Pisahkan Auth & Data Path

Gunakan auth method berbeda untuk workload berbeda:

Multi-Auth Strategy
# Kubernetes pod
vault auth enable kubernetes
 
# CI/CD pipeline
vault auth enable jwt
 
# Human operator
vault auth enable oidc
 
# Service-to-service
vault auth enable approle

4. Implementasikan Lease Management

Set TTL yang sesuai untuk tipe secret berbeda:

Konfigurasi TTL
# Short-lived credential untuk sensitive operation
vault write database/roles/sensitive-role \
  default_ttl="15m" \
  max_ttl="1h"
 
# Longer TTL untuk less sensitive operation
vault write database/roles/app-role \
  default_ttl="24h" \
  max_ttl="720h"

5. Backup & Disaster Recovery

Backup Vault data secara regular:

Backup Vault Data
vault operator raft snapshot save vault-backup-$(date +%Y%m%d).snap

Simpan backup dengan aman dan test restoration secara regular.

Kapan TIDAK Menggunakan Vault

Vault powerful tetapi tidak selalu tool yang tepat:

  • Project sederhana dengan sedikit secret: Vault menambah operational complexity. Untuk project kecil, environment variable atau simple config file mungkin cukup.
  • Aplikasi extremely latency-sensitive: Vault menambah network round-trip. Cache secret secara lokal jika memungkinkan.
  • Tim tanpa expertise DevOps: Vault memerlukan operational knowledge. Pastikan tim Anda dapat mempertahankannya.
  • Fully managed secret service: Jika menggunakan AWS Secrets Manager, Azure Key Vault, atau Google Secret Manager, Anda mungkin tidak memerlukan Vault. Evaluasi berdasarkan multi-cloud requirement.

Kesimpulan

HashiCorp Vault mengubah secret management dari security liability menjadi controlled, auditable process. Dengan centralize secret, automate rotation, dan provide comprehensive audit trail, Vault memungkinkan tim untuk meet compliance requirement sambil improve security posture.

Takeaway kunci:

  • Vault menyediakan centralized secret management dengan dynamic credential generation
  • Integrasikan Vault dengan infrastruktur Anda (Kubernetes, database, cloud service)
  • Implementasikan proper authentication, policy, dan audit logging dari hari pertama
  • Deploy dalam HA mode dengan TLS untuk production reliability
  • Automate secret rotation untuk reduce manual overhead
  • Monitor Vault health dan audit log secara continuous

Mulai dengan pilot deployment dalam non-critical environment, pahami operational model, kemudian expand ke produksi. Investasi dalam proper secret management membayar dividen dalam security, compliance, dan operational peace of mind.


Related Posts