🏠

【Identity Platform 活用】④ B2B で必須のテナント機能でできること

2025/01/29に公開

1. はじめに

こんにちは、クラウドエース第三開発部の秋庭です。
前回の記事では、Identity Platform の多要素認証を活用する方法をご紹介しました。今回は Identity Platform のテナント機能についてご紹介できればと思います。

前回の記事はこちらになります。
https://zenn.dev/cloud_ace/articles/c65abf3ca87336

現代のアプリケーション開発において、セキュリティとユーザー管理は極めて重要です。特に、複数の顧客や組織を一元的に管理するマルチテナント環境では、効率的かつ安全なユーザー管理が求められます。
Identity Platform は、こうしたニーズに応えるためのテナント機能を提供しています。本記事では、Identity Platform のテナント機能を利用する方法、注意点について解説します。

以下の点については今回の記事で取り扱いませんので、ご了承ください。

2. テナント機能とは

Identity Platform におけるテナント機能とは、一つのアプリケーションやサービス内で複数の独立した顧客(テナント)を管理するための機能です。各テナントは、他のテナントから隔離されたユーザーデータや設定を持つことができ、セキュリティとプライバシーを確保しながら効率的な運用が可能となります。

Identity Platform のテナント機能は、以下のような特徴を持っています:

  • 分離されたユーザーデータ : 各テナントごとにユーザーが管理され、他のテナントとデータを共有しません。
  • カスタマイズ可能な認証フロー : 各テナントごとに異なる認証方法やパスワードポリシーを設定できます。
  • スケーラブルな管理 : テナントを管理するためのコンソールや API が提供されています。

3. テナント機能の使用例

B2B アプリケーション

SaaS(Software as a Service)アプリケーションでは、複数の企業や組織が同じアプリケーションを利用することが一般的です。Identity Platform のテナント機能を利用することで、各企業ごとにユーザー管理を分離し、セキュリティとカスタマイズ性を高めることができます。

大企業内の部門管理

大企業では、複数の部門やチームが存在し、それぞれ独自のユーザー管理やアクセス制御が必要です。テナント機能を利用することで部門ごとにユーザーを分離し、適切なアクセス権限を設定できます。

4. テナントの設定と管理方法

テナントで扱うことのできる項目や管理方法と、注意点などについて紹介します。

テナントの作成

Identity Platform のコンソールから、簡単に新しいテナントを作成できます。

参考
マルチテナンシーの設定  |  Identity Platform Documentation  |  Google Cloud

テナントごとにできる設定

各テナントごとに設定できる項目について紹介します。

認証プロバイダ

認証に使用するプロバイダは、テナントごとに設定することができます。
また、同様に多要素認証もテナントごとに設定ができます。

認証プロバイダ・多要素認証の導入については、前回までの記事も参考までにご確認ください。
https://zenn.dev/cloud_ace/articles/9b47b0dab6d3ab
https://zenn.dev/cloud_ace/articles/c65abf3ca87336

パスワードポリシー

パスワードポリシーはテナントごとに設定ができます。
Identity Platform では以下の要件でパスワードポリシーを設定することが可能です。

  • 小文字必須
  • 大文字必須
  • 数字必須
  • 英数字以外必須
  • 最小パスワード長(6 ~ 30 文字の範囲、デフォルトは 6 文字)
  • 最大パスワード長(最大 4096 文字)

次の文字が構成されている場合、英数字以外の文字の要件を満たします。
^ $ * . [ ] { } ( ) ? " ! @ # % & / \ , > < ' : ; | _ ~ `

パスワードポリシーは、Admin SDK、REST API を使用して設定が可能です。

REST API の場合、以下のように設定が可能です。

curl --request PATCH \
  'https://identitytoolkit.googleapis.com/v2/projects/[プロジェクトID]/tenants/[テナントID]?updateMask=passwordPolicyConfig&key=[YOUR_API_KEY]' \
  --header 'Authorization: Bearer $(gcloud auth print-access-token)' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --data '{"passwordPolicyConfig":{"passwordPolicyEnforcementState":"ENFORCE","passwordPolicyVersions":[{"customStrengthOptions":{"minPasswordLength":10,"maxPasswordLength":100}}],"forceUpgradeOnSignin":false}}' \
  --compressed

参考
パスワード ポリシーを有効化、無効化、使用する  |  Identity Platform Documentation  |  Google Cloud
Method: projects.tenants.patch  |  Identity Platform Documentation  |  Google Cloud

設定されたパスワードポリシーは、Web SDK(クライアントサイド)から検証可能です。

参考
クライアントサイドでの適用  |  Identity Platform Documentation  |  Google Cloud
validatePassword  |  Firebase JavaScript API reference

アクセス制御

IAM を利用して、テナントリソースに対してアクセスできるプリンシパルを制限できます。

Identity Platform コンソールからの設定

特定のテナント(testTenant)のリソースにのみアクセスできるようにサービスアカウントを追加し、動作を確認してみます。

サービスアカウントを使用して testTenant の情報を取得できることを確認します。

