トークン保護の展開ガイド - Apple Platforms

概要

このガイドでは、Apple プラットフォーム (iOS、iPadOS、macOS) 上のサインイン セッション トークンにトークン保護を展開して適用するために必要な手順について説明します。

この展開ガイドを使用する前に、Token Protection in Microsoft Entra 条件付きアクセス で機能とサポートされているプラットフォームの概要を確認してください。

Important

Apple のネイティブメールアプリとカレンダーアプリは、トークン保護をサポートしていません。 ポリシーが適用されると、ユーザーはトークン保護によって保護されたリソースへのアクセスをブロックされます。 展開の前に、影響を受けるユーザーにこの動作を伝えます。

[前提条件]

この機能を使用するには、Microsoft Entra ID P1 ライセンスが必要です。 要件に適したライセンスを見つけるには、Microsoft Entra ID の一般的に利用可能な機能を比較する を参照してください。

サポートされているアプリケーションとリソース

次のアプリケーションとリソースは、Apple プラットフォームのトークン保護の対象となります。 ポリシーを適用する前に、これらのリストを確認してください。

アプリケーション

トークン保護は、次のアプリケーションに適用できます。

アプリケーション iOS/iPadOS macOS
Intune 会社ポータル
Microsoft Authenticator
Microsoft Edge (Edge プロファイルへのサインインのみサポート)
Microsoft ループ
Microsoft OneNote
Microsoft Scout
Microsoft SharePoint
Microsoft Teams
Microsoft To Do
OneDrive
Outlook
Visual Studio Code
Word、Excel、PowerPoint

サポートされているリソース

Apple プラットフォームのトークン保護を使用して、次のリソースを保護できます。

  • エクスチェンジ・オンライン
  • SharePoint オンライン
  • Microsoft Teams

既知の制限事項

  • トークン保護には現在、Microsoft Enterprise シングル サインオン (SSO) プラグインが必要です。これには Mobile デバイス管理 (MDM) が必要です。 現時点では、アンマネージド iOS および macOS デバイスはサポートされていません。
  • Apple のネイティブメールアプリとカレンダーアプリは、トークン保護をサポートしていません。 ポリシーが適用されると、ユーザーはトークン保護によって保護されたリソースへのアクセスをブロックされます。
  • レポート専用モードでは、ハードウェアベースのデバイス登録を使用しない要求は、ユーザーがハードウェアベースのデバイス登録へのアップグレードの対象である場合でも、非準拠として表示されます。 サインイン ログと状態コードを使用して、真の準備状況を評価します。 「ログとメトリックを使用した準備状況の確認」セクションを参照してください。
  • トークン保護 – サインイン ログの [サインイン セッション] 列には、ハードウェアに基づくデバイス ID を持たないすべての要求が "Unbound" と表示されます。これらのログには、登録をアップグレードする資格があるユーザーからの要求が含まれます。
  • ホーム テナントでトークン保護デバイスの登録要件を満たす外部ユーザーがサポートされています。 これらの要件を満たしていないユーザーには、根本原因が明確に示されていないエラーメッセージが表示されます。

Apple プラットフォームでトークン保護を有効にする方法

Windowsとは異なり、Apple プラットフォームではトラステッド プラットフォーム モジュール (TPM) は使用されません。 代わりに、Microsoft Entra IDは Apple Secure Enclave を使用して所有証明キーを格納します。 セキュリティで保護されたエンクレーブのない macOS デバイス (たとえば、一部の古い Mac ミニ モデル) では、Microsoft Entra ID Apple キーチェーン (データ保護キーチェーン) の拡張バージョンにフォールバックします。

この違いは、ユーザーがトークン保護の適用をサポートする方法でデバイスを登録する前に、いくつかの前提条件の構成が必要であることを意味します。

Apple プラットフォームでトークン保護を有効にする手順の概要は次のとおりです。

  1. ハードウェアベースのデバイス登録を構成する
  2. レポートのみの条件付きアクセス ポリシーを構成する
  3. ログとメトリックを使用して準備状況を確認する
  4. ポリシーを適用する

ハードウェアベースのデバイス登録を構成する

デプロイする プラットフォームごとに 、次の手順を実行します。 ユーザーがデバイスを登録する 前に 、これらの手順を完了する必要があります。

