この記事は、開発者が最小限の特権を提供するようにアプリケーションのアクセス許可戦略を設計する際に役立ちます。 先に進む前に、 API 保護 に関する記事を参照して、登録、アクセス許可、アクセスのベスト プラクティスについて説明します。
Microsoft ID プラットフォームによって保護されている API で Microsoft ID 同意フレームワークがどのように使用されているかを見てみましょう。 Microsoft Graph API は Microsoft ID プラットフォームの同意フレームワークを最も広範に使用するため、例として Microsoft Graph API を使用しています。
アクセス許可名の名前付け規則
Microsoft Graph チームは、アクセス許可が有効なリソース アクセスにアクセス許可を簡単に接続できるように、アクセス許可名の名前付け規則を作成しました。 Microsoft Graph のアクセス許可名 は、単純な resource.operation.constraint パターンに従います。 2 つの主な操作は 、読み取りとReadWrite (更新と削除を含む) です。
制約要素は、アプリがディレクトリ内で持つアクセスの程度に影響します。 Microsoft Graph では、次の制約がサポートされています。
- すべて 、ディレクトリ内の指定した種類のすべてのリソースに対して操作を実行するアクセス許可をアプリに付与します。
- Shared は、サインインしているユーザーと他のユーザーが共有したリソースに対して操作を実行するためのアクセス許可をアプリに付与します。
- AppFolder は、OneDrive の専用フォルダー内のファイルを読み書きするためのアクセス許可をアプリに付与します。 この制約は Files アクセス許可 オブジェクトでのみ公開され、Microsoft アカウントでのみ有効です。
- 制約なしを指定した場合、アプリはサインインしているユーザーが所有するリソースに対してのみ操作を実行できます。
特定のリソースに対するアクセスと操作
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 を非表示にする一般的なポリシーの構成について説明します。
- 承認のベスト プラクティスは 、アプリケーションに最適な承認、アクセス許可、および同意モデルを実装するのに役立ちます。