👥

【最小権限】service account + Terraform で行う Google Groups 管理

に公開

primeNumber という会社で SRE をやっている kaita (@z63d_) です。

みなさん、Google Cloud の権限管理はできていますか?
弊社では一部で Google Cloud を利用しています。
Google Cloud では Google Groups を利用して複数の user や service account の権限をまとめて管理できます。しかし、IdP として Google Workspace を利用している弊社では Google Groups を作成するには Google Workspace の権限が必要です。というのも Groups は Google Cloud ではなく Google Workspace が管理するからです。(この辺りの関係性が分かりやすい図がドキュメントに見当たりませんでした...)

ref: https://docs.cloud.google.com/architecture/identity/overview-google-authentication

どの Google Workspace の権限があるとどういった操作ができるか(逆にできないのか)を記載したドキュメントや記事が見当たらなかったので、Google Groups の Terraform 管理を行うにあたって、必要最低限の権限で管理するための方法を紹介します。

構成

前提として、弊社では以下のような構成で管理しています。
Terraform を使い、terraform plan, terraform apply を GitHub Actions で行います。

  • IaC: Terraform
  • CI/CD: GitHub Actions
    • GitHub Actions 内で Google Cloud の service account の権限を使って(Workload Identity Federation を利用) terraform plan, terraform apply を実行
    • tfaction を利用

手順

Google Cloud で service account 作成

GitHub Actions で使うための Google Cloud の service account を作成します。
なお、tfaction などを利用して CI/CD で plan, apply を行う場合、plan, apply で service account を分ける運用が一般的かと思いますが、今回は、plan, apply で必要な権限が同一のため、共通の service account を利用します。
このあたりは Groups を管理する Terraform state でどういった resources をどこまで管理するかによって変わってくるためご自身の状況に合わせて設計してください。

Google Workspace でカスタムロールを作成して service account に付与

Google Workspace で グループ/作成 権限だけを付与したカスタムロールを作成します。
作成したカスタムロールを service account に付与します。

Terraform の設定

Terraform の設定の一例です。

terraform {
  backend "gcs" {
    bucket = "terraform-state"
    prefix = "google-cloud-groups"
  }

  required_version = "1.14.3"

  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "7.16.0"
    }
  }
}

provider "google" {
  project = "example-project"
}
# APIs の有効化
# Group の作成などを行う前に有効化しておく必要があります
resource "google_project_service" "enabled_apis" {
  for_each = toset([
    "cloudidentity.googleapis.com",
    "admin.googleapis.com",
  ])

  service            = each.value
  disable_on_destroy = false
}
# Group の作成
resource "google_cloud_identity_group" "group_1" {
  display_name         = "group-1"

  # service account を Group の owner とする
  initial_group_config = "WITH_INITIAL_OWNER"

  # Google Workspace customer ID (DIRECTORY_CUSTOMER_ID)
  parent = "customers/A01b123xz"

  group_key {
    id = "group-1@example.com"
  }

  labels = {
    "cloudidentity.googleapis.com/groups.discussion_forum" = ""
  }
}

# Group の member の追加
resource "google_cloud_identity_group_membership" "group_1_member_1" {
  group = google_cloud_identity_group.group_1.id

  preferred_member_key {
    id = "member-1@example.com"
  }

  roles {
    name = "MEMBER"
  }
}

service account の権限について

上記の設定により service account は Terraform (Cloud Identity API) 経由で以下の操作が可能になります。

Groups の操作

Groups の追加・削除が可能です。
ただし、owner ではない Groups を削除しようとすると 403 になります。service account には グループ/作成 権限しか付与していませんが、owner である Groups は削除することが可能です。

Groups の member の操作

Groups の member の追加・削除が可能です。
ただし、owner ではない Groups に member を追加・削除しようとすると 403 になります。("グループに参加できるユーザー" が "組織内のすべてのユーザーが参加できる" であったとしても追加はできません)

まとめ

これにより、service account 自身が作った Groups への操作を行うことを許可しつつ、管理したくない Groups への操作を禁止するといったことが可能となります。service account に Google Workspace の権限を過剰に渡す必要がないので、セキュリティリスクを最小限に抑えた運用ができます。

株式会社primeNumber

Discussion