令牌保护部署指南 - Apple 平台(预览版)

本指南介绍在 Apple 平台(iOS、iPadOS 和 macOS)上部署和强制实施登录会话令牌保护所需的步骤。 Apple 平台上的令牌保护目前为预览版。

在使用此部署指南之前,请查看 Microsoft Entra 条件访问中的 Token Protection,了解功能和受支持的平台的概述。

重要

Apple 的本机邮件和日历应用不支持令牌保护。 强制实施策略时,将阻止用户访问受令牌保护保护的资源。 在部署之前,将此行为传达给受影响的用户。

先决条件

使用此功能需要 Microsoft Entra ID P1 许可证。 若要查找适合你的要求的许可证,请参阅 Microsoft Entra ID 的通用可用功能比较

支持的应用程序和资源

Apple 平台上的令牌保护涵盖以下应用程序和资源。 在执行策略之前,请查看这些列表。

应用程序

令牌保护可以应用于以下应用程序。

应用程序 iOS/iPadOS macOS
Intune 公司门户
Microsoft Authenticator
Microsoft Edge(仅支持登录 Edge 个人资料)*
Microsoft Loop
Microsoft OneNote
Microsoft SharePoint
Microsoft Teams
微软待办
OneDrive
展望
Visual Studio Code
Word、Excel、PowerPoint

*令牌保护目前仅支持本机应用程序。 不支持基于浏览器的应用程序。

支持的资源

Apple 平台上的令牌保护可用于保护以下资源:

  • Exchange 在线版
  • SharePoint Online
  • Microsoft Teams

已知限制

  • 令牌保护当前需要 Microsoft Enterprise 单一登录(SSO)插件,而这需要移动设备管理(MDM)。 目前不支持非托管 iOS 和 macOS 设备。
  • Apple 的本机邮件和日历应用不支持令牌保护。 强制实施策略时,将阻止用户访问受令牌保护保护的资源。
  • 在仅报告模式下,不使用硬件支持的设备注册的请求显示为不符合要求,即使用户有资格升级到硬件支持的设备注册。 使用登录日志和状态代码来评估真正的就绪情况。 请参阅 “使用日志和指标查看就绪情况 ”部分。
  • 登录日志中的“令牌保护 - 登录会话” 列显示所有没有硬件支持的设备标识的请求为“未绑定”。这些日志包括有资格升级注册的用户发出的请求。
  • 满足主租户中令牌保护设备注册要求的外部用户将得到支持。 不符合这些要求的用户将看到错误消息,没有明确指示根本原因。

如何在 Apple 平台上启用令牌保护

与Windows不同,Apple 平台不使用受信任的平台模块(TPM)。 相反,Microsoft Entra ID使用 Apple Secure Enclave 来存储所有权证明密钥。 在没有安全隔区的 macOS 设备上(例如,一些较旧的 Mac mini 模型),Microsoft Entra ID 回退到 Apple 密钥链(数据保护密钥链)的增强版本。

这种差异意味着,用户必须先进行一些先决条件配置,然后才能以支持令牌保护强制实施的方式注册设备。

在 Apple 平台上启用令牌保护的高级步骤如下所示:

  1. 配置硬件支持的设备注册
  2. 配置仅限报告的条件访问策略
  3. 使用日志和指标查看就绪情况
  4. 强制实施策略

配置硬件支持的设备注册

针对您要部署到的每个平台,完成以下步骤。 在用户注册其设备 之前 ,必须完成这些步骤。

注释

在完成这些步骤之前注册其设备的用户将在首次访问受令牌保护策略保护的资源时提示输入其凭据。 成功完成身份验证后,他们的设备注册会自动升级到硬件支持的存储。 有关详细信息,请参阅 升级设备注册

  1. 从 Apple App Store 安装Microsoft Authenticator,或通过 MDM 解决方案部署它。 Authenticator 充当Microsoft Entra登录的身份验证代理。
  2. 使用 适用于 Apple 设备的 Microsoft Enterprise SSO 插件启用硬件支持的注册。
  3. 设置use_most_secure_storage标志。
    • 该标志仅适用于配置标志后进行的新设备注册。
    • 对于已注册 Intune 的设备,该标志也适用于通过 Intune Company Portal 应用进行的注册,甚至在设备成为 MDM 管理之前。
    • 对于所有其他注册,该标识仅在设备由 MDM 管理且 Microsoft 企业 SSO 插件配置文件处于活动状态后生效。

配置仅报告模式策略