これらの手順が完了する前にデバイスを登録したユーザーは、トークン保護ポリシーによって保護されたリソースに初めてアクセスする際に、資格情報の入力を求められます。 認証が正常に完了すると、デバイスの登録はハードウェアベースのストレージに自動的にアップグレードされます。 詳細については、「 デバイスの登録のアップグレード」を参照してください。

  1. Apple App Store からMicrosoft Authenticatorをインストールするか、MDM ソリューションを使用して展開します。 Authenticator は、Microsoft Entra サインインの認証ブローカーとして機能します。
  2. Apple Devices 用 Microsoft Enterprise SSO プラグインを使用して、ハードウェアベースの登録を有効にします。

レポート専用モード ポリシーを構成する

ポリシーを適用する前に、レポート専用モードでポリシーを展開して効果を評価し、準拠していないサインイン セッションを特定します。

  1. Microsoft Entra管理センターに少なくとも条件付きアクセス管理者としてサインインします。
  2. Entra ID>Conditional Access>Policies に移動します。
  3. ポリシーの名前を設定してください。 ポリシーの名前にわかりやすい標準を作成します。
  4. [ 割り当て] で、[ ユーザー、エージェント、またはワークロード ID] を選択します
    1. [ 含める] で、対象となるユーザーまたはグループを選択します。
    2. [ 除外] で、[ ユーザーとグループ ] を選択し、組織の緊急アクセス用またはブレイクグラスアカウントを選択します。
  5. [ターゲット リソース] で>リソース (旧称クラウド アプリ)>含める>リソースを選択
    1. [ 選択] で、次のアプリケーションを選択します。

      1. Office 365 Exchange Online
      2. Office 365 SharePoint オンライン

      Warnung

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

    2. を選択し、を選択してください。」

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

        Warnung

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

      2. [先進認証クライアント] で、[ モバイル アプリとデスクトップ クライアント] のみを選択します。 その他の項目はオフのままにします。

      3. 完了を選択します。

  7. [ アクセス制御>Session] で、[ サインイン セッションにトークン保護が必要] を選択し、[選択] を 選択します
  8. 設定を確認し、 [ポリシーの有効化][レポート専用] に設定します。
  9. [作成] を選択して、ポリシーを有効化します。

ヒント

トークン保護を必要とする条件付きアクセス ポリシーは現在、Windowsデバイスと Apple デバイスでのみ使用できるため、攻撃者が別のプラットフォームから来ているように見える場合は、潜在的なポリシー バイパスから環境を保護する必要があります。

さらに、次のポリシーを構成する必要があります。

ログとメトリックを使用して準備状況を確認する

レポートのみのポリシーが設定され、実行されたら、Policy の影響を確認し、サインイン ログを分析し、Log Analytics を使用してinvestigate して適用の準備状況を確認する必要があります。

サインイン ログ

管理センターでトークン保護関連のサインイン イベントを表示するには:

  1. Microsoft Entra管理センターに少なくとも条件付きアクセス管理者としてサインインします。
  2. Entra ID>に移動し、モニタリングとヘルス>のサインイン ログを参照します。
    • トークン保護 - サインイン セッション状態コード列をビューに追加して、関連するサインイン イベントをすばやく表示します。
  3. 調査中のサインイン イベントを選択します。
  4. (ポリシーの状態に応じて) [条件付きアクセス ] タブと [ レポート専用 ] タブを確認し、トークン保護ポリシーを選択します。
  5. [ セッション制御] で、 ポリシー要件が満たされているかどうかを確認します。
  6. [ 基本情報 ] タブを選択し、[ トークン保護 - サインイン セッション ] フィールドで詳細を確認します。

サインイン ログには、要求がデバイス バインド トークンを使用するかどうかを示す tokenProtectionStatusDetails プロパティが含まれます。

"tokenProtectionStatusDetails": {
  "signInSessionStatus": "bound | unbound",
  "signInSessionStatusCode": <code>
}

トークン保護ポリシーが適用される前にMicrosoft Entra IDに登録されたデバイス上のユーザーは、ポリシーが適用されると、再認証を求められます。 デバイス登録の 1 回限りアップグレードを完了してから、もう一度サインインしてリソースにアクセスする必要があります。 これらのユーザーは、 状態コード 1003 と 1004 で識別できます。 この状態のユーザーは自己修復できるため、ポリシー適用の対象となります。

