説明
env.value_from.secret_key_ref または env_from.secret_ref で Secret を環境変数に渡すと、アプリケーションのログ、デバッグ出力、プロセスダンプに値が出る場合があります。Secret 参照は構成への値の直接記述を避けますが、実行中の漏えいリスクまではなくしません。
アプリケーションが対応している場合は、必要な Secret をファイルとしてマウントする方法を検討してください。ただし、許可されたプロセスはファイルを読めるため、渡し方の変更だけでは侵害されたアプリケーションから値を保護できません。
想定される影響
- ログや障害調査資料に Secret の値が残る場合があります。
- 漏えいしたキーやパスワードの権限に応じて、他のシステムにアクセスされる可能性があります。
対処方法
- 可能なら、必要なコンテナーだけに読み取り専用ファイルとして Secret をマウントし、ファイル権限を制限してください。アプリケーションがそのファイルを読むように構成してください。
- 環境変数が必須なら出力や診断資料で値を隠し、Secret と Pod デバッグの権限を最小限にしてください。環境変数には Secret の変更が自動反映されないため、ローテーション時の再起動を計画してください。
例
同じ名前空間に db-secret を事前に用意してください。既存の nginx イメージは渡し方だけを示し、DB_PASSWORD やマウントしたファイルを自動では使いません。実際のアプリケーションの読み取り方法を構成し、保守されているイメージを使用してください。
変更前
hcl
resource "kubernetes_pod" "example" {
metadata {
name = "app"
}
spec {
container {
name = "web"
image = "nginx:1.7.9"
env {
name = "DB_PASSWORD"
value_from {
secret_key_ref {
name = "db-secret"
key = "password"
}
}
}
}
}
}
変更後
hcl
resource "kubernetes_pod" "example" {
metadata {
name = "app"
}
spec {
container {
name = "web"
image = "nginx:1.7.9"
volume_mount {
name = "db-secret"
mount_path = "/var/run/secrets/db"
read_only = true
}
}
volume {
name = "db-secret"
secret {
secret_name = "db-secret"
}
}
}
}
補足:
- 変更前: password キーを DB_PASSWORD 環境変数に渡します。ログや診断出力を保護する必要があります。
- 変更後: Secret を読み取り専用ファイルとしてマウントします。ファイル権限とアプリケーションの読み取り先も構成する必要があります。