自組織からゲスト参加できる外部組織を制限する(Entra ID) ~設定編~

2024/02/19に公開

はじめに

取引先組織からMicrosoft Teamsでゲスト招待を受けてコラボレーションをしている組織は多いと思いますが、変な組織から招待されていないかが心配な方もいらっしゃると思います。

Entra IDのcross-tenant access settings(以下、テナント間アクセス設定)を使い、管理者が事前に許可した組織にのみゲスト参加できるようにし、ゲスト参加してどんなアプリや組織にアクセスしているかサインインログを取得してみます。

ただ、この設定は運用が割と面倒なのでPower Platformの標準機能で運用を自動化してみようと思います。(運用編はこちら

設定編でやること

  • 既定ですべての外部組織へのゲスト参加を禁止し、特定の組織に対して特定のグループのユーザーのみゲスト参加を許可する(Entra IDのテナント間アクセス設定)
  • どの外部組織にどのアプリケーションでアクセスしているかCSVファイルにエクスポートする(Entra IDのサインインログ)
  • おまけ程度のPower BIレポートのイメージ

アーキテクチャ

ライセンス

  • ホームテナントにEntra ID Premium P1以上

テナント間アクセス設定

  1. [Entra ID] > [External Identities] > [クロステナントアクセス設定] > [テナント間アクセス設定]
  2. [既定の設定]
  3. [送信アクセスの設定] > [送信の既定値の編集]
  4. [B2Bコラボレーション] > [ユーザーとグループ]で [アクセス状態]:アクセスのブロック[適用対象]:すべての組織名ユーザー を選択
  5. [B2Bコラボレーション] > [外部アプリケーション]で [アクセス状態]:アクセスのブロック[適用対象]:すべての外部アプリケーション を選択し、[保存]を選択
  6. [組織の設定] > [+組織の追加]を選択
  7. 検索欄で外部組織のドメインを検索し、[追加]を選択(検索欄に入力した後Enterを入力するとヒットします)
  8. 追加した組織の [送信アクセス]:既定値から継承 を選択
  9. [B2Bコラボレーション] > 設定のカスタマイズ を選択
  10. [B2Bコラボレーション] > [ユーザーとグループ]で [アクセス状態]:アクセスを許可[適用対象]:組織名ユーザーとグループの追加 を選択し、許可するグループを追加 ※後ほどPower Platformで作成するアプリではユーザーに表示するFriendlyNameを別で作成するのでグループ名は任意で問題ありません。
  11. [B2Bコラボレーション] > [外部アプリケーション]で [アクセス状態]:アクセスを許可[適用対象]:すべての外部アプリケーション を選択し、[保存]を選択

以上でテナント間アクセスの設定は以上になります。
テナント全体の設定なので30分~1時間くらいで設定が有効になると思います。

設定有効後は、手順10で追加したグループのユーザーのみ外部組織Aにゲスト参加でき、それ以外のユーザーはゲスト参加がブロックされます。


ゲスト招待のメールを受信しリンクを選択してもブロックされる

サインインログの取得

Entra IDのサインインログから取得できるかなーと思いましたが、外部組織のテナントIDのみ表示されていて組織名が分からない状態です。惜しい。

B2Bコラボレーション、ホームテナントIDでフィルター

というわけでMicrosoft Graph PowerShellモジュールを使いサインインログを取得します。

Microsoft Graph PowerShellモジュールのインストール

Microsoft Graph REST API v1.0とBetaを利用します。

インストール方法はJapan Azure Identity Support Blogにまとめられています。

Install-Module Microsoft.Graph
Install-Module Microsoft.Graph.Beta

コードの実行

必要な変数を定義しておきます。

$MyTenantID = "<自分のテナントのID>"
$ExportCSVPath = "<CSVファイルを出力するパス>"

サインインログをCSVファイルにエクスポートします。
Get-MgBetaAuditLogSignInSEくぼたの事件簿さんのテナントIDからテナントの情報を取得する記事を参考にしました。

# Micosoft Graphに接続
Connect-MgGraph -Scopes "AuditLog.Read.All","CrossTenantInformation.ReadBasic.All"

# 全てのSignInログを取得
$AllSignInLog = Get-MgBetaAuditLogSignIn -Filter "ResourceTenantId ne '$MyTenantID'" -All:$True

# ユニークなResourceTenantIdを取得
$uniqueTenantIds = $AllSignInLog |
                    Select-Object -ExpandProperty ResourceTenantId |
                    Where-Object { $_ -ne $null } |
                    Sort-Object -Unique

# 各テナントのDisplayNameを取得し、ハッシュテーブルに格納
$tenantDisplayNames = @{}
foreach ($tenantId in $uniqueTenantIds) {
    if (-not $tenantDisplayNames.ContainsKey($tenantId)) {
        try {
            $response = Invoke-MgGraphRequest -Method GET -Uri "https://graph.microsoft.com/v1.0/tenantRelationships/findTenantInformationByTenantId(tenantId='$tenantId')"
            if ($response -and $response.displayName) {
                $tenantDisplayNames[$tenantId] = $response.displayName
            } else {
                $tenantDisplayNames[$tenantId] = "DisplayName Not Found"
            }
        } catch {
            $tenantDisplayNames[$tenantId] = "Error Retrieving DisplayName"
        }
    }
}

# SignInログを整形
$SignInLog = $AllSignInLog | Select-Object -Property CreatedDateTime,UserPrincipalName,AppDisplayName,ResourceTenantId,`
    @{Name='ResourceTenantDisplayName';Expression={$tenantDisplayNames[$_.ResourceTenantId]}},`
    @{Name="ErrorCode";Expression={$_.Status.ErrorCode}},`
    @{Name="AdditionalDetails";Expression={$_.Status.AdditionalDetails}}

# CSVに出力
if($SignInLog.count -ne 0){
	$SignInLog | Export-Csv $ExportCSVPath -NoTypeInformation -Encoding UTF8
}else{
    Write-Host "B2Bコラボレーションのアウトバウンド通信のサインインログは見つかりませんでした"
}

# Micosoft Graphから切断
Disconnect-Mggraph

CSVファイルの中身はこんな感じです。

組織名を取得できてる!

ErrorCodeが0であればアクセスに成功、それ以外であればアクセスに失敗しています。
失敗の理由がAdditionalDetailsの値です。

500212のエラーコードは、テナント間アクセスでブロックされたことを表しています。
今回はゲスト招待を許可されたグループにユーザーが割り当たっていない ことが原因です。

The user's administrator must update their cross-tenant access policy to allow access to the resource tenant.

Power BIでサインインログを可視化

最後にPower BIでサインインログを可視化してみました。
こんな感じでどのアカウントがどの組織にゲスト参加しているかが分かります。

最近B2Cを触ってたからAzureへの接続が多い

エラーコードでフィルター

おわりに

運用編も頑張って書きます!

Discussion