Secret を環境変数で渡す際の漏えいリスクの確認

Secret の渡し方と、ログや診断ツールによる値の取り扱いを管理してください。

説明

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 を読み取り専用ファイルとしてマウントします。ファイル権限とアプリケーションの読み取り先も構成する必要があります。

参考資料