Azure AD でテナント間の同期を構成する(プレビュー)


*※この記事内の方法は正式な技術情報(docs.microsoft.com) が公開されていないため、正式な手順ではない可能性があります。docs.microsoft.com の公開後に update もしくは削除を行う予定です。本記事の手順を試す場合は、本番環境では行わず、検証環境などでお試しください(2023/1/23 現在)*

(2023/1/24 追記)
手順が公開されました。この記事は変更するか削除を行う予定です。
[Graph API](https://learn.microsoft.com/ja-jp/azure/active-directory/multi-tenant-organizations/cross-tenant-synchronization-configure-graph)
[Portal](https://learn.microsoft.com/ja-jp/azure/active-directory/multi-tenant-organizations/cross-tenant-synchronization-configure)



# Azure AD のテナント間同期(プレビュー) について

M365 管理センターの MC499440 として 2023/1/23 に通知されたと思ったら、あっというまに自分のテストテナントの *"テナント間同期(プレビュー)"* なるメニューが追加されました。

最近、Microsoft 365 が多くの企業に浸透するにつれて、企業統合や、グローバル企業での各リージョンで独自に構築した Microsoft 365 環境のユーザー連携を強化したいという相談が増えてきました。

その中核となる要望機能の一つとして、お互いのテナントに存在するユーザーをゲストとして自動で登録/更新したいというものがあります。

いままでも、Graph の 招待 API などを使って自動化する事は不可能ではないものの、招待をした後のユーザー情報の継続的な同期を行うためには、MIM のような同期の仕組みが必要となります。

このような Azure AD の運用課題を解決する方法として、ネイティブな機能として、テナント間同期がついにリリースされました。

まだ、構成手順などの記載が間に合っていないのか [Docs が公開されておりません](https://github.com/AzureAD/Cross-tenant-synchronization)が、(公開されてないからですが)設定に苦慮したため、自分の備忘を込めて一旦手順を残しておきます。改めて正式な手順が公開されたらこの記事を削除するか Update するつもりです。

# 構築手順

## 1. 同期構成の作成

1. [Azure Portal](https://portal.azure.com) にアクセスし、[Azure Active Directory] 内にある、テナント間同期(プレビュー) を選択します。(テナントによってはまだ出ていないかもしれません)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/a43158e6-329c-9303-c48d-6a8938b88daa.png)

1. テナント間同期の設定画面に遷移するため、[構成]を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/677e8feb-13fa-9ce3-17a5-714a35c293a3.png)

1. [+新しい構成] を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/bc61b552-031b-d937-3e2c-0fdad8adee68.png)

1. 任意の名前を記載して、[作成]を選択します。(同期先テナントが識別できるような名称にしておくと良いでしょう)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/deb63427-cfdb-4c37-7999-7dc27423f92d.png)

1. 構成が終わると以下のように一覧に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/e0a19736-b0a7-1604-643b-f763929afc8b.png)

## 2. テナント間同期ポリシーの作成
### 事前準備

Azure AD の Preview powershell のモジュール　バージョン 2.0.2.138 が必要です。
インストールするには、管理者権限で起動した PowerShell で以下のように実行します。

```PowerShell
Install-Module -Name AzureADPreview -RequiredVersion 2.0.2.138
```
指定バージョン以降のモジュールがインストールされていれば、この手順はスキップいただいて構いません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/cbc47aad-5555-83be-ee71-281288369781.png)

### a.ソーステナント(ユーザーの同期元テナント) での操作
　
<ol><li> PowerShell を起動して、ソーステナントのグローバル管理者で Azure AD Powershell にサインインします。

```PowerShell
Connect-AzureAD
```
　 
</li><li> <Target Tenant ID> を同期先のテナントのテナント ID に変更して、以下のスニペットを実行します。

```PowerShell:SourceTennant.ps1
$HomePolicy = "{
	`"B2BManagementPolicy`":  { 
		`"InvitationsAllowedAndBlockedDomainsPolicy`":  { 
			`"AllowedDomains`":  [], 
			`"BlockedDomains`":  [] 
		}, 
		`"AutoRedeemPolicy`":  { 
			`"AdminConsentedForUsersIntoTenantIds`":  [{ 
				`"TenantId`":  `"<Target Tenant ID>`", 
				`"Name`":  `"Resource Tenant 1`" 
			}], 
			`"NoAADConsentForUsersFromTenantsIds`":  [] 
		} 
	} 
} "


