コンテンツにスキップ

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 に保存される時点で暗号化されていない(デフォルト)

対策

  1. etcd の暗号化: EncryptionConfiguration で etcd at-rest 暗号化を有効化
  2. 外部シークレット管理: AWS Secrets Manager / GCP Secret Manager / HashiCorp Vault を使い、Secrets を etcd に置かない
  3. External Secrets Operator: Kubernetes と外部シークレットストアを同期するOSS
  4. RBAC: Secret への get/list 権限を最小化
  5. 監査ログ: Secret へのアクセスをログに残す

要注意

  • Secret の YAML をリポジトリにコミットするのは絶対NG(base64 は簡単にデコードされる)
  • Sealed Secrets(Bitnami)で暗号化してからコミットする選択肢もある