LayerX エンジニアブログ

LayerX の エンジニアブログです。

Google Workspace でも Microsoft Entra ID の PIM で Just-in-Time Access (Terraform 設定つき) #ベッテク月間

すべての経済活動を、デジタル化するために、すべての業務活動を、デジタル化したいコーポレートエンジニアリング室の @yuya-takeyama です。

週末は Festival Fruezinho という音楽フェスに参加し、アルゼンチンの音響派フォークシンガー・Juana Molina を観てきました。デジタルなサウンドを活用しつつも、ライブ感のあるバンドサウンドで、非常にスリリングなライブでした!

今回の話はアナログ寄りのデジタルな気がします。

Microsoft Entra ID の PIM とは

PIM (Privileged Identity Management) については、少し前に Fintech 事業部の piroshi さんが書いてくれた記事があるので、概要はそちらをご覧ください。

かいつまんで説明すると、「この権限を使いたい」という時に数時間だけその権限に昇格できる機能で、さらに SCIM による自動プロビジョニングとの組み合わせで、Microsoft 外のサービスでも同様のことができるというもので、上記の記事では AWS での設定手順にも触れられています。

私はクラウド周りの設定はできる限り Terraform に寄せたいと考えていますが、100% そうすべきというわけでもありません。Terraform 化が追いついていない箇所をちょっと変えたい時や、初めて触れるサービスで試行錯誤を繰り返したい時、またはそもそも API での操作ができない機能などにおいて、短時間だけ権限昇格できることによって、フレキシブルかつセキュアな運用や業務フローの構築が可能になります。

魔法で一定期間、権限昇格させてくれる妖精ピム。語尾は「〜ピム」

Microsoft 外のサービスで PIM が利用できる条件

以下のような条件が揃っていれば、PIM による Just-in-Time Access が利用できるでしょう。

  1. Microsoft Entra ID から SCIM プロトコルによる自動プロビジョニングができる
  2. サービス上の権限をグループに対して割り当てあることができる

これを Google Workspace に当てはめて見ていきます。

LayerX においては、1 は元々設定できていました。まだ設定できていないぞ、という方は以下のドキュメントを参考にするのが良いでしょう。 (ドキュメント上 G Suite という Google Workspace の旧名称が使われていることに注意)

問題は 2 です。

Google Workspace において、権限は管理者ロールという単位にまとめられていて、それをユーザーに割り当てることで、ユーザーはその権限を利用できます。

管理者ロールは、既定のものとしてあらかじめ用意されたものの他に、自分でカスタムロールを作成することもできます。

元々、管理者ロールをグループに対して割り当てることはできなかったのですが、2023 年の 4 月にできるようになっていました。

というわけで、Google Workspace は PIM が利用できる条件をクリアしていることがわかります。

PIM の設定を Terraform でやってみる

ここでは、Microsoft Entra ID 側の設定をやってみます。

PIM for Groups は比較的新しい機能なので、Terraform Provider for Azure Active Directory も新しめのリリースを使う必要があります。以下は2024年7月現在における最新版の v2.53.1 使います。 (Azure Active Directory は Microsoft Entra ID の旧名称)

data "azuread_group" "group_that_can_be_groups_admin" {
  object_id = "PIM での権限昇格を可能にする対象のグループの Object ID"
}

resource "azuread_group" "pim_google_workspace_groups_admin" {
  display_name     = "pim-google-workspace-groups-admin"
  security_enabled = true
  mail_enabled     = true
  mail_nickname    = "pim-google-workspace-groups-admin"
  types            = ["Unified"]
}

resource "azuread_group_role_management_policy" "pim_google_workspace_groups_admin" {
  group_id = azuread_group.pim_google_workspace_groups_admin.id
  role_id  = "member"

  active_assignment_rules {
    expiration_required   = true
    expire_after          = "P15D"
    require_justification = true
  }

  eligible_assignment_rules {
    expiration_required = false
  }
}

