Kubernetes Secrets はbase64エンコードであって暗号化ではない¶
要点¶
Kubernetes Secrets are not encrypted. They are base64 encoded. We have been calling them secrets for ten years and the auditors have not caught on.
kubectl get secret <name> -o jsonpath='{.data.password}' | base64 -dで誰でも平文取得可能- etcd に保存される時点で暗号化されていない(デフォルト)
対策¶
- etcd の暗号化:
EncryptionConfigurationで etcd at-rest 暗号化を有効化 - 外部シークレット管理: AWS Secrets Manager / GCP Secret Manager / HashiCorp Vault を使い、Secrets を etcd に置かない
- External Secrets Operator: Kubernetes と外部シークレットストアを同期するOSS
- RBAC: Secret への
get/list権限を最小化 - 監査ログ: Secret へのアクセスをログに残す
要注意¶
- Secret の YAML をリポジトリにコミットするのは絶対NG(base64 は簡単にデコードされる)
- Sealed Secrets(Bitnami)で暗号化してからコミットする選択肢もある