GCP VM の API スコープと IAM 権限の確認

cloud-platform スコープと実際の IAM 権限を区別し、最小権限を適用してください。

説明

広い OAuth スコープである cloud-platform 自体が、すべての Google Cloud 権限を付与するわけではありません。実際の API アクセスにはサービスアカウントの IAM 権限が必要です。Google は通常、cloud-platform と最小限の IAM ロールを組み合わせる方式を推奨しています。

IAM 権限が過剰だと VM 侵害の影響が大きくなります。スコープを狭めるだけでは、すべての認証方式や権限を制御できません。

想定される影響

  • 過剰な IAM ロールを持つ VM が侵害されると、複数のリソースに被害が及ぶおそれがあります。
  • 必要なスコープを削除すると、正当な API 呼び出しが失敗する場合があります。

対処方法

  • 接続されたサービスアカウントを確認し、必要なリソースと操作だけを IAM ロールで許可してください。cloud-platform があるという理由だけで削除しないでください。
  • 別の要件で狭いスコープを使う場合は、必要な API と認証方式との互換性を確認してください。変更後は必要な呼び出しが成功し、不要な呼び出しが拒否されることをテストしてください。

例

OAuth スコープだけを比較し、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 {
    scopes = ["userinfo-email", "compute-ro", "storage-ro", "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 {
    scopes = ["userinfo-email", "compute-ro", "storage-ro"]
  }
}

補足:

  • 変更前: cloud-platform を含みますが、実際の権限は IAM ロールに制限されます。
  • 変更後: スコープを狭めます。必要な呼び出しが失敗しないか確認してください。最小権限の IAM を代替するものではありません。

参考資料