resource "azuread_privileged_access_group_eligibility_schedule" "pim_google_workspace_groups_admin" {
  group_id             = azuread_group.pim_google_workspace_groups_admin.object_id
  principal_id         = data.azuread_group.group_that_can_be_groups_admin.object_id
  assignment_type      = "member"
  permanent_assignment = true

  depends_on = [
    azuread_group_role_management_policy.pim_google_workspace_groups_admin,
  ]
}

data "azuread_service_principal" "google_workspace" {
  client_id = "Google Workspace の App registration の Application ID"
}

resource "azuread_app_role_assignment" "pim_google_workspace_groups_admin" {
  app_role_id         = "Default Organization の App Role ID"
  principal_object_id = azuread_group.pim_google_workspace_groups_admin.id
  resource_object_id  = data.azuread_service_principal.google_workspace.object_id
}

特に、PIM for Groups の設定に関わるのは以下のリソースです。

  • azuread_group_role_management_policy
    • PIM グループへの割り当て、Eligibility (昇格できる資格) に関するポリシーの設定、通知の設定など
    • eligible_assignment_rulesexpiration_required = false にしておかないと、Eligibility にも時間制限がかかってしまう
    • activation_rulesapproval_stage を設定することによって、承認者による承認を必要にすることもできる
  • azuread_privileged_access_group_eligibility_schedule
    • PIM グループへの Eligibility の割り当てを実際に行う
    • 永久に割り当て可能な状態にするには permanent_assignment = true とする
    • 逆に期間限定にしたければ expiration_date を指定する

この設定を適用し、PIM for Groups でグループへの割り当てを activate することで、Google Workspace 上も同名のグループのメンバーとなることができます。

が、まだ肝心の管理者ロールを割り当てていないので、権限は何もついていない状態です。

Google Workspace で PIM を利用する具体的な設定手順

ここからの設定は、特権管理者として行う必要があります。

また、これらの設定については Terraform Provider Google Workspace での設定には対応していないようなので、管理コンソールの Web UI から行います。 (最後のリリースから 2 年以上が経過していますね…)

自動プロビジョニングで作成されたグループに管理者ロールを割り当てるには、対象のグループを「セキュリティグループ」にする必要があります。

Google Workspace の Admin で、対象のグループのラベルの設定から、「セキュリティ」にチェックを入れて保存します。

次に管理者ロールをこのグループに割り当てます。ここでは「グループ管理者」のロールを割り当てます。

「メンバーを割り当てる」から、対象のグループを選択することができます。

これで、必要な時だけ「グループ管理者」に昇格できるようになりました。

制限事項

「特権管理者」と「販売パートナー管理者」はグループに割り当てることができないため、結果的に PIM でも使えないことになります。

それ相当の強い権限でも PIM を利用したい場合は、カスタムロールを自分で作ることで対応ができると思いますが、基本的には全部入りのロールではなく、ある程度小分けになったロールを利用した方がよりセキュアと言えるでしょう。

その他の制限事項については、以下のドキュメントの「グループにロールを割り当てる」→「グループのロール割り当てに関する制限事項」を確認してください。

まとめ

Google Workspace で Microsoft Entra ID の PIM による Just-in-Time Access を有効にする方法について説明しました。

それぞれのサービスのアップデートや、Terraform Provider 側での追従により、色々と便利に設定できるようになっていますね。

PIM は非常に汎用性の高い仕組みなので、AWS や Google Workspace に限らず積極的に利用していきたいところです。

そして Terraform を使って設定手順をある程度定型化することで、効率的に様々なサービスへの適用を広げることが可能になるでしょう。 (ちなみに、社内では Terraform モジュールにしており、さらに便利になっています)

コーポレートエンジニアリング室では、このように日々運用を進化させていくメンバーを大募集しています。

まずは話だけでも、という方は是非カジュアル面談や、LayerX Casual Nightといったイベントにお応募してみてください。