New-AzureADPolicy -Definition $HomePolicy -DisplayName B2BManagementPolicy -Type B2BManagementPolicy -IsOrganizationDefault $true
```
以下のように B2BManagementPolicy ポリシーが設定されている事を確認します(Get-AzureADPolicy に -Top 1 としているのは、w私のテスト環境で他のポリシーも表示されてしまうためですので、実際の環境で確認する際は不要です)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/592a10c5-8e45-fe61-9740-a10b52fdff9d.png)

</li></ol>

### b.ターゲットテナント(ユーザーの同期先テナント) での操作

<ol><li> PowerShell を起動して、ターゲットテナントのグローバル管理者で Azure AD Powershell にサインインします。

```PowerShell
Connect-AzureAD
```

</li><li> <Home Tenant ID> を同期元テナントのテナント ID に変更して、以下のスニペットを実行します。

```PowerShell:TargetTennant.ps1
$TargetPolicy = "{
	`"B2BManagementPolicy`":  { 
		`"InvitationsAllowedAndBlockedDomainsPolicy`":  { 
			`"AllowedDomains`":  [], 
			`"BlockedDomains`":  [] 
		}, 
		`"AutoRedeemPolicy`":  { 
			`"AdminConsentedForUsersIntoTenantIds`":  [], 
			`"NoAADConsentForUsersFromTenantsIds`":  [ 
			{ 
				`"TenantId`":  `"<Home Tenant ID>`", 
				`"Name`":  `"Home Tenant 1`" 
			}] 
		} 
	} 
} "

New-AzureADPolicy -Definition $TargetPolicy -DisplayName B2BManagementPolicy -Type B2BManagementPolicy -IsOrganizationDefault $true

```
以上で PowerShell  の操作は完了です。、


</li><li> <a href="https://developer.microsoft.com/ja-jp/graph/graph-explorer">GraphExplorer</a>にアクセスして同期先テナントのグローバル管理者でサインします。

</li><li> アクセス許可への同意から <b>Policy.Read.All</b> と <b>Policy.ReadWrite.CrossTenantAccess</b> への同意を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/31be66fa-e13b-16cc-3fad-9639df9fb8eb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/c5a854a8-a1f5-b641-b682-42c9e2e31a11.png)



</li><li> 以下の内容で API を実行します。

|項目|内容|
|:---|:---|
|**メソッド**|POST|
|**URI**|https://graph.microsoft.com/beta/policies/crossTenantIdentitySyncPolicy/partners|
|**Content-type**|application/json|
|**本文**|以下のbody.json 内の {Home Tenant Id} と {Display Name for Home Tenant} を実際の値に書き換える|

```JSON:body.json
{
    "tenantId": "{Home Tenant Id}",
    "displayName": "{Display Name for Home Tenant}",
    "userSyncInbound": {
        "isSyncAllowed": "true"
    }
}
```


Graph Exploer 上では以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/8c84107a-1dcf-7dbc-1836-7fea9d80acce.png)

実行結果として、以下のように表示されれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/631a5893-690a-d598-8a5a-3edd1b920358.png)

</li></ol>

## 同期構成の設定
 
<ol><li> Azure Portal のテナント間同期の画面に戻り、作成した同期の構成にアクセスします。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/9fd76e52-4101-9cab-d145-207860148361.png)

</li><li> [作成の開始] を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/5aee6270-ca07-9f9d-d8b1-eb9eae61e4b6.png)

</li><li> プロビジョニングモード で[自動]を選択し、 Tennant Id に同期先テナントのテナント ID を指定します。その後、[テスト接続]をクリックします。成功したら、上部の[保存]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/5c835074-790e-c255-76ed-ae8072a0a45f.png)

成功した場合、以下のように通知が行われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/90d4b60d-d941-cabf-144a-062599186fe5.png)

失敗した場合、以下のように通知が行われます。事前の同期ポリシーの設定などを見直してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/7cb0d4be-17bb-0691-c913-c94868546705.png)

完了後は以下のようにプロビジョニングの構成画面が表示されます。このままでも動作しますが、他のアプリケーションの同期と同じように属性のカスタマイズや削除の閾値の構成が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/c5a8c5ea-1252-c3ed-808a-f3783e90dde7.png)

</li><li> [ユーザーとグループ] ペインにアクセスし、同期対象となるユーザーを選択します。グループも利用可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/1f894278-35b9-1e65-2622-52451d1065ad.png)

</li><li> [概要]ペインから [プロビジョニングの開始] を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/8279afbe-f3a3-36f8-c543-0381664ca27b.png)

初期同期が完了すると以下のような表示になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/523e05c2-1557-287c-b836-0a6d5678dcd0.png)

同期が成功すればターゲットテナントにユーザーが同期されます。※この時通常の招待とは違い、既定では"メンバー" として同期される事にご注意ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277597/8bc66dea-34b1-bb5b-57fe-48489b2017ba.png)

</ol></li>

以上