皆さんこんにちは。国井です。
今日もこのブログはEnterprise Mobility + Security(EMS) Advent Calendar 2021の10日目に参加しています。
Microsoft Teamsなどで別の会社のユーザーを招待し、その結果としてゲストユーザーが作られるケースってあると思います。このようにして作られたユーザーはAzure ADの中でどのような権限を持つのでしょうか?
その設定はAzure AD管理センターのユーザー設定 > 外部コラボレーションの設定を管理します からアクセス可能な[外部コラボレーションの設定]項目で定義できます。
そして今日、話題にしたいのはこちら。
[ゲストユーザーのアクセス]というメニューです。
ゲストユーザーのアクセス設定は以前、[ゲストユーザーは、メンバーと同じアクセス権を持ちます]がデフォルト設定だったと記憶しているのですが、セキュリティ的によろしくないとのことで[ゲストユーザーは、ディレクトリオブジェクトのプロパティとメンバーシップへのアクセスが制限されます]がデフォルト設定になっています。
じゃあ、[ゲストユーザーは、ディレクトリオブジェクトのプロパティとメンバーシップへのアクセスが制限されます]が選択されていればOKかと言えばそうでもないのでは?というのが今回の問題提起です。
ゲストユーザーのアクセスの既定の設定
docsによると、[ゲストユーザーは、ディレクトリオブジェクトのプロパティとメンバーシップへのアクセスが制限されます]の設定は「ゲストは、非表示でないすべてのグループのメンバーシップを表示できます」と説明が書いてあります。ここで言う非表示というのが何を指すのかは明示されていないのですが、いずれにしてもゲストユーザーレベルでも参照可能な情報はあるということです。
ではこのあたりを探ってみましょう。
ゲストで招かれているテナントに潜入
ゲストユーザーはAzure AD管理センターにサインインしてアクセスすることはできません(以前はこれさえもできていました)。
そこでAzure AD PowerShellを利用してアクセスしてきます。
アクセスするときは「Connect-AzureAD -Tenant xxxxx」って感じで入力していくのですが、潜入先のディレクトリIDがわからない!そんなときはゲストユーザーとしてAzureポータルにサインインし、画面右上の歯車マークをクリックしてテナント一覧を確認しましょう。すると、自分がゲストとして招かれているテナントのディレクトリIDが確認できます。
ディレクトリIDがわかったらサインインします。
アクセスできちゃった。
Teamsのチーム名を列挙
繰り返しになりますが、[ゲストユーザーは、ディレクトリオブジェクトのプロパティとメンバーシップへのアクセスが制限されます]項目を選択していると、「非表示でないすべてのグループのメンバーシップを表示できます」とdocsのページに説明があります。
つまりグループに所属するメンバーの情報、言い方を換えればユーザーが所属するグループの情報がわかるのです。ということで、PowerShellからGet-AzureADUserMembershipコマンドレットを実行し、ユーザーが所属するグループの情報を列挙していきます。例えば、ゲストとして招かれた会社のTeamsチームにいるユーザーのメールアドレスを入力して列挙してみます。
すると、ユーザーが所属するグループの情報が表示されたことがわかります。
またMicrosoft Teamsのチームって、実体はMicrosoft 365グループですから、ユーザーが所属するグループ一覧はその人が参加するチーム一覧でもあるわけです。もし、そこにお取引先の会社名をチーム名にしたものがあれば、「あの会社、こんな会社と取引しているのか!」なんてことがわかってしまうのです。ということで、[ゲストユーザーのアクセス]設定は[ゲストユーザーのアクセスは、各自のディレクトリオブジェクトのプロパティとメンバーシップに制限されます]を選択すべきと考えます。(副作用については私もまだ把握しきれてないので、何かあればご連絡いただけると嬉しいです)
履歴を追跡
最後におまけを。
これまでにメンバーシップの一覧を参照したゲストユーザーがいないか追跡したい場合、ログを使っていきます。Azure AD管理センターのサインインログからフィルター設定で ユーザータイプ=ゲスト と設定し、検索するとAzure Active Directory PowerShell というアプリケーションにアクセスしたゲストユーザーがいることがわかります。
参考までにLog Analyticsだったらこんな感じになります。
SigninLogs
| where UserType == “Guest”
| where AppDisplayName == “Azure Active Directory PowerShell”
Microsoft Sentinelを使っているのであれば、これをトリガーにしてアラートルールを作っておくのも良いですね。