External Secret Manager #
Kubernetes Secret yang dikelola secara native punya keterbatasan serius untuk kebutuhan produksi skala besar: tidak ada audit log per-akses, tidak ada rotasi otomatis, dan nilai sensitif tersimpan di Etcd yang harus dilindungi sendiri. External secret manager hadir untuk mengisi celah ini — mereka adalah sistem khusus yang dirancang untuk menyimpan, mengamankan, dan mengelola siklus hidup secret. Artikel ini membahas cara mengintegrasikan Kubernetes dengan tiga solusi paling populer.
Mengapa External Secret Manager? #
Kubernetes Secret native:
✗ Nilai di Etcd — keamanan bergantung sepenuhnya pada keamanan Etcd
✗ Tidak ada audit log siapa mengakses secret kapan
✗ Tidak ada rotasi otomatis
✗ Tidak ada versioning secret
✗ Sulit digunakan lintas cluster atau lintas cloud
External secret manager (Vault, AWS SM, GCP SM):
✓ Audit log lengkap — siapa, kapan, dari mana
✓ Rotasi otomatis dengan lambda/function integration
✓ Versioning — bisa rollback ke versi secret sebelumnya
✓ Dynamic secret — generate credential sementara yang kadaluarsa otomatis
✓ Satu sumber kebenaran untuk banyak cluster dan aplikasi
✓ Fine-grained access control per aplikasi
External Secrets Operator (ESO) #
External Secrets Operator adalah operator Kubernetes yang menjembatani antara Kubernetes dan berbagai external secret manager. Ia watch ExternalSecret resource dan mensinkronkan nilai ke Kubernetes Secret.
Cara kerja ESO:
External Secret Manager Kubernetes Cluster
(AWS SM / Vault / GCP SM)
│ │
│ External Secrets
│ Operator
│ │
│ [sync setiap N menit] │
│◄──────────────────────────────│
│ │
│ [kembalikan nilai secret] │
│───────────────────────────────►
│
Kubernetes
Secret
│
Pod
# Install ESO via Helm
helm repo add external-secrets https://charts.external-secrets.io
helm install external-secrets external-secrets/external-secrets \
--namespace external-secrets \
--create-namespace
Integrasi dengan AWS Secrets Manager #
# 1. ClusterSecretStore — koneksi ke AWS SM (cluster-level)
apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
name: aws-secrets-manager
spec:
provider:
aws:
service: SecretsManager
region: ap-southeast-1
auth:
# Gunakan IRSA (IAM Roles for Service Accounts) di EKS
serviceAccount:
name: external-secrets-sa
namespace: external-secrets
# 2. ExternalSecret di namespace aplikasi
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: database-credentials
namespace: production
spec:
refreshInterval: "1h"
secretStoreRef:
name: aws-secrets-manager
kind: ClusterSecretStore
target:
name: database-credentials # nama Kubernetes Secret yang dibuat
creationPolicy: Owner
deletionPolicy: Retain # jangan hapus Secret jika ExternalSecret dihapus
data:
- secretKey: DB_USERNAME
remoteRef:
key: production/database # path di AWS Secrets Manager
property: username
- secretKey: DB_PASSWORD
remoteRef:
key: production/database
property: password
- secretKey: DB_HOST
remoteRef:
key: production/database
property: host
# Buat secret di AWS Secrets Manager
aws secretsmanager create-secret \
--name "production/database" \
--secret-string '{"username":"appuser","password":"S3cur3P@ss","host":"postgres.internal"}'
# Cek status sync
kubectl describe externalsecret database-credentials -n production
# Status: SecretSynced = True
Integrasi dengan HashiCorp Vault #
Vault adalah solusi yang paling fleksibel — mendukung banyak secret engine termasuk dynamic secrets (credential sementara yang di-generate on-demand).
# SecretStore untuk Vault
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: vault-store
namespace: production
spec:
provider:
vault:
server: "https://vault.internal:8200"
path: "secret" # mount path di Vault
version: "v2" # KV secrets engine version
auth:
kubernetes:
mountPath: "kubernetes"
role: "production-api" # Vault role yang sudah dikonfigurasi
serviceAccountRef:
name: api-service-account
# ExternalSecret dari Vault
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: api-secrets
namespace: production
spec:
refreshInterval: "15m"
secretStoreRef:
name: vault-store
kind: SecretStore
target:
name: api-secrets
data:
- secretKey: STRIPE_KEY
remoteRef:
key: production/payment # path di Vault KV
property: stripe_key
- secretKey: SENDGRID_KEY
remoteRef:
key: production/email
property: api_key
Dynamic Secrets dengan Vault #
Salah satu fitur paling powerful Vault: generate database credential sementara yang otomatis kadaluarsa:
# Vault Database Secret Engine
# Vault generate username/password baru setiap kali diminta
# Credential kadaluarsa setelah TTL yang ditentukan
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
spec:
target:
name: db-dynamic-creds
data:
- secretKey: username
remoteRef:
key: database/creds/production-role # Vault database engine path
property: username
- secretKey: password
remoteRef:
key: database/creds/production-role
property: password
# ESO refresh setiap kali TTL mendekati expiry
refreshInterval: "1h"
Integrasi dengan GCP Secret Manager #
# SecretStore untuk GCP Secret Manager
apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
name: gcp-secret-manager
spec:
provider:
gcpsm:
projectID: "my-gcp-project"
auth:
workloadIdentity:
clusterLocation: asia-southeast1
clusterName: production-cluster
serviceAccountRef:
name: external-secrets-sa
namespace: external-secrets
# ExternalSecret dari GCP SM
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: app-secrets
namespace: production
spec:
refreshInterval: "1h"
secretStoreRef:
name: gcp-secret-manager
kind: ClusterSecretStore
target:
name: app-secrets
data:
- secretKey: FIREBASE_KEY
remoteRef:
key: production-firebase-key # nama secret di GCP SM
version: latest
Memilih External Secret Manager #
HashiCorp Vault:
Cocok jika:
✓ Multi-cloud atau hybrid cloud
✓ Butuh dynamic secrets (credential sementara)
✓ Banyak tim dan workload yang butuh fine-grained access control
✓ Ingin satu solusi untuk semua jenis secret (database, PKI, SSH)
Pertimbangan: lebih kompleks untuk di-setup dan di-maintain
AWS Secrets Manager:
Cocok jika:
✓ Semua workload di AWS/EKS
✓ Butuh integrasi native dengan RDS automatic rotation
✓ Tim sudah familiar dengan AWS ecosystem
Pertimbangan: biaya per-secret dan per-API call; vendor lock-in AWS
GCP Secret Manager:
Cocok jika:
✓ Semua workload di GKE/GCP
✓ Integrasi dengan Google Cloud IAM dan audit logging
Pertimbangan: lebih sederhana dari Vault; biaya per-access
Azure Key Vault:
Cocok jika:
✓ Semua workload di AKS/Azure
✓ Integrasi dengan Azure AD dan managed identities
Pertimbangan: hanya untuk ekosistem Azure
Ringkasan #
- External secret manager untuk produksi skala besar — audit log, rotasi otomatis, versioning, dan dynamic secrets tidak ada di Kubernetes Secret native.
- External Secrets Operator sebagai jembatan universal — mendukung AWS SM, Vault, GCP SM, Azure Key Vault, dan lainnya dengan pola yang konsisten.
refreshIntervalmengontrol frekuensi sync — nilai lebih pendek berarti secret lebih cepat ter-update tapi lebih banyak API call ke secret manager; sesuaikan dengan kebutuhan rotasi.- Dynamic secrets Vault untuk keamanan maksimal — credential database di-generate on-demand dengan TTL pendek; tidak ada credential permanen yang bisa dicuri.
- Pilih berdasarkan cloud provider dan kompleksitas — AWS SM untuk EKS, GCP SM untuk GKE, Vault untuk multi-cloud atau kebutuhan yang lebih kompleks.
- IRSA/Workload Identity untuk autentikasi — jangan gunakan static credentials untuk ESO mengakses secret manager; gunakan IAM roles yang terikat ke service account Kubernetes.
← Sebelumnya: Secret Management Best Practice Berikutnya: ConfigMap vs Secret →