curl \
  'https://identitytoolkit.googleapis.com/v2/projects/[プロジェクトID]/tenants/testTenant-b0oj7?key=[YOUR_API_KEY]' \
  --header 'Authorization: Bearer $(gcloud auth print-access-token --impersonate-service-account=[サービスアカウント])' \
  --header 'Accept: application/json' \
  --compressed
{
  "name": "projects/*****/tenants/testTenant-b0oj7",
  "displayName": "testTenant",
  "allowPasswordSignup": true,
  "hashConfig": {},
  "mfaConfig": {
    "state": "ENABLED",
    "enabledProviders": ["PHONE_SMS"]
  },
  "inheritance": {},
  "passwordPolicyConfig": {
    "passwordPolicyEnforcementState": "ENFORCE",
    "passwordPolicyVersions": [
      {
        "customStrengthOptions": {
          "minPasswordLength": 10,
          "maxPasswordLength": 100
        },
        "schemaVersion": 1
      }
    ],
    "lastUpdateTime": "2025-01-28T01:35:35.798749Z"
  },
  "client": {
    "permissions": {
      "disabledUserDeletion": true
    }
  }
}

サービスアカウントにロールを付与していないテナントに対しても、テナントの情報を取得してみます。

curl \
  'https://identitytoolkit.googleapis.com/v2/projects/[プロジェクトID]/tenants/[OTHER_TENANT]?key=[YOUR_API_KEY]' \
  --header 'Authorization: Bearer $(gcloud auth print-access-token --impersonate-service-account=[サービスアカウント])' \
  --header 'Accept: application/json' \
  --compressed
{
  "error": {
    "code": 403,
    "message": "The caller does not have permission",
    "status": "PERMISSION_DENIED"
  }
}

テナントの情報を取得できるプリンシパルをコントロールできることが確認できました。

参考
テナントのアクセス制御  |  Identity Platform Documentation  |  Google Cloud
Method: projects.tenants.setIamPolicy  |  Identity Platform Documentation  |  Google Cloud


その他に以下の項目がテナントごとに設定できます。
以下の項目は、Identity Platform コンソールからの設定ができません。

SMS リージョンポリシー

多要素認証や電話番号でのログインの際に、SMS を送ることのできる地域を許可リスト・不許可リストの形式で設定できます。

匿名ユーザーの自動クリーンアップ

作成から 30 日以上経過した匿名ユーザーを自動で削除する機能です。
この機能が有効になっていると、匿名認証は請求の割り当てに対してカウントされません。

ユーザーアクション

ユーザーが Web SDK を通じた自身のアカウントの登録・削除操作を制限できます
Admin SDK(サーバーサイド)を介してのみ、ユーザーの作成・削除を許可するといったことが可能です。

参考
SMS リージョンを使用して SMS の不正使用からアプリを保護する  |  Identity Platform Documentation  |  Google Cloud
自動クリーンアップ  |  Firebase Authentication
ユーザーのセルフサービス  |  Identity Platform Documentation  |  Google Cloud

テナントごとにできない設定

メッセージのテンプレート設定

パスワードリセットや、メールアドレスを検証する際などにメールがユーザーに送信されます。

メールの一例

このメールの内容は一部カスタマイズが可能ですが、テナントごとにカスタマイズされた内容を保持することはできません。
メールテンプレートのカスタマイズはプロジェクトレベルで行うことができ、テナントではその設定を継承するかしないかの設定を行うことが可能です。

Identity Platform コンソールでのテンプレート設定方法

REST API の場合、テナントリソースの emailSendingConfig より継承の設定ができます。

参考
REST Resource: projects.tenants  |  Identity Platform Documentation  |  Google Cloud

アカウント登録のクォータ設定

Identity Platform のアカウント新規作成において、「IP アドレスごとに 100 アカウント/h」という制限がデフォルトで設けられています。
このクォータは一時的に引き上げることが可能ですが、この設定はプロジェクトレベルでの設定となります。

設定は REST API、Firebase のコンソールから可能です。


Firebase コンソールでのクォータ設定画面

参考
Firebase Authentication の上限

ブロッキング関数の設定

Identity Platform では、アカウント作成前とログイン前にトリガーされる Cloud Run Functions が設定できます。
このブロッキング関数はプロジェクトレベルでの設定となり、テナントで処理を分ける必要がある場合は、コード内で処理を分岐させる必要があります。

参考
ブロッキング関数を使用した認証フローのカスタマイズ  |  Identity Platform Documentation  |  Google Cloud

5. テナントを扱う際の注意点

Terraform での操作

プロジェクト直下の設定は Terraform を使用することも可能ですが、2025 年 1 月現在、テナント単位のリソースは提供されていません。

参考
google_identity_platform_config | Resources | hashicorp/google | Terraform | Terraform Registry

ログイン画面でのテナント選択

メールアドレスなどの情報からユーザーの所属しているテナントを割り出すことはできないため、組織ごとにログインページを分ける、ユーザーにテナント名の入力を求めるなどの方法でログインを構成する必要があります。

6. まとめ

Identity Platform のテナント機能は、マルチテナント環境におけるユーザー管理を効率化し、セキュリティと柔軟性を高められる機能です。
さまざまなシナリオで活用できるこの機能を導入することで、より安全なユーザー管理が実現できます。

この記事が、IDaaS 導入の際の検討の一助になれば幸いです。
ここまで読んで頂き、ありがとうございました。


Identity Platform 関連記事

https://zenn.dev/cloud_ace/articles/6d8d1502d3c90f
https://zenn.dev/cloud_ace/articles/9b47b0dab6d3ab
https://zenn.dev/cloud_ace/articles/c65abf3ca87336
https://zenn.dev/cloud_ace/articles/16d08bfe8daef4

Discussion