Kubernetes Secret の環境変数による受け渡しの確認

出力やデバッグによるシークレット露出を減らし、ローテーション時の利用側の更新を計画してください。

説明

Secret の値を環境変数で渡すと、アプリケーションログ、デバッグ出力、プロセスダンプに露出するおそれがあります。サポートされる受け渡し方式であり、それ自体が漏えいを意味するわけではありませんが、実際の出力とアクセス権限を確認する必要があります。実行中のコンテナーの環境変数は、元の Secret を変更しても自動更新されません。

想定される影響

  • 漏えいしたシークレットが他のシステムへのアクセスに悪用されるおそれがあります。
  • 古い値を使い続けるアプリケーションは、ローテーション後に認証に失敗する場合があります。

対処方法

  • アプリケーションがファイルを読める場合は、必要な Secret キーだけを読み取り専用ボリュームで渡す方法を検討してください。ファイル権限と、アプリケーションによる変更検知・再読み込みも確認してください。
  • 環境変数を使う場合は値の出力とデバッグを制限し、ローテーション時の再起動を計画してください。Secret の参照と Pod の実行・デバッグ権限を最小化し、使わなくなった認証情報を失効させてください。

例

同じ名前空間に mysecret が必要です。Redis イメージがこの変数やファイルを自動的に認証へ使う例ではなく、アプリケーション側の処理は別途実装する必要があります。Pod 名が異なるため、別のリソースとして作成されます。

変更前

yaml
apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
    - name: mycontainer
      image: redis
      env:
        - name: SECRET_USERNAME
          valueFrom:
            secretKeyRef:
              name: mysecret
              key: username

mysecret の username 値を SECRET_USERNAME 環境変数で渡します。

変更後

yaml
apiVersion: v1
kind: Pod
metadata:
  name: secret-file-pod
spec:
  containers:
    - name: mycontainer
      image: redis
      volumeMounts:
        - name: app-secret
          mountPath: /var/run/secrets/app
          readOnly: true
  volumes:
    - name: app-secret
      secret:
        secretName: mysecret

Secret キーを /var/run/secrets/app 配下のファイルとしてマウントします。この例ではすべてのキーをマウントするため、必要なキーだけを選んでください。ファイル方式でも、権限を持つプロセスや利用者は値を読める点を考慮してください。

参考資料