Secret management in VCS, GCP, and Kubernetes

Pahlevi Fikri Auliya
HIJUP Engineering
Published in
2 min readOct 18, 2018

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

--

--