ポリシーを適用できるユーザーを特定するには、次の状態コードを参照してください。

状態コード 説明 必要な操作
1002 Unbound - Microsoft Entra ID デバイスの状態がないため、要求がバインド解除されています ユーザーがデバイスを登録する必要がある
1003 非バインド - セキュリティで保護された資格情報で登録されていないデバイス (レガシ登録) ユーザーが 1 回限り登録アップグレードを実行する必要がある
1004 未固定 - デバイス登録はハードウェアによって支援されていない ユーザーが 1 回限り登録アップグレードを実行する必要がある
1005 非連結 - 未指定の理由 場合により異なる
1006 Unbound - このOSバージョンはサポートされていません ユーザーが OS をアップグレードする必要がある
1007 非バインド - ハードウェアに基づくものではありません。サインインしているユーザーが登録済みのデバイス所有者ではない ユーザーは再登録する必要があります。または、登録済みの所有者がアップグレードを実行する必要があります
1008 非バインド - クライアントが ID ブローカーを使用しない クライアントがプラットフォーム ブローカーと統合されていないか、ブローカー アプリがデバイスにインストールされていないため、要求はバインドされていません。

ユーザー アクションに準拠している要求またはアップグレード可能な要求を特定するには、次の条件をフィルター処理します。

  • signInSessionStatus == bound、または
  • signInSessionStatussignInSessionStatusCode が 1003 または 1004 でバインドされていない

サンプル Microsoft Graph クエリ (非対話型サインイン): GET https://graph.microsoft.com/beta/auditLogs/signIns?$filter=(signInEventTypes/any(t: t eq 'nonInteractiveUser') and (tokenProtectionStatusDetails/signInSessionStatusCode eq 1003 or tokenProtectionStatusDetails/signInSessionStatusCode eq 1004 or tokenProtectionStatusDetails/signInSessionStatus eq 'bound'))

Log Analytics

Log Analyticsを使用して、トークン保護の強制エラーが原因でブロックされた要求の対話型サインイン ログと非対話型サインイン ログに対してクエリを実行することもできます。

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

サンプル クエリ:

次のサンプル Log Analytics クエリでは、過去 7 日間の非対話型サインイン ログが検索され、BlockedAllowed 要求がApplicationで強調表示されています。

アプリケーション別の要求
// Per-app 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, TokenProtectionStatusDetails
| where ConditionalAccessPolicies != "[]"
| where ResourceDisplayName == "Office 365 Exchange Online"
    or ResourceDisplayName == "Office 365 SharePoint Online"
// Add UserPrincipalName if you want to filter to a specific user
// | 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 'Binding', 'Block', 'Allow')
| extend parsedBindingDetails = parse_json(TokenProtectionStatusDetails)
| extend bindingStatusCode = tostring(parsedBindingDetails["signInSessionStatusCode"])
| extend IsSelfRemediable = Result == "Block"
    and (bindingStatusCode == "1003" or bindingStatusCode == "1004")
| summarize by Id, UserPrincipalName, AppDisplayName, Result, IsSelfRemediable
| summarize Requests = count(),
    Users = dcount(UserPrincipalName),
    Allow = countif(Result == "Allow"),
    Block = countif(Result == "Block"),
    BlockSelfRemediable = countif(IsSelfRemediable == true),
    BlockedUsers = dcountif(UserPrincipalName, Result == "Block"),
    BlockedUsersSelfRemediable = dcountif(UserPrincipalName, IsSelfRemediable == true)
    by AppDisplayName
| extend PctAllowed = round(100.0 * Allow / (Allow + Block), 2)
| extend PctEnforceable = round(100.0 * (Allow + BlockSelfRemediable) / (Allow + Block), 2)
| project AppDisplayName, Requests, Users, Allow, Block,
    BlockSelfRemediable,
    BlockedUsers, BlockedUsersSelfRemediable,
    PctAllowed, PctEnforceable
| sort by Requests desc

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

ユーザーによる要求

次のクエリでは、過去 7 日間の非対話型サインイン ログが検索され、ユーザーによる ブロック要求許可された 要求が強調表示されます。

