条件付きアクセス: トークン保護 (プレビュー)

トークン保護 (業界ではトークンのバインドと呼ばれることがあります) では、トークンが目的のデバイスからのみ使用可能であることを確実にすることで、トークンの盗難を使用した攻撃を減らそうとします。 攻撃者がトークンを盗むことができる場合、ハイジャックまたはリプレイによって、トークンの有効期限が切れるか、トークンが取り消されるまで、被害者になりすます可能性があります。 トークンの盗難は比較的まれなイベントと考えられますが、その被害が大きくなる可能性があります。

トークン保護により、トークンとトークンが発行されるデバイス (クライアント シークレット) との間に暗号化で保護された結び付きが生じます。 クライアント シークレットがないと、バインドされたトークンは役に立ちません。 ユーザーが Microsoft Entra ID に Windows 10 以降のデバイスを登録すると、そのプライマリ ID がデバイスにバインドされます。 つまり、ポリシーによって、バインドされたサインイン セッション (または更新) トークン (プライマリ更新トークン (PRT) と呼ばれる) のみが、リソースへのアクセスを要求するときにアプリケーションによって使用されることを保証できます。

重要

トークン保護は現在パブリック プレビュー段階にあります。 プレビューの詳細については、オンライン サービスのユニバーサル ライセンス条項に関するページを参照してください。 このプレビューでは、特定サービスのサインイン トークン (更新トークン) のトークン保護を要求する条件付きアクセス ポリシーを作成する機能が提供されています。 Windows デバイス上で Exchange Online および SharePoint Online にアクセスするデスクトップ アプリケーションの条件付きアクセスで、サインイン トークンのトークン保護がサポートされています。

重要

最初のパブリック プレビューのリリース以降、トークン保護では次の変更が行われています。

  • サインイン ログの出力: 2023 年 6 月下旬に、"enforcedSessionControls" と "sessionControlsNotSatisfied" で使用される文字列の値が "Binding" から "SignInTokenProtection" に変更されました。 サインイン ログ データに対するクエリを更新し、この変更を反映させる必要があります。

Note

このコンテンツでは、サインイン トークンと更新トークンが置き換わる場合があります。 このプレビューは現在、アクセス トークンまたは Web Cookie はサポートされていません。

Screenshot showing a Conditional Access policy requiring token protection as the session control

必要条件

このプレビューでは、トークン保護の条件付きアクセス ポリシーが適用されたリソースへのアクセスに関して、次の構成がサポートされています。

  • Microsoft Entra 参加済み、Microsoft Entra ハイブリッド参加済み、または Microsoft Entra 登録済みの Windows 10 以降のデバイス。
  • OneDrive 同期クライアント バージョン 22.217 以降
  • Teams ネイティブ クライアント バージョン 1.6.00.1331 以降
  • Power BI デスクトップ バージョン 2.117.841.0 (2023 年 5 月) 以降
  • 「Windows 認証ブローカー」サインイン オプションを使用する場合は Visual Studio 2022 以降
  • Office Perpetual クライアントはサポートされていません

既知の制限事項

  • 外部ユーザー (Microsoft Entra B2B) はサポートされていないため、条件付きアクセス ポリシーに含めることはできません。
  • 次のアプリケーションは、保護されたトークン フローを使用したサインインをサポートしていません。Exchange と SharePoint にアクセスすると、ユーザーはブロックされます。
    • Exchange または SharePoint によって処理される Exchange、SharePoint、または Microsoft Graph のスコープにアクセスする PowerShell モジュール
    • Excel 用の PowerQuery 拡張機能
    • Exchange または SharePoint にアクセスする、Visual Studio Code の拡張機能
    • バグが原因で、新しい Teams 2.1 プレビュー クライアントがサインアウト後にブロックされます。 このバグは、今後のサービス更新プログラムで修正されます。
  • 次の Windows クライアント デバイスはサポートされていません。
    • Windows Server
    • Surface Hub
    • Windows ベースの Microsoft Teams Rooms (MTR) システム

ライセンス要件

この機能を使用するには、Microsoft Entra ID P2 ライセンスが必要です。 自分の要件に適したライセンスを探すには、「一般提供されている Microsoft Entra ID の機能の比較」を参照してください。

Note

トークン保護の適用はMicrosoft Entra ID 保護の一部であり、一般提供時に P2 ライセンスの一部になります。

デプロイ

ユーザーにとって、登録済みデバイスと互換アプリケーションで互換性のあるクライアント プラットフォームを使用する場合、トークン保護を適用する条件付きアクセス ポリシーの展開は非表示にする必要があります。

