Microsoft ID 同意フレームワークによって保護される API の例
この記事は、開発者が最小特権の原則に基づいてアプリケーションのアクセス許可戦略を設計するのに役立ちます。 先に進む前に、記事「API の保護」に目を通し、登録、アクセス許可、アクセスに関するベスト プラクティスを確認してください。
Microsoft ID プラットフォームによって保護される API が Microsoft ID 同意フレームワークをどのように使用するかを見てみましょう。 Microsoft Graph API は Microsoft ID プラットフォームの同意フレームワークを最も広範囲に使用するため、ここでは、例として Microsoft Graph API を使用します。
アクセス許可名の名前付け規則
Microsoft Graph チームは、アクセス許可が有効なリソース アクセスにアクセス許可を簡単に接続できるように、アクセス許可名の名前付け規則を作成しました。 Microsoft Graph のアクセス許可名 は、単純な resource.operation.constraint のパターンに則っています。 2 つの主な操作 (operation) は、Read (読み取り)および ReadWrite (読み取り書き込み) (更新と削除を含む) です。
制約 (constraint) は、そのアプリケーションがディレクトリ内で持つアクセスレベルに影響します。 Microsoft Graph は、次の制約設定をサポートしています。
- All(全て)は、ディレクトリ内の指定した種類のすべてのリソースに対する操作を可能にするアクセス許可をアプリケーションに付与します。
- Shared は、他のユーザーがサインインしているユーザーと共有したリソースに対して操作を実行するためのアクセス許可をアプリに付与します。
- AppFolder (アプリフォルダー) は、OneDrive の専用フォルダー内のファイルを読み書きできるアクセス許可をアプリケーションに付与します。 この制約設定は、ファイル アクセス許可オブジェクトでのみ公開され、Microsoft アカウントでのみ有効です。
- No constraint (制約なし) を指定した場合、アプリケーションはサインインしているユーザーが所有するリソースに対してのみ操作を実行できます。
特定のリソースに対するアクセスと操作
Microsoft Graph のユーザー オブジェクトに対するいくつかのアクセス許可 (スコープ) をチェックし、Microsoft API デザイナーが特定のリソースに対してどのように特定のアクセスと操作を有効にしているかを確認しましょう。
権限 | 表示文字列 | 説明 |
---|---|---|
User.Read |
サインインし、ユーザー プロファイルを読み取る | ユーザーがアプリケーションにサインインすることを許可し、同時にアプリケーションがサインインしたユーザーのプロファイルを読み取ることを許可します。 また、サインインしたユーザーの基本会社情報を読み取ることもアプリに許可します。 |
User.ReadWrite |
ユーザープロファイルへの読み取り/書き込みアクセス | サインインしたユーザーのプロファイル全体を読み取ることをアプリケーションに許可します。 またアプリケーションが、サインインしているユーザーのプロファイル情報をユーザーに代わって更新することも許可します。 |
User.Read
と User.ReadWrite
は、アプリケーションが最小特権のゼロ トラスト原則に従うことができるように存在しています (User.Access
のような単一のアクセス許可は存在しません)。 開発者が、ユーザーのプロファイルを更新するための要件とコードを持っていない場合、アプリは、User.ReadWrite
を要求しません。 そのため、攻撃者はアプリケーションを侵害したり、それを使用してデータを変更することはできません。
User.Read
はユーザーオブジェクトへのアクセスをアプリケーションに許可するだけではないことに注意すること。 各アクセス許可は、特定の操作範囲を表します。 開発者と管理者がアクセス許可の説明を読んで、特定のアクセス許可が何を有効化するのかを正確に確認することが重要です。 User.Read
は、現在のユーザーの完全なプロファイルの読み取りを有効にするだけでなく、Microsoft Graph の Organizations の基本情報をアプリケーション側で見ることができるようにします。
別のアクセス許可を見てみましょう。
権限 | 表示文字列 | 説明 |
---|---|---|
User.ReadBasic.All |
すべてのユーザーの基本プロファイルの読み取り | サインインしているユーザーのために、組織内の他のユーザーのプロファイル プロパティの基本セットを読み取ることをアプリケーションに許可します。 表示名、姓名、メール アドレス、オープン拡張機能、写真が含まれます。 サインインしているユーザーのプロファイル全体を読み取ることをアプリケーションに許可します。 |
User.ReadBasic.All
が実行するすべてで User.Read
が開始される操作の範囲。 さらに、他の組織のユーザーの表示名、姓名、メール アドレス、写真、オープン拡張機能にアクセスできます。 この操作範囲は、アプリケーションがユーザー選択 UI をもつことを可能にします。これは、特定の範囲の操作を有効にするアクセス許可を利用する API デザイナーの例になります。
Microsoft Graph ユーザー オブジェクトに対するさらにいくつかのアクセス許可を見てみましょう。
権限 | 表示文字列 | 説明 |
---|---|---|
User.Read.All |
すべてのユーザーの完全なプロファイルの読み取り | サインインしているユーザーのために、組織内の他のユーザーのプロファイル プロパティ、レポート、およびマネージャーの完全なセットを読み取ることをアプリケーションに許可します。 |
User.ReadWrite.All |
すべてのユーザーの完全なプロファイルの読み取りと書き込み | サインインしているユーザーのために、組織内の他のユーザーのプロファイル プロパティ、レポート、およびマネージャーの完全なセットを読み書きすることをアプリケーションに許可します。 また、サインインしているユーザーのために、アプリケーション側でユーザーを作成あるいは削除したり、ユーザー パスワードをリセットすることも許可します。 |
User.Read
および User.ReadWrite
と同様に、User.Read.All
および User.ReadWrite.All
はアプリケーションが最小特権のゼロ トラスト原則に従うことを可能にする個別のアクセス許可です。
User.Read.All
がユニークなのは、組織内のすべてのユーザーがこの機能を持っている点です (たとえば、Outlook を開く、レポート チェーンを上下に移動するなど)。 それぞれのユーザーが、組織内の他のすべてのユーザーの完全なユーザー プロファイルを見ることができます。 ただし、Microsoft Graph API デザイナーは、User.Read.All
にはテナントの組織階層が含まれているため、この操作をアプリケーションに許可することができるのは管理者のみに限定するべきと判断しました。 攻撃者がこの情報にアクセスした場合、対象者の上司またはその上司のアドレスからフィッシングメールを送信する標的型フィッシング攻撃をしかける可能性があるためです。
User.ReadWrite.All
は、強力な操作範囲です。 このアクセス許可を付与されたアプリケーションは、テナント内のすべてのユーザーを更新したり、削除したりできます。 委任されたアクセス許可として、特定のユーザーがアプリケーションに認証されている間、アプリケーションは現在のユーザーが実行できる操作のみを実行できます。 通常のユーザーは、アプリケーションのアクセス許可に関係なく、他のユーザーを更新または削除することはできません。 ただし、テナント管理者がアプリケーションを使用する場合は、これらの操作を実行できます。 このアクセス許可を付与すべきか拒否すべきかを判断するには、テナント管理者ユーザーを念頭に置いてアプリケーションを評価する必要があります。
管理者の同意が必要なアクセス許可
User.Read.All
と User.ReadWrite.All
の影響力を鑑みて、Microsoft Graph API デザイナーは、これらのアクセス許可を管理者の同意を必要とするよう指定しています。 アクセス許可テーブルに管理者の同意が必要ですか?列を追加して、どのアクセス許可に管理者の同意が必要なのかを明確化しましょう。
権限 | 表示文字列 | 説明 | 管理者の同意が必要ですか? |
---|---|---|---|
User.Read |
サインインし、ユーザー プロファイルを読み取る | ユーザーがアプリケーションにサインインすることを許可し、同時にアプリケーションがサインインしたユーザーのプロファイルを読み取ることを許可します。 また、サインインしたユーザーの基本会社情報を読み取ることもアプリに許可します。 | いいえ |
User.ReadWrite |
ユーザープロファイルへの読み取り/書き込みアクセス | サインインしたユーザーのプロファイル全体を読み取ることをアプリケーションに許可します。 またアプリケーションが、サインインしているユーザーのプロファイル情報をユーザーに代わって更新することも許可します。 | いいえ |
User.ReadBasic.All |
すべてのユーザーの基本プロファイルの読み取り | サインインしているユーザーのために、組織内の他のユーザーのプロファイル プロパティの基本セットを読み取ることをアプリケーションに許可します。 表示名、姓名、メール アドレス、オープン拡張機能、写真が含まれます。 サインインしているユーザーのプロファイル全体を読み取ることをアプリケーションに許可します。 | いいえ |
User.Read.All |
すべてのユーザーの完全なプロファイルの読み取り | サインインしているユーザーのために、組織内の他のユーザーのプロファイル プロパティ、レポート、およびマネージャーの完全なセットを読み取ることをアプリケーションに許可します。 | はい |
User.ReadWrite.All |
すべてのユーザーの完全なプロファイルの読み取りと書き込み | サインインしているユーザーのために、組織内の他のユーザーのプロファイル プロパティ、レポート、およびマネージャーの完全なセットを読み書きすることをアプリケーションに許可します。 また、サインインしているユーザーのために、アプリケーション側でユーザーを作成あるいは削除したり、ユーザー パスワードをリセットすることも許可します。 | はい |
記事「管理者の同意が必要なアクセス許可を要求する」で説明しているように、テナント管理者は、要件を無効にして、そのテナント内の任意またはすべてのアプリケーションのアクセス許可を、管理者の同意が必要として指定できます。 トークンを受け取ることができない要求についても適切に処理できるようアプリケーションを設計しておくようお勧めします。 同意の欠如は、アプリがトークンを受け取らない多くの理由の 1 つです。
次のステップ
- 「別の API からの API の呼び出し」は、ある API で別の API を呼び出す必要がある場合にゼロ トラストを確保し、ユーザーに代わって動作するアプリケーションを安全に開発するのに役立ちます。
- 「リソースにアクセスするための承認の取得」は、アプリケーションのリソース アクセス許可を取得するときにゼロ トラストを確保する最善の方法を理解するのに役立ちます。
- 「トークンのカスタマイズ」は、Microsoft Entra トークンで受け取ることができる情報について説明します。 この記事では、最小限の特権でアプリケーションのゼロ トラスト セキュリティを強化しながら、柔軟性と制御を向上するようにトークンをカスタマイズする方法について説明します。
- 「トークンでのグループ要求とアプリ ロールの構成」では、アプリ ロールの定義を使用してアプリを構成し、セキュリティ グループをアプリ ロールに割り当てる方法を示します。 これらの方法は、最小限の特権でアプリケーションのゼロ トラスト セキュリティを強化しながら、柔軟性と制御を向上するのに役立ちます。
- 「管理者の同意が必要なアクセス許可を要求する」では、アプリケーションのアクセス許可に管理者の同意が必要な場合のアクセス許可と同意エクスペリエンスについて説明します。
- こちらのクイック スタート: Microsoft ID プラットフォームで Web API を保護するでは、ASP.NET Web API を保護する方法の例としてコード サンプルをダウンロードして実行します。
- こちらの チュートリアル - Azure API Management で API を変換して保護するでは、API の HTTP 応答内のテクノロジー スタック情報や元の URL を非表示にする一般的なポリシーを構成する方法について説明します。
- 承認のベスト プラクティスは、アプリケーションに最適な承認、アクセス許可、および同意モデルを実装するのに役立ちます。