GCP VM のサービスアカウントと実効権限の確認

ワークロードに合うアカウントを接続し、実際の IAM 権限を最小限にしてください。

説明

デフォルトの Compute Engine サービスアカウントは IAM ポリシーによって広範な権限を持つ場合がありますが、デフォルトであるだけですべての API 権限を持つわけではありません。必要なリソースにアクセスを限定した専用アカウントは、権限の確認を容易にします。

アカウント名を変えるだけでは最小権限になりません。割り当てられた IAM ロールと、そのアカウントを使用できる主体を併せて確認してください。

想定される影響

  • 侵害された VM から、接続したアカウントの権限範囲へ被害が広がるおそれがあります。
  • 複数のワークロードで共有すると、権限変更の影響や利用主体を把握しにくくなる場合があります。

対処方法

  • Google Cloud API を使う VM には、service_account.email で適切な専用アカウントを指定し、最小限の IAM ロールを付与してください。API アクセスが不要なら、アカウントを接続する必要自体を検討してください。
  • デフォルトアカウントの Editor などの広範な実効権限と依存ワークロードを確認してから、不要な権限を削減してください。即時の削除や無効化で既存サービスを停止させないようにしてください。

例

古いイメージ、ネットワーク、メールアドレスは実際の値に置き換えてください。IAM ロールは省略しており、スコープだけで権限は付与されません。cloud-platform と最小限の IAM ロールを組み合わせる構成も推奨されています。

変更前

hcl
resource "google_compute_instance" "vm" {
  name         = "test"
  machine_type = "e2-medium"
  zone         = "us-central1-a"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }

  network_interface {
    network = "default"

    access_config {}
  }

  service_account {
    email  = "123456789-compute@developer.gserviceaccount.com"
    scopes = ["cloud-platform"]
  }
}

変更後

hcl
resource "google_compute_instance" "vm" {
  name         = "test"
  machine_type = "e2-medium"
  zone         = "us-central1-a"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-9"
    }
  }

  network_interface {
    network = "default"

    access_config {}
  }

  service_account {
    email  = "app-runtime@my-project.iam.gserviceaccount.com"
    scopes = ["userinfo-email", "compute-ro", "storage-ro"]
  }
}

補足:

  • 変更前: デフォルトアカウントと cloud-platform スコープを使います。実際の権限は IAM ロールなどにも依存します。
  • 変更後: 専用アカウントと狭いスコープを指定します。ワークロードに必要な IAM ロールは別途確認してください。

参考資料