Secret management in VCS, GCP, and Kubernetes
Bagaimana menyimpan secara aman informasi rahasia (e.g. API_KEY
) untuk sebuah project, sekaligus mudah membagikan informasi tersebut ke pihak yang membutuhkan akses (e.g. co-workers, build server, continuous delivery server, production server)?
Blackbox
Dengan Blackbox, secret-file
diencrypt/decrypt dengan GPG keys committers. Blackbox juga mampu menambahkan/menghapus akses ke committers baru/lama
Untuk encrypt file simply:blackbox_register_new_file secret.yaml
. Command tersebut generates file secret.yaml.gpg
yang safe untuk dicommit di VCS (e.g. Github, Mercurial).
Dan untuk decrypt: blackbox_edit_start secret.yaml.gpg
. Command ini hanya bisa diexecute oleh mereka yang GPG-nya sudah diregister.
KMS
KMS adalah managed service untuk key management di Google Cloud Platform (GCP). Bagusnya, KMS terintegrasi seamlessly dengan service GCP yang lain seperti Google Cloud Build.
Once KMS sudah terconfigure (bisa melalui dashboard GCP atau gcloud
CLI), proses encrypt cukup:
gcloud kms encrypt \
--plaintext-file=plain-file \
--ciphertext-file=encrypted-file.enc \
--location=my-location \
--keyring=my-keyring \
--key=my-key
Command tersebut generates file encrypted-file.enc
yang hanya bisa didecrypt oleh services yang diregister di GCP KMS.
Karena terintegrasi dengan service lain, untuk decrypt file tersebut di GCP service lain sangat mudah. Contohnya di Google Cloud Build kita cukup tambahkan step berikut sehingga plain-file
availabe dipakai dalam build step berikutnya:
steps:
- name: gcr.io/cloud-builders/gcloud
args:
- kms
- decrypt
- --ciphertext-file=encrypted-file.enc
- --plaintext-file=plain-file
- --location=my-location
- --keyring=my-keyring
- --key=my-key
Sealed Secrets
Sealed Secrets adalah solusi spesifik untuk Kubernetes. Kubernetes sudah sejak lama memiliki konsep secret.yaml
untuk menyimpan informasi rahasia. Namun, value secretnya hanya base64 encoded dalam file tersebut. Sehingga siapapun bisa echo secret_value | base64 -D
untuk decode.
Agar secret.yaml
bisa dicommit di VCS, bisa menggunakan Sealed Secret. Sealed Secret akan generate file sealedsecret.yaml
yang hanya bisa didecrypt oleh sealed-secret-controller
di Kubernetes cluster tujuan yang otomatis dideploy menjadi Kubernetes secret
kubeseal --format yaml < manifests/secret.yaml > manifests/sealedsecret.yaml
kubectl create -f manifests/sealedsecret.yaml