// Per-user 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, TokenProtectionStatusDetails
| where ConditionalAccessPolicies != "[]"
| where ResourceDisplayName == "Office 365 Exchange Online"
    or ResourceDisplayName == "Office 365 SharePoint Online"
// Add UserPrincipalName if you want to filter to a specific user
// | 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 'Binding', 'Block', 'Allow')
| extend parsedBindingDetails = parse_json(TokenProtectionStatusDetails)
| extend bindingStatusCode = tostring(parsedBindingDetails["signInSessionStatusCode"])
| extend IsSelfRemediable = Result == "Block"
    and (bindingStatusCode == "1003" or bindingStatusCode == "1004")
| summarize by Id, UserPrincipalName, AppDisplayName, ResourceDisplayName, Result, IsSelfRemediable
| summarize Requests = count(),
    Allow = countif(Result == "Allow"),
    Block = countif(Result == "Block"),
    BlockSelfRemediable = countif(IsSelfRemediable == true)
    by UserPrincipalName, AppDisplayName, ResourceDisplayName
| extend PctAllowed = round(100.0 * Allow / (Allow + Block), 2)
| extend PctEnforceable = round(100.0 * (Allow + BlockSelfRemediable) / (Allow + Block), 2)
| project UserPrincipalName, AppDisplayName, ResourceDisplayName,
    Requests, Allow, Block, BlockSelfRemediable,
    PctAllowed, PctEnforceable
| sort by UserPrincipalName asc

次のクエリ例では、過去 7 日間の非対話型サインイン ログを調べます。デバイスを使用しているユーザーが強調表示されています。デバイスの状態Microsoft Entra IDトークン保護 CA ポリシーの要件を満たしていません。

デバイスがポリシー要件を満たしていない

次のクエリでは、過去 7 日間の非対話型サインイン ログを検索して、デバイスがトークン保護ポリシー要件を満たせず、デバイス登録アップグレードの候補であるユーザーを特定します。 このクエリは、レポートのみのフェーズで役立ちます。 状態コード 1003 と 1004 を持つ識別されたユーザーは、ポリシーが適用されるときに 1 回限りの登録アップグレードを求められます。これにより、変更を事前に伝達したり、適用前にガイダンスを提供したりできます。

AADNonInteractiveUserSignInLogs
// Adjust the time range below
| where TimeGenerated > ago(7d)
| where TokenProtectionStatusDetails != ""
| extend parsedBindingDetails = parse_json(TokenProtectionStatusDetails)
| extend bindingStatus = tostring(parsedBindingDetails["signInSessionStatus"])
| extend bindingStatusCode = tostring(parsedBindingDetails["signInSessionStatusCode"])
// Status code 1003: legacy registration — user can self-remediate with a one-time upgrade
// Status code 1004: not hardware-backed — user can self-remediate with a one-time upgrade
| where bindingStatusCode == "1003" or bindingStatusCode == "1004"
| summarize count() by UserPrincipalName

ポリシーを適用する

サインイン ログ データを確認し、対象のユーザーとデバイスの準備ができていることを確認したら、[ ポリシーの有効化] トグルを [レポートのみ] から [オン] に移動します。

影響を受けるユーザーとヘルプ デスク チームに変更を事前に伝えます。特に次のことにご了承ください。

  • デバイス登録のアップグレードを求めるメッセージが表示されるユーザー。
  • Apple のネイティブメールおよびカレンダー アプリのユーザー。ブロックされます。

エンド ユーザー エクスペリエンス

トークン保護をデプロイするときに注意する必要があるエンド ユーザー エクスペリエンスがいくつかあります。

デバイスの登録をアップグレードする

トークン保護ポリシーが適用される前にMicrosoft Entra IDに登録されたデバイス上のユーザーは、ポリシーが適用されると、再認証を求められます。 リソースにアクセスするには、もう一度サインインする必要があります。

デバイスが登録または登録されていない場合のトークン保護エラー メッセージのスクリーンショット。

サポートされていないアプリケーション

トークン保護ポリシーが有効になっている場合、サポートされているアプリケーションを使用していないユーザーは、認証後に次の画面が表示されます。

トークン保護ポリシーによってアクセスがブロックされたときのエラー メッセージのスクリーンショット。