既存のゲストアカウントのUPNが一致していない場合のAADクロステナント間同期
はじめに
Azure ADのクロステナント間同期(cross-tenant-synchronization)がプレビューされてしばらく経ったので導入を考えている組織も出てくるころではないでしょうか。
クロステナント間同期はAzure AD B2Bの運用で以下のような要件を実現できます。
- ターゲットテナントにユーザーが自動で作成され、招待メール運用が不要になる
- ソーステナントのユーザーのメールアドレスといった属性の変更がターゲットテナントに40分ごとに同期され更新される
今回は 「既存でゲストとして存在しているけど、ソース/ターゲットテナントでUPNが異なるユーザーはどうマッピングされちゃうの?」 という部分を検証してみました。
状況整理
- ユーザーが既にゲストアカウントとしてターゲットテナントに存在
- ソース/ターゲットテナントでUserPrincipalNameが異なる
- クロステナント間同期でユーザーを新規マッピング
ゲストユーザーの属性の変更を反映しない運用(Teamsは利用しているけれども、Exchange Onlineのアドレス帳は利用していないなど)をしている場合、このような状態になっているかもしれません。
この状態で同期後、ユーザーが消えちゃった!という風にならないように検証していきます。
初回設定
Microsoft Learnに記載があります。
設定画面はAzure ADのプロビジョニングサービスを利用している方だと見慣れていると思います。
初見でもそこまでややこしくない設定という印象です。
初回で気を付けるべき項目はSEくぼたの事件簿さんの記事にもありますが、デフォルト設定のままだとGuestではなくmemberとしてアカウント作成時に同期されます。
必要に応じてテナント間同期 > 構成 > 作成した構成 > プロビジョニング > マッピング > 属性マッピングでuserType
属性を定数値:Guest
にしちゃいましょう(ユーザーごとにmemberにしたい場合は式にして条件を書きます。)
既定値をGuestにしてくれててもいいような気も
あと、今回の内容を検証するには対象オブジェクトのアクションの更新にチェックがはいっている必要があります。
とりあえず同期してみた
ソーステナントの値でターゲットテナントの値が上書きされました。
UPNが異なっていても、ユーザーが削除されたり新規オブジェクトとして作成されたりせずサインインもできました。
マッピングの設定値を見てみる
テナント間同期 > 構成 > 作成した構成 > プロビジョニング > マッピング > 属性マッピングで 照合の優先順位 が1位のものを確認します。
この値によって、ソース/ターゲットテナントのオブジェクトが紐づけられます。
ソーステナントではAltSecIdFromNetId([netId])
、ターゲットテナントではalternativeSecurityIds
という値でマッピングされているようです。
聞きなれない属性ですがMicrosoft Learnに以下のように記載がありました。
※日本語版は読みづらいです
When a guest user accepts an invitation, the user's LiveID attribute (the unique sign-in ID of the user) is stored within AlternativeSecurityIds in the key attribute. Because the user account was deleted and created in the home tenant, the NetID value for the account will have changed for the user in the home tenant. Compare the NetID value of the user account in the home tenant against the key value that's stored within AlternativeSecurityIds of the guest account in the resource tenant, as follows:
ゲスト招待が行われる裏側では、ソーステナントのユーザーのLiveID
がターゲットテナントのAlternativeSecurityIdsのkey属性
にセットされるようです。
ポータル上ではLiveIDの値を確認できないので、MSOnline PowerShell モジュールを使って確認します(Graphでは見えないっぽい)
ソーステナントのユーザーLiveIDを取得
$objectId = "ユーザーオブジェクトID"
Get-MsolUser -ObjectId $objectId | Select-Object -ExpandProperty LiveID
ターゲットテナントのユーザーのLiveIDを取得
# base64エンコードされたLiveIDの値を取得
$objectId = "ユーザーオブジェクトID"
$liveIdOfBase64EncodedString = [convert]::ToBase64String((Get-MsolUser -ObjectId $objectId).AlternativeSecurityIds.key)
# 16進数に変更
$bytes = [System.Convert]::FromBase64String($liveIdOfBase64EncodedString)
$hexString = [System.BitConverter]::ToString($bytes).Replace("-", "")
$hexString
取得した値は10032002xxxxxxxx
のような値でソース/ターゲットテナントの値は一致しています。
LiveID自体は昔のコンシューマー向けのアカウント(現在のMicrosoftアカウント)のIDっぽいですが、Azure AD B2Bで利用されているのでしょうか?
公式ドキュメントにもほぼ記載がないので今回はそこまで追求しません。
試しにUPNを照合の優先順位の1番にして保存しようとするとエラーになりました。
必ずAltSecIdFromNetId([netId])を1番にしないといけいっぽいです。
変にいじらない方が身のためです
おわりに
UPNでマッピングがされていないことが分かりました。
ちゃんとマッピングされるか不安な場合は、ソース/ターゲットテナントでLiveIDを事前に取得しすべて一致していることを確認すると良さそうです。(Graphには実装されていません!)
Discussion