EntraIDのゲストユーザーを自動プロビジョニングした話

# はじめに
自社EntraIDにゲストユーザーとして登録した別ドメインのユーザーを、EntraIDに連携させたBoxへ自動プロビジョニングさせたので、備忘録として内容をまとめました。

# 定義
登場人物がいろいろ出てくるので事前に定義します。

* 本社A：組織構造としては事業会社Bの親会社
    * EntraID-AAA
        * ドメイン＝aaa.hoge.com
    * BoxテナントA
        * EntraID-AAAとSAML連携＋自動プロビジョニング設定済
* 事業会社B：親会社とは別でAzure/Boxの契約をしている
    * EntraID-BBB
        * ドメイン＝bbb.hoge.com
    * BoxテナントB
        * EntraID-BBBとSAML連携＋自動プロビジョニング設定済

現状の環境は以下のような図になります。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214442/ca870805-7e97-bb46-5cb2-bb8b4ff29a22.png)


# 背景
* 本社Aと事業会社BでそれぞれBoxテナントを契約しており、それぞれが管理するEntraIDに対してSAML連携と自動プロビジョニング設定をしていた
* 事業統合に伴い事業会社Bで契約していたBoxテナントを本社AのBoxテナントに契約を統一することが想定されており、そのための要件として以下の内容が上がった
    * 要件1：BoxテナントAの中に事業会社Bのユーザーを取り込む
    * 要件2：EntraIDは統合せず維持させる
    * 要件3：事業会社Bのアカウントはそのまま使う（user1@bbb.hoge.com）

![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214442/6e167222-4221-76b9-b1fe-768d9c330c3f.png)

# 課題
この構成にするためのハードルはいくつかあるのですが、とりあえず認証とプロビジョニングの課題を解決します。

課題一覧：
* １つのBoxテナントは1つのIdPしか参照できない
* EntraID-AAAを参照したまま、EntraID-BBB のアカウントを使ったSAMLSSOを実現しなければならない
* 自動プロビジョニングもさせないといけない

# 解決にむけての試行錯誤
Boxテナントは基本的にIdPを1つしか参照できません。  
そのためBoxテナントAを継続的に利用することを考えると必然的に "EntraID-AAA" が連携先になるわけですが  
* 要件2「それぞれのEntraIDは維持する」  
* 要件3「アカウントをそのまま使う」  

というものがあるため、bbb.hoge.com のドメインは引き続き "EntraID-BBB" で管理されたままになると困ります。

ひとまずこの打開策として "EntraID-AAA" にゲストユーザーとして user1@bbb.hoge.com を登録することにし、登録されたゲストユーザーを自動プロビジョニングすることにしました。

が、この方法は残念ながら失敗します。  
"EntraID-AAA" にゲストユーザーとして登録されたアカウントをプロビジョニングすると、下記のような状態となりました。

![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214442/a62e6b79-799d-6d49-9d9e-f446a1c8d881.png)

このような状態となってしまうのは、以下2つの設定内容に起因します。
1. "EntraID-AAA"に登録されたゲストユーザーのUPN が onmicrosoft.com ドメインに置換される
2. "EntraID-AAA" ～ "BoxテナントA" 間に設定された自動プロビジョニング設定

### ① "EntraID-AAA"に登録されたゲストユーザーのUPN が onmicrosoft.com ドメインに置換される

EntraIDに登録される通常ユーザー、ゲストユーザーには以下のような属性の違いがあります。

通常ユーザー
```
ユーザー種別	        : メンバー
DisplayName		    : user2
Mail			    : user2@aaa.hoge.com
UserPrincipalName	: user2@aaa.hoge.com
```
ゲストユーザー
```
ユーザー種別		    : ゲスト
DisplayName		    : user1
Mail			    : user1@bbb.hoge.com
UserPrincipalName	: user1_bbb.hoge.com#EXT#@hoge.onmicrosoft.com  <= ココ
```
EntraIDの仕様上、ゲストアカウントには `#EXT@` に変換されたアドレスが自動登録されます。

### ② "EntraID-AAA" ～ "BoxテナントA" 間に設定された自動プロビジョニング設定

デフォルトのプロビジョニング設定の場合はこんな感じだと思います。
![図5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214442/e6c71792-9b0c-d87b-fd83-ec7525883446.png)

このような設定だと、`UserPrincipalName` には ~~~#EXT@***.onmicrosoft.com が格納されているため、上図のようなBoxユーザーが生成されることになりました。

これを解消するためには、 **自動プロビジョニングの属性マッピング** と **シングルサインオンの属性とクレームの値** を変更する必要があります。

### 自動プロビジョニングの属性マッピングの設定変更
```
Azure Active Directory属性＝UserPrincipalName
Box属性＝Login
```
↓↓↓↓
```
Azure Active Directory属性＝mail
Box属性＝Login
```
![図6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214442/47e1c5ba-7afa-25f2-6026-e3a55b7dc30d.png)

### シングルサインオンの属性とクレームの値の設定変更
```
givenname           user.givenname
surname             user.surname
emailaddress	    user.mail
name		        user.UserPrincipalName
一意のユーザー ID	user.UserPrincipalName
```
↓↓↓↓
```
givenname           user.givenname
surname             user.surname
emailaddress        user.mail
name                user.mail
一意のユーザー ID	user.mail
```
![図7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214442/f8a45499-da1f-088e-9b05-06c7025004c2.png)


連携プロセスを図解するとこんな感じ

![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214442/33a06a9f-8565-ea57-8d26-3145c471a840.png)


こんな感じの連携を組むことで、"BoxテナントA" に user1@bbb.hoge.com のBoxアカウントを自動プロビジョニングで生成することができました。

この構成にすると、認証プロセスとしては

[BoxテナントA] -> [EntraID-AAA] -> [EntraID-BBB]

として処理されることになり、事業会社Bのユーザーは今まで通りのユーザーID・パスワードを利用してBoxを利用することができます。

# 補足
今回はBoxを対象としましたが、どのSaaSであっても同じ仕組みでゲストユーザーのプロビジョニングは解決できると思います。

# 残課題

"EntraID-AAA" に登録されているゲストユーザーを `#EXT@` の形にならないように自動プロビジョニングすることはできましたが、毎回 "EntraID-AAA" に登録することは手間です。

なので、それぞれのテナント内の通常ユーザーを自動でゲストとして登録することが可能となる "cross-tenant-synchronization" の機能を使って、組織間のアカウントライフサイクルも自動化しようと思います。
https://learn.microsoft.com/ja-jp/entra/identity/multi-tenant-organizations/cross-tenant-synchronization-overview