😔

【失敗】Microsoft Graphで特定のグループのみゲストを追加できるようにする

2023/06/07に公開

はじめに

Teamsでチームを作ると同時にAzure ADにMicrosoft 365グループが作成されます。
既定ではこのグループにゲストユーザー(例:別会社の人)も追加できます。

しかし、ゲストを追加するということは情報漏洩の危険にもさらされるので、特定のグループのみゲストを追加できるようにしたいといったニーズは少なからずあると思います。

今回はMicrosoft Graph groupSettingリソースの範囲で検証してみました。

groupSetting

Graphのドキュメントを見るとグループ設定(groupSetting)があるのでどんなリソースか見てみます。

テナント全体およびオブジェクト固有の制限と許可される動作をカスタマイズするために使用できる構成を定義します。 たとえば、グループ表示名の単語一覧をブロックしたり、ゲスト ユーザーをグループ所有者にするかどうかを定義したりできます。
https://learn.microsoft.com/ja-jp/graph/api/resources/groupsetting?view=graph-rest-1.0

Azure ADの管理画面では設定できないような項目も設定できそうです。

注意事項をまとめてみました。

  • テナントレベルの既定値を変更するにはgroupSettingTemplates を使用して新しい設定オブジェクトを作成する必要がある
  • グループレベルの設定 > テナントレベルの設定
  • Microsoft 365グループのみ対応
  • 基本的にはAzure AD Premium P1が必要

Graph ExplolerでgroupSettingリソースを取得してみます。

GET
https://graph.microsoft.com/v1.0/groupSettings

レスポンスのvalueが空の状態、またはなにかしらの情報が返ってきます。
一例ですがdisplayNameGroup.Unifiedとなったものが返ってきた場合、Azure ADのグループの名前付けポリシーやカスタム禁止用語を利用時に自動で作成されたと考えられます。

Group.UnifiedAllowToAddGuestsという設定があるのでこの値をtrue、またはfalseに設定してあげるとM365グループにゲストを追加できるかできないかを制御できそうです。

公開情報にも記載があります。

To enable guest access for only a few Microsoft 365 groups, set AllowToAddGuests to be true at the tenant-level, and then selectively disable this setting for individual Microsoft 365 groups to exclude.
https://learn.microsoft.com/ja-jp/graph/group-directory-settings#groupunified

今回の要件ではテナントレベルでfalse・グループレベルでtrueにしたら要件は満たせそうです。

M365グループにゲストを既定で追加できるのでAllowToAddGuestsのテナントレベルの既定値はtrueと推測します。

groupSettingTemplates

テナント/グループそれぞれでgroupSettingAllowToAddGuestsの値を設定すればいいことが分かったので実際に作成してみます。

groupSettinggroupSettingTemplatesリソースをベースに作成するようです。

既定では、すべてのグループがプリセットの既定値を継承します。 既定の設定を変更するには、 groupSettingTemplates を使用して新しい設定オブジェクトを作成する必要があります。
https://learn.microsoft.com/ja-jp/graph/api/resources/groupsetting?view=graph-rest-1.0

groupSettingTemplatesは全テナント共通の設定値なので作成/更新/削除はできません。
代わりに読み取りができるのでgroupSettingを作成時にテンプレートIDを指定します。

groupSettingTemplatesは何種類かありますが、今回はAllowToAddGuestsが含まれるGroup.Unified(テナント)Group.Unified.Guest(グループ)を使用します。

テナントのgroupSettingを作成

https://learn.microsoft.com/ja-jp/graph/api/group-post-settings?view=graph-rest-1.0&tabs=http#example-1-create-a-new-setting-for-all-microsoft-365-groups-in-the-tenant

POST
https://graph.microsoft.com/v1.0/groupSettings
body
{
    "templateId": "62375ab9-6b52-47ed-826b-58e47e0e304b",
    "values": [
        {
            "name": "AllowToAddGuests",
            "value": "false"
        }
    ]
}
headers
Content-type:application/json

この状態でhttps://graph.microsoft.com/v1.0/groupSettingsでGETすると作成されていることを確認できます。

2つ以上のgroupSettingリソースは設定できない

既にテナントに同一テンプレートをもとにしたgroupSettingが存在している場合、上記の手順では次のようなエラーになります。

よって、https://graph.microsoft.com/v1.0/groupSettingsidを確認し、AllowToAddGuestsの値をfalseにする必要があります。(または削除して再作成)
https://learn.microsoft.com/ja-jp/graph/api/groupsetting-update?view=graph-rest-1.0&tabs=http

PATCH
https://graph.microsoft.com/v1.0/groupSettings/{setting-id}
body
{
    "values": [
        {
            "name": "AllowToAddGuests",
            "value": "false"
        }
    ]
}
headers
Content-type:application/json

グループのgroupSettingを作成

https://learn.microsoft.com/ja-jp/graph/api/group-post-settings?view=graph-rest-1.0&tabs=http#example-2-create-a-setting-to-block-guests-for-a-specific-microsoft-365-group
ゲストを追加できるグループはAllowToAddGueststrueに設定します。


POST
https://graph.microsoft.com/v1.0/groups/{groupid}/settings
body
{
    "templateId": "08d542b9-071f-4e16-94b0-74abb372e3d9",
    "values": [
        {
            "name": "AllowToAddGuests",
            "value": "true"
        }
    ]
}
headers
Content-type:application/json

この状態でhttps://graph.microsoft.com/v1.0/groups/{groupid}/settingsでGETすると作成されていることを確認できます。

削除と更新

groupSettingを作成するとidも作成されるので、このidを頼りに削除(DELETE)や更新(PATCH)を行うことができます。

結果

テナント:AllowToAddGuestsfalse
チーム:AllowToAddGueststrue

場所 ゲスト追加 頭の中
Teamsアプリ × ここが〇になるはずなのにんなんで!?
Teams管理センター あ、管理センターから追加できるのか
Azure AD 同上

おかしい。。。と思い調査を進めると公開情報に以下のような記述がありました。

AllowToAddGuests is false at the tenant-level, the group-level setting is overwritten
https://learn.microsoft.com/en-us/graph/group-directory-settings#groupunifiedguest

なるほど。。。こんな制約が。。。
設定反映に時間かかりすぎじゃないと思ったのが間違いでした。

Microsoft的には今回のシナリオはそもそも想定していないようです。

というわけでMicrosoft GraphのgroupSettingリソースで特定のグループのみゲストを追加できるようにしたいという要件を満たすのはかなり難しいという結論です。
※テナントレベルではtrueにしておいて、チーム作成時はfalse・申請があったチームのみtrueに変更することで実現はできなくもないですが運用でカバーを超えています()

一応テナントとチームのAllowToAddGuestsのパターン別に検証してみたので気になる方はご確認ください。(設定反映時間はそんなにかかりません)

パターン別検証

テナント:AllowToAddGueststrue
チーム:AllowToAddGueststrue または 既定

場所 ゲスト追加
Teamsアプリ
Teams管理センター
Azure AD

テナント:AllowToAddGueststrue
チーム:AllowToAddGuestsfalse

場所 ゲスト追加
Teamsアプリ ×
Teams管理センター
Azure AD

テナント:AllowToAddGuestsfalse
チーム:AllowToAddGuestsfalse または 既定

場所 ゲスト追加
Teamsアプリ ×
Teams管理センター
Azure AD

代案

秘密度ラベルをMicrosoft 365グループに付与することでゲストの動きを制御できるので調べてみると良いかもしれません。(参考)

おわりに

Microsoft 365はすべて許可しておいて必要なところはブロックしてねという思想に基づいていそうです。

Discussion