Secret yang bocor adalah akar sebagian besar insiden keamanan modern; di episode ini kalian memahami prinsip secrets management, memakai Vault/OpenBao dan cloud KMS, menerapkan rotasi secret, lalu mengelola rahasia dalam pipeline CI/CD dengan aman

Sepanjang series ini kalian berulang kali mendengar peringatan yang sama: jangan menaruh secret di kode, di pipeline, di image. Di episode 16 inilah peringatan itu dijawab dengan solusinya. Secrets management adalah disiplin menyimpan, mengedarkan, dan mengganti rahasia — password, token API, kunci database, certificate — secara terpusat, terkontrol, dan dapat diaudit.
Mengapa ini penting? Karena hampir semua insiden keamanan modern dimulai dari secret yang bocor: access key di repository publik, password database di .env yang ter-commit, token yang tertanam di image container. Sekali secret bocor ke publik, ia harus dianggap terbakar — dan rotasi adalah satu-satunya obat. Episode ini membekali kalian dengan prinsip, tool (Vault/OpenBao, cloud KMS), dan praktik rotasi di dalam pipeline.
Empat aturan yang tidak bisa ditawar:
ENV di Dockerfile tertanam permanen di layer image (episode 7).Important
Jika ada secret yang pernah ter-expose ke repo publik atau log, asumsikan ia sudah terbaca. Rotasi segera — bukan menunggu "mungkin tidak ada yang membaca". Biaya rotasi jauh lebih kecil daripada biaya breach.
HashiCorp Vault adalah standar industri untuk manajemen secret. OpenBao adalah fork open source yang lahir dari perpindahan Vault ke lisensi BUSL — secara fungsional kompatibel. Konsep intinya:
| Konsep | Fungsi |
|---|---|
| Secret Engine | Penyimpan secret (KV), atau generator dinamis (database, cloud, PKI) |
| Path | Ruang nama penyimpanan, misal secret/data/app/prod |
| Policies | Aturan akses berbasis path |
| Dynamic secrets | Secret yang dibuat saat diminta dan otomatis kedaluwarsa |
| Lease | Masa berlaku secret — setelah habis, ia tidak lagi valid |
Contoh menyimpan dan membaca secret dengan KV:
vault kv put secret/app/prod db_password=Str0ng! db_user=app
vault kv get secret/app/prod
vault kv metadata get secret/app/prodKekuatan Vault yang sesungguhnya adalah dynamic secrets: aplikasi meminta kredensial database saat dibutuhkan, Vault membuat user baru dengan lease pendek (misal 1 jam), dan mencabutnya setelah lease habis:
vault read database/creds/app-role
# Key Value
# lease_duration 1h
# password xK9q... (user dibuat khusus)
# username v-token-app-... (otomatis dicabut setelah lease)Tidak ada lagi password statis yang disimpan di config aplikasi — kredensial ada justru ketika dibutuhkan, dan mati setelahnya.
Cloud KMS (AWS KMS, GCP Cloud KMS, Azure Key Vault) adalah layanan terkelola untuk enkripsi dan rotasi kunci. Perbedaannya dengan Vault: KMS mengelola kunci enkripsi untuk data cloud (disk, bucket, database), sedangkan Vault mengelola secret aplikasi (kredensial, token). Keduanya saling melengkapi — contoh pola umum: KMS menjaga kunci enkripsi data di rest, Vault menjaga kredensial akses aplikasi.
GCP Cloud KMS terintegrasi mulus dengan aplikasi via API:
gcloud kms encrypt \
--location=global --keyring=app \
--key=app-key \
--plaintext-file=secret.txt \
--ciphertext-file=secret.txt.encRotasi adalah siklus hidup secret yang disengaja — dan harus terotomasi, bukan ritual tahunan manual:
Dengan dynamic secrets di Vault, rotasi tidak lagi menjadi acara: setiap lease baru adalah kredensial baru. Inilah alasan mengapa Vault mengubah workflow keamanan dari "proses" menjadi "default".
Alur yang benar: CI tidak pernah menyimpan secret, ia mengambilnya saat dibutuhkan. Di GitHub Actions, secret disimpan di pengaturan repository dan di-inject sebagai environment variable yang hanya hidup selama job:
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Ambil secret dari Vault
uses: hashicorp/vault-action@v3
with:
url: https://vault.company.com
token: ${{ secrets.VAULT_TOKEN }}
secrets: |
secret/data/ci/github-token | GH_TOKEN ;
secret/data/app/prod | DB_PASSWORD
- name: Deploy via GitOps manifest
run: |
gh repo clone username/deploy-manifests
echo "$GH_TOKEN" | gh auth login --with-token
# update tag image, push, lalu Argo CD (episode 14) mengambil alihNote
Dalam Kubernetes, pasangkan pola ini dengan External Secrets Operator atau Sealed Secrets: manifest GitOps menyimpan referensi ke secret (misal nama Vault path), bukan nilainya. Saat Argo CD men-deploy, operator menarik nilai aktual dari Vault/cloud KMS ke dalam Kubernetes Secret. Hasilnya: Git tetap bersih, secret tetap aman, dan GitOps tetap berfungsi penuh.
Inti yang harus dibawa pulang:
Di episode 17 selanjutnya kita membahas Artifact & Environment Management — cara mengelola hasil build (artifact) secara immutable dan mempromosikannya antar-environment secara terkendali. Secret yang aman + artifact yang immutable adalah dua pilar rilis yang dapat dipercaya.