アプリまたはデバイスの非互換性によるユーザーの作業の中断の可能性を最小限に抑えるために、次のことを強くお勧めします。

  • ユーザーのパイロット グループから開始し、随時拡張します。
  • トークン保護の適用に移行する前に、レポート専用モードで条件付きアクセス ポリシーを作成します。
  • 対話型と非対話型の両方のサインイン ログをキャプチャします。
  • 通常のアプリケーションの用途をカバーするのに十分な期間にわたって、これらのログを分析します。
  • 既知の適切なユーザーを適用ポリシーに追加します。

このプロセスは、トークン保護の適用についてユーザーのクライアントとアプリの互換性を評価するのに役立ちます。

条件付きアクセス ポリシーを作成する

特権アクセスのセキュリティ レベル」で説明されているような特殊なロールを実行するユーザーが、この機能の考えられるターゲットです。 小さなサブセットでのパイロット運用から開始することをお勧めします。

Screenshot of a configured Conditional Access policy and its components.

次の手順は、Windows デバイス上の Exchange Online と SharePoint Online のトークン保護を要求する条件付きアクセス ポリシーを作成するのに役立ちます。

  1. 条件付きアクセス管理者以上として Microsoft Entra 管理センターにサインインします。
  2. 保護>条件付きアクセス を参照します。
  3. [新しいポリシー] を選択します。
  4. ポリシーに名前を付けます。 ポリシーの名前に対する意味のある標準を組織で作成することをお勧めします。
  5. [割り当て] で、 [ユーザーまたはワークロード ID] を選択します。
    1. [含める] で、このポリシーをテストするユーザーまたはグループを選択します。
    2. [除外] で、 [ユーザーとグループ] を選択し、組織の緊急アクセス用または非常用アカウントを選択します。
  6. [ターゲット リソース]> [クラウド アプリ]>[含む]>[アプリを選択] の下
    1. [選択] で、プレビューでサポートされている次のアプリケーションを選択します。

      1. Office 365 Exchange Online
      2. Office 365 SharePoint Online

      警告

      条件付きアクセス ポリシーは、これらのアプリケーションに対してのみ構成する必要があります。 Office 365 アプリケーション グループを選択すると、意図しないエラーが発生する可能性があります。 これは、条件付きアクセス ポリシーで Office 365 アプリケーション グループを選択する必要があるという一般的な規則の例外です。

    2. [選択] を選択します。

  7. [条件] で、次の手順を実行します。
    1. [デバイス プラットフォーム] で、次の手順を実行します。
      1. [構成][はい] に設定します。
      2. [含める]>[デバイス プラットフォームの選択]>[Windows]
      3. 完了を選択します。
    2. [クライアント アプリ] で、次の手順を実行します。
      1. [構成][はい] に設定します。

        警告

        クライアント アプリの条件を構成しなかったり、[ブラウザー] を選択したままにしたりすると、MSAL.js を使用するアプリケーション (Teams Web など) がブロックされる場合があります。

      2. [先進認証クライアント] で、[モバイル アプリとデスクトップ クライアント] のみを選択します。 その他の項目はオフのままにします。
      3. [Done] を選択します。
  8. [アクセス制御]>[セッション] で、[Require token protection for sign-in sessions] (サインイン セッションにトークン保護を要求する) を選択し、[選択] を選択します。
  9. 設定を確認し、 [ポリシーの有効化][レポート専用] に設定します。
  10. [作成] を選択して、ポリシーを作成および有効化します。

管理者は、レポート専用モードを使用して設定を確認したら、[ポリシーの有効化] トグルを [レポートのみ] から [オン] に移動できます。

ログをキャプチャして分析する

適用の前後におけるトークン保護の条件付きアクセス適用を監視します。

サインイン ログ

Microsoft Entra サインイン ログを使って、レポート専用モードまたは有効モードのトークン保護適用ポリシーの結果を検証します。

  1. 条件付きアクセス管理者以上として Microsoft Entra 管理センターにサインインします。
  2. [ID]>[監視と正常性]>[サインイン ログ] の順に移動します。
  3. 特定の要求を選択して、ポリシーが適用されているかどうかを判別します。
  4. 状態に応じて [条件付きアクセス] または [レポート専用] ペインに移動し、トークン保護を要求するポリシーの名前を選択します。
  5. [セッション制御] で、ポリシー要件が満たされているかどうかを確認します。

Screenshot showing an example of a policy not being satisfied.

Log Analytics

また、Log Analytics を使用して、トークン保護の適用エラーが原因でブロックされた要求についてサインイン ログ (対話型および非対話型) に照会することもできます。

