ServiceAccount トークンの自動マウント設定の確認

Kubernetes API トークンが不要な Pod では、自動マウントを無効にしてください。

説明

ServiceAccount トークンが自動マウントされると、そのアカウントの Kubernetes API 認証情報を Pod から使えるようになります。API を呼び出さないワークロードには不要な認証情報です。Pod と ServiceAccount の実際の設定を確認し、両方に設定がある場合は Pod 側が優先されることに注意してください。

不要なトークンは、アプリケーションの脆弱性や不適切なデバッグツールを通じて漏えいする場合があります。必要な場合だけ明示的に許可する方が安全です。

想定される影響

  • API アクセスが不要な Pod にもトークンが提供される場合があります。
  • コンテナーが侵害されると、アカウントに付与された権限で追加の探索や悪用が行われる場合があります。

対処方法

  • Kubernetes API トークンが不要な Pod とワークロードテンプレートに automount_service_account_token = false を設定してください。
  • トークンが必要なら、用途別の ServiceAccount と最小権限を使い、必要な宛先と有効期間を持つトークンを提供してください。明示的なトークンボリュームなど、他の認証情報の経路も確認してください。

例

自動マウントだけを比較する DaemonSet の例です。名前空間は別途用意し、実際のデプロイには保守されているイメージを選んでください。この設定は明示的に構成したトークンボリュームまで削除するものではありません。

変更前

hcl
resource "kubernetes_daemonset" "example" {
  metadata {
    name      = "terraform-example"
    namespace = "something"
  }

  spec {
    selector {
      match_labels = {
        test = "MyExampleApp"
      }
    }

    template {
      metadata {
        labels = {
          test = "MyExampleApp"
        }
      }

      spec {
        automount_service_account_token = true

        container {
          image = "nginx:1.7.8"
          name  = "example"
        }
      }
    }
  }
}

変更後

hcl
resource "kubernetes_daemonset" "example" {
  metadata {
    name      = "terraform-example"
    namespace = "something"
  }

  spec {
    selector {
      match_labels = {
        test = "MyExampleApp"
      }
    }

    template {
      metadata {
        labels = {
          test = "MyExampleApp"
        }
      }

      spec {
        automount_service_account_token = false

        container {
          image = "nginx:1.7.8"
          name  = "example"
        }
      }
    }
  }
}

補足:

  • 変更前: トークンの自動マウントを許可します。API トークンが不要な Pod には不要な認証情報の提供となります。
  • 変更後: 自動マウントを無効にします。トークンを必要とする機能は別途確認してください。

参考資料