🔥

アクセス許可を組織の代理として同意した時に気を付けること(Azure AD)

2022/12/31に公開

はじめに

Azure ADではOAuthの仕組みでアプリケーションからリソースへのアクセスを可能としています。
具体的な例を挙げると、Microsoft Graph PowerShell(アプリケーション)を通じてMicrosoft Graph(リソース)にアクセスし、ユーザーにライセンスを割り当てることです。

Microsoft Graph PowerShellに「User.Read.All」などのアクセス許可を同意する際、次のようなプロンプトで「組織の代理として同意する」にチェックをいれるかどうか悩むと思います。


文言的にはチェックを入れて良さそうな気がしますよね

今回はチェックを入れた際に認識しておくべきことを確認します。

※Azure ADでのアプリのOAuthの詳細はAzureADサポートチームのブログにまとまっているので本記事の最後にリンクを記載しておきます。

アクセス許可の同意フロー

Azure ADではOAuth連携のアプリケーションにリソースへのアクセスを許可する同意フローは2種類あります。

フロー 説明
ユーザー同意フロー 現在のユーザーのみに対する同意を記録
管理者同意フロー テナント全体に対する同意を記録

Microsoft Docs | Azure Active Directory でのアプリケーションの同意エクスペリエンス

どのユーザーがどのアクセス許可(クレームの値)に同意しているかはAzure ADで確認できます。


Azure AD > エンタープライズアプリケーション > アクセス許可

ユーザー同意フロー

百聞は一見に如かずということでユーザー同意フローを行ってみます。
権限を持っていない一般ユーザーでMicrosoft Graph PoweShellに管理者の同意が不要なアクセス許可で接続します。

Connect-MgGraph -Scopes "User.Read"

※Microsoft Graph PowerShell SDKのインストール手順はこちらの記事にまとめています。
まだインストールされていない方はよろしければご覧ください。


一般ユーザーでは「組織の代理として同意する」のチェックボックスは表示されません

ID・パスワードで認証を完了後、このようなプロンプトで承諾することをユーザー同意フローといいます。

グローバル管理者権限を持つアカウントのみ「組織の代理として同意する」というチェックボックスが表示され、チェックをいれて承認をすると管理者同意フローになります。

※クラウド管理者等の権限でも表示されません。

同意プロンプトの構成要素の詳細はMicrosoft Docsにあります。
Microsoft Docs | 同意プロンプトの構成要素

Microsoft Graph PowerShellからMicrosoft Graphに情報を要求してみます。
一般ユーザーは"User.Read"のアクセス許可をMicrosoft Graph PoweShellに与えているので自分の情報を取得できますが、組織内のほかのユーザーの情報は取得できません。


UserIDはサインインしたユーザーのObjectIDまたはUPNを指定してください

ユーザー同意フローでは、Azure ADで適切な権限管理がされていれば権限以上の情報を取得できないことがわかります。

管理者の同意が必要なアクセス許可って?

同意フローから話は少しそれますが、Microsoft 365で管理しているリソースの多くはMicrosoft Graphを通じてアクセスできます。
Microsoft Graphではメールだけ読み取り、デバイスだけ読み取りなど細かくアクセス許可を分けることでユーザーがアクセスできる範囲(=スコープ)を制限します。

その際に管理者の同意が必要なアクセス許可と不要なアクセス許可があります。
管理者の同意が不要なアクセス許可は、Azure ADで権限を持っていないユーザーも利用することができます。(利用制限はできます)

"User.Read"は管理者の同意が不要なアクセス許可なので、一般ユーザーでもアクセス許可に同意でき自分の情報を取得できたということです。

Microsoft Docs | Microsoft Graph のアクセス許可のリファレンス
※"User.Read"は「管理者の同意が必要」が「いいえ」になっています

"User.Read"に対して"User.Read.All"は管理者の同意が必要なアクセス許可です。
権限を持っていない一般ユーザーで要求するとプロンプトで同意ができません。

Connect-MgGraph -Scopes "User.Read.All"


グローバル管理者権限を持つユーザーであれば同意できます

管理者同意フロー

話は戻りますが、次は管理者同意フローをやってみます。
管理者同意フローはいくつか存在します。


プロンプトにチェックボックスをいれて承認


Azure AD > エンタープライズアプリケーション > アクセス許可 > テナント名に管理者の同意を与えます

管理者同意フローでどのアクセス許可を付与したかも確認できます。

Azure AD > エンタープライズアプリケーション > アクセス許可 > 管理者の同意

検証

ここからが今回確認したかったことになります。
管理者同意フローで"User.Read.All"のアクセス許可を与えたとします。
この状態で権限を持っていない一般ユーザーは"User.Read.All"のアクセス許可を利用できるのでしょうか?

答えは半分くらいYESです。
一般ユーザーがテナント内のユーザーの情報をある程度確認することができてしまいます。

しかし、管理者の同意フローで"User.ReadWrite.All"を与えたとしてもユーザーのプロパティを変更したり、"Policy.Read.All"で条件付きアクセスのポリシーの情報を取得したりはできません。
これはMicrosoft Graph PowerShellにサインインした一般ユーザーには、Azure ADでグローバル管理者といったユーザーのプロパティを変更したり条件付きアクセスのポリシーの読み取りを行う権限が付与されていないからです。


サインインしたユーザーのAzure ADの権限で最終的には決定する

これで一安心ということはなく、"User.Read.All"と"Directory.Read.All"に同意していた場合、テナント内のグローバル管理者のアカウント情報を取得できるのでセキュリティインシデントにつながります。

対応策

そもそも管理者の同意をしない

まずはこれですよね。
チェックボックスにチェックを入れたい気持ちはよくわかりますが、チェックしなくてもライセンス割り当てとかはできるので管理者の同意をするかどうか検討しましょう。
※管理者の同意の用途はユーザーサインインが発生しないアプリケーションに対してなどです。

アプリケーションを利用できるユーザーを制限する

アプリケーション(Microsoft Graph PowerShell)を利用できるユーザーを制限することで管理者のみにしか触らせないようにすることができます。

1.Azure AD > エンタープライズアプリケーション > プロパティ > 割り当てが必要ですか > はい

2.ユーザーまたはグループの追加で、ここに表示されているユーザーのみ利用できる

追加されていないユーザーで利用しようとすると・・・

おわりに

Azure ADで適切な権限管理がされていればアプリケーション経由で設定変更はできませんが、ある程度の情報を参照できてしまうことが分かりました。
ユーザーがアプリケーションにアクセス許可を同意しようとした際、同意を制限したり管理者にエスカレーションしたりする機能もあるのでまたの機会にまとめたいですね。

2022年最後の記事でした!よいお年をお迎えください!

参考

https://jpazureid.github.io/blog/azure-active-directory/azure-ad-consent-framework/
https://jpazureid.github.io/blog/azure-active-directory/oauth2-application-resource-and-api-permissions/
https://github.com/yusukekodama/PMActivities/blob/master/Webinar/Schedule.md#連絡事項

Discussion