過去 7 日間の非対話型サインイン ログを検索する Log Analytics クエリのサンプルを次に示します。アプリケーションによってブロックされた要求と許可された要求を対比して強調表示しています。 これらのクエリは単なるサンプルであり、変更される場合があります。

注意

サインイン ログの出力: 2023 年 6 月下旬に、"enforcedSessionControls" と "sessionControlsNotSatisfied" で使用される文字列の値が "Binding" から "SignInTokenProtection" に変更されました。 サインイン ログ データに対するクエリを更新し、この変更を反映させる必要があります。 この例では、履歴データを含める両方の値を取り上げています。

//Per Apps query 
// Select the log you want to query (SigninLogs or AADNonInteractiveUserSignInLogs ) 
//SigninLogs 
AADNonInteractiveUserSignInLogs 
// Adjust the time range below 
| where TimeGenerated > ago(7d) 
| project Id,ConditionalAccessPolicies, Status,UserPrincipalName, AppDisplayName, ResourceDisplayName 
| where ConditionalAccessPolicies != "[]" 
| where ResourceDisplayName == "Office 365 Exchange Online" or ResourceDisplayName =="Office 365 SharePoint Online" 
//Add userPrinicpalName if you want to filter  
// | where UserPrincipalName =="<user_principal_Name>" 
| mv-expand todynamic(ConditionalAccessPolicies) 
| where ConditionalAccessPolicies ["enforcedSessionControls"] contains '["Binding"]' or ConditionalAccessPolicies ["enforcedSessionControls"] contains '["SignInTokenProtection"]' 
| where ConditionalAccessPolicies.result !="reportOnlyNotApplied" and ConditionalAccessPolicies.result !="notApplied" 
| extend SessionNotSatisfyResult = ConditionalAccessPolicies["sessionControlsNotSatisfied"] 
| extend Result = case (SessionNotSatisfyResult contains 'SignInTokenProtection' or SessionNotSatisfyResult contains 'SignInTokenProtection', 'Block','Allow')
| summarize by Id,UserPrincipalName, AppDisplayName, Result 
| summarize Requests = count(), Users = dcount(UserPrincipalName), Block = countif(Result == "Block"), Allow = countif(Result == "Allow"), BlockedUsers = dcountif(UserPrincipalName, Result == "Block") by AppDisplayName 
| extend PctAllowed = round(100.0 * Allow/(Allow+Block), 2) 
| sort by Requests desc 

前のクエリの結果は、次のスクリーンショットのようになります。

Screenshot showing example results of a Log Analytics query looking for token protection policies

次のクエリ例では、過去 7 日間の非対話型サインイン ログを調べます。ユーザーによってブロックされた要求と許可された要求を対比して強調表示しています。

//Per users query 
// Select the log you want to query (SigninLogs or AADNonInteractiveUserSignInLogs ) 
//SigninLogs 
AADNonInteractiveUserSignInLogs 
// Adjust the time range below 
| where TimeGenerated > ago(7d) 
| project Id,ConditionalAccessPolicies, UserPrincipalName, AppDisplayName, ResourceDisplayName 
| where ConditionalAccessPolicies != "[]" 
| where ResourceDisplayName == "Office 365 Exchange Online" or ResourceDisplayName =="Office 365 SharePoint Online" 
//Add userPrincipalName if you want to filter  
// | where UserPrincipalName =="<user_principal_Name>" 
| mv-expand todynamic(ConditionalAccessPolicies) 
| where ConditionalAccessPolicies ["enforcedSessionControls"] contains '["Binding"]' or ConditionalAccessPolicies ["enforcedSessionControls"] contains '["SignInTokenProtection"]'
| where ConditionalAccessPolicies.result !="reportOnlyNotApplied" and ConditionalAccessPolicies.result !="notApplied" 
| extend SessionNotSatisfyResult = ConditionalAccessPolicies.sessionControlsNotSatisfied 
| extend Result = case (SessionNotSatisfyResult contains 'SignInTokenProtection' or SessionNotSatisfyResult contains 'SignInTokenProtection', 'Block','Allow')
| summarize by Id, UserPrincipalName, AppDisplayName, ResourceDisplayName,Result  
| summarize Requests = count(),Block = countif(Result == "Block"), Allow = countif(Result == "Allow") by UserPrincipalName, AppDisplayName,ResourceDisplayName 
| extend PctAllowed = round(100.0 * Allow/(Allow+Block), 2) 
| sort by UserPrincipalName asc   

次の手順