Microsoft ID 同意フレームワークによって保護される API の例

この記事は、開発者が最小特権の原則に基づいてアプリケーションのアクセス許可戦略を設計するのに役立ちます。 この記事を読む前に、API の保護の記事に目を通し、登録、アクセス許可と同意の定義、アクセスの執行に関するベスト プラクティスを確認しておくこと。

Microsoft ID プラットフォームによって保護される API が Microsoft ID 同意フレームワークをどのように使用するかを見てみましょう。 ここでは、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.ReadUser.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.AllUser.ReadWrite.All の影響力を鑑みて、Microsoft Graph API デザイナーは、これらのアクセス許可を管理者の同意を必要とするよう指定しています。 アクセス許可テーブルに管理者の同意が必要ですか?列を追加して、どのアクセス許可に管理者の同意が必要なのかを明確化しましょう。

権限 表示文字列 説明 管理者の同意が必要ですか?
User.Read サインインし、ユーザー プロファイルを読み取る ユーザーがアプリケーションにサインインすることを許可し、同時にアプリケーションがサインインしたユーザーのプロファイルを読み取ることを許可します。 また、サインインしたユーザーの基本会社情報を読み取ることもアプリに許可します。 いいえ
User.ReadWrite ユーザープロファイルへの読み取り/書き込みアクセス サインインしたユーザーのプロファイル全体を読み取ることをアプリケーションに許可します。 またアプリケーションが、サインインしているユーザーのプロファイル情報をユーザーに代わって更新することも許可します。 いいえ
User.ReadBasic.All すべてのユーザーの基本プロファイルの読み取り サインインしているユーザーのために、組織内の他のユーザーのプロファイル プロパティの基本セットを読み取ることをアプリケーションに許可します。 基本セットには、表示名、名と姓、電子メール アドレス、オープン拡張機能、写真が含まれます。 サインインしているユーザーのプロファイル全体を読み取ることをアプリケーションに許可します。 いいえ
User.Read.All すべてのユーザーの完全なプロファイルの読み取り サインインしているユーザーのために、組織内の他のユーザーのプロファイル プロパティ、レポート、およびマネージャーの完全なセットを読み取ることをアプリケーションに許可します。 はい
User.ReadWrite.All すべてのユーザーの完全なプロファイルの読み取りと書き込み サインインしているユーザーのために、組織内の他のユーザーのプロファイル プロパティ、レポート、およびマネージャーの完全なセットを読み書きすることをアプリケーションに許可します。 また、サインインしているユーザーのために、アプリケーション側でユーザーを作成あるいは削除したり、ユーザー パスワードをリセットすることも許可します。 はい

管理者の同意を必要とするアクセス許可の要求の記事で説明しているように、テナント管理者は要件を超えて、テナント内のアプリケーションのアクセス許可の一部またはすべてを管理者の同意を必要とするように指定できます。 トークンを受け取ることができない要求についても適切に処理できるようアプリケーションを設計しておくようお勧めします。 同意の欠如は、アプリがトークンを受け取ることができない主な理由の 1 つです。

次のステップ