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
担当者の対処手順
- Deployment、Helmチャート、valuesファイル、ConfigMapからシークレットの実際の値を削除してください。
- Kubernetesの
Secretまたは外部シークレット連携リソースを作成してください。 - アプリケーションが
secretKeyRefまたはSecretボリュームで値を受け取るように変更してください。 - 以前の値が露出していた場合は、直ちにローテーションしてください。
kubectl describe、ログ、デバッグスクリプトにシークレットが出ていないか確認してください。
担当者への案内例
- 「DeploymentやConfigMapからハードコードしたシークレットを削除し、Kubernetes Secretを使ってください。」
- 「Podには
secretKeyRefまたはSecretボリュームで注入し、マニフェストに値を直接記載しないでください。」 - 「露出した値は、Secretリソースへの移行前に失効し、再発行してください。」
追加の確認事項
ConfigMapにシークレットを誤って保存していないか。- Helmの
values.yamlに本番の値が入っていないか。 - Base64エンコードだけで保護されたと誤解していないか。
- クラスターでシークレットの保存時暗号化が有効になっているか。