在强制实施策略之前,请将其部署在仅报告模式下,以评估效果并识别不符合的登录会话。

  1. 至少以条件访问管理员的身份登录到Microsoft Entra 管理中心
  2. 搜索 Microsoft Entra 条件访问
  3. 浏览到 策略
  4. 为策略指定名称。 建议组织为其策略的名称创建有意义的标准。
  5. “分配”下,选择“ 用户”、“代理”或“工作负荷标识”。
    1. “包括”下,选择要面向的用户或组。
    2. 在“排除”下,选择“用户和组”,并选择组织的紧急访问或不受限帐户
  6. 在“目标资源”>“资源(以前为云应用)”>“包括”>“选择资源”下
    1. “选择”下,选择以下应用程序:

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

      警告

      应仅为这些应用程序配置条件访问策略。 选择 Office 365 应用程序组可能会导致意外失败。 此更改是一般规则的例外,即应在条件访问策略中选择 Office 365 应用程序组。

    2. 选择 选择

  7. 在“条件”下,执行以下操作:
    1. 在“设备平台”下:
      1. 将“配置”设置为“是”。
      2. 包括>选择设备平台>iOSmacOS
      3. 选择完成
    2. 在“客户端应用”下:
      1. 将“配置”设置为“是”。

        警告

        未配置 客户端应用 条件,或者选择 “浏览器 ”可能会导致使用 MSAL.js的应用程序(如 Teams Web)被阻止。

      2. 在“新式身份验证客户端”下,仅选择 “移动应用”和“桌面客户端”。 将其他项目保留为未选中状态。

      3. 选择完成

  8. 在“访问控制”>“会话”下面,选择“要求对登录会话使用令牌保护”,然后选择“选择”。
  9. 确认设置,然后将“启用策略”设置为“只限报告”
  10. 选择“ 创建 ”以启用策略。

小窍门

由于需要令牌保护的条件访问策略目前仅适用于Windows和 Apple 设备,因此当攻击者可能似乎来自其他平台时,必须保护环境免受潜在的策略绕过。

此外,还应配置以下策略:

使用日志和指标查看就绪情况

在仅报告策略到位并运行后,应查看策略影响,分析登录日志,并使用Log Analytics审查执行准备情况。

登录日志

若要查看管理中心中与令牌保护相关的登录事件,请执行以下作:

  1. 至少以条件访问管理员的身份登录到Microsoft Entra 管理中心
  2. 浏览到 Entra ID>监控和运行状况>登录日志
    • 令牌保护 - 登录会话状态代码 列添加到视图,以便快速查看相关的登录事件。
  3. 选择您正在研究的登录事件。
  4. 查看 条件访问仅报告 选项卡(具体取决于策略状态),并选择令牌保护策略。
  5. “会话控制” 下,检查是否满足策略要求。
  6. 选择“ 基本信息 ”选项卡并选中 “令牌保护 - 登录会话 ”字段了解详细信息。

登录日志包括一个 tokenProtectionStatusDetails 属性,该属性指示请求是否使用设备绑定令牌。

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

注释

强制实施令牌保护策略之前注册到Microsoft Entra ID的设备上的用户将提示重新进行身份验证。 他们需要完成一次性设备注册升级,然后再次登录以访问资源。 这些用户可以通过 状态代码 1003 和 1004 进行标识。 由于处于此状态的用户可以自行修正,因此他们有资格实施策略。

若要确定可向其应用策略的用户,请参阅以下状态代码。

状态代码 说明 需要采取行动
1002 未绑定 - 由于设备没有Microsoft Entra ID状态,请求未受约束。 用户必须注册设备
1003 未绑定 - 未使用安全凭据注册的设备(旧版注册) 用户必须执行一次性注册升级
1004 未绑定 - 设备注册不受硬件支持 用户必须执行一次性注册升级
1005 未绑定 - 原因未指定 多种多样
1006 未绑定 - 不支持 OS 版本 用户必须升级 OS
1007 未绑定 - 不受硬件支持;已登录用户不是已注册的设备所有者 用户必须重新注册,或者已注册的所有者必须执行升级
1008 未绑定 - 客户端不使用身份代理 请求未绑定,因为客户端未与平台中转站应用集成,或未在设备上安装中转站应用。

要识别符合要求或可通过用户操作升级的请求,请筛选以下条件:

  • signInSessionStatus == bound,或
  • signInSessionStatus == 未 signInSessionStatusCode 绑定 1003 或 1004

示例Microsoft Graph查询(非交互式登录):GET https://microsoftgraph.chinacloudapi.cn/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 查询由于令牌保护实施失败而导致请求被阻止的交互式和非交互式登录日志。

以下示例查询将搜索过去七天的非交互式登录日志,并按应用程序突出显示 阻止允许 的请求。 这些查询只是示例,可能会更改。

示例查询

以下示例 Log Analytics 查询在过去七天内搜索非交互式登录日志,突出显示了按 应用程序分类的请求状态,包括已阻止已允许

按应用程序发出的请求
// 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 天的非交互式登录日志,其中突出显示了用户阻止允许的请求。

用户请求

以下查询搜索过去七天的非交互式登录日志,突出显示了用户 阻止 的请求与 允许 的请求。

// 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

以下查询示例查看过去七天的非交互式登录日志,其中突出显示了使用设备的用户,其中Microsoft Entra ID 设备状态不满足令牌保护 CA 策略要求。

设备不满足策略要求

以下查询在最近七天内搜索非交互式登录日志,以识别其设备不满足令牌保护策略要求且适合设备注册升级的用户。 此查询在仅报告阶段非常有用。 强制实施策略时,将提示具有状态代码 1003 和 1004 的已识别用户进行一次性注册升级,以便主动传达更改或提前提供指导。

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的设备上,系统会提示用户在实施策略后重新进行身份验证。 他们需要再次登录才能访问资源。

设备未注册或注册时令牌保护错误消息的屏幕截图。

不支持的应用程序

启用令牌保护策略后,未使用受支持的应用程序的用户将在身份验证后看到以下屏幕:

令牌保护策略阻止访问时错误消息的屏幕截图。