Kubernetesのシークレット

Kubernetesでは、Secret リソースまたは外部シークレット連携を通じて値を注入してください。コード、リポジトリで管理する設定ファイル、ConfigMapにシークレットを直接保存しないでください。

このガイドが役立つ場合

  • Kubernetesにデプロイするサービスのコードや設定ファイルにシークレットがある場合
  • ConfigMap にパスワード、APIキー、トークンを保存している場合
  • Deploymentで環境変数の値をハードコードしている場合

推奨方法

  • Secret リソースまたはExternal Secrets Operatorなどの外部連携を使ってください。
  • Podには env.valueFrom.secretKeyRef またはボリュームマウントで値を注入してください。
  • Helm values、ConfigMap、Deploymentマニフェストにシークレットの実際の値を直接記載しないでください。
  • Secret を使っていても、Base64エンコードだけでは保護されません。可能であれば、クラスターのetcdの保存時暗号化設定も確認してください。

例

変更前

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  template:
    spec:
      containers:
        - name: app
          image: my-app:latest
          env:
            - name: API_KEY
              value: "sk-prod-123456"

変更後

この抜粋はシークレットの注入部分だけを示しています。DeploymentのセレクターやPodラベルなどは別途構成してください。${REAL_SECRET_VALUE} はデプロイツールが安全に供給する値のプレースホルダーであり、Kubernetesが環境変数の値に自動置換するものではありません。

yaml
apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
stringData:
  API_KEY: ${REAL_SECRET_VALUE}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  template:
    spec:
      containers:
        - name: app
          image: my-app:latest
          env:
            - name: API_KEY
              valueFrom:
                secretKeyRef:
                  name: app-secret
                  key: API_KEY

担当者の対処手順

  1. Deployment、Helmチャート、valuesファイル、ConfigMapからシークレットの実際の値を削除してください。
  2. Kubernetesの Secret または外部シークレット連携リソースを作成してください。
  3. アプリケーションが secretKeyRef またはSecretボリュームで値を受け取るように変更してください。
  4. 以前の値が露出していた場合は、直ちにローテーションしてください。
  5. kubectl describe、ログ、デバッグスクリプトにシークレットが出ていないか確認してください。

担当者への案内例

  • 「DeploymentやConfigMapからハードコードしたシークレットを削除し、Kubernetes Secretを使ってください。」
  • 「Podには secretKeyRef またはSecretボリュームで注入し、マニフェストに値を直接記載しないでください。」
  • 「露出した値は、Secretリソースへの移行前に失効し、再発行してください。」

追加の確認事項

  • ConfigMap にシークレットを誤って保存していないか。
  • Helmの values.yaml に本番の値が入っていないか。
  • Base64エンコードだけで保護されたと誤解していないか。
  • クラスターでシークレットの保存時暗号化が有効になっているか。