令牌保护部署指南 - Windows

本指南介绍在 Windows 平台上部署和实施令牌保护功能所需的步骤,以确保登录会话令牌的安全性。

有关令牌保护和受支持的平台的概述,请参阅Microsoft Entra条件访问中的 Token 保护。 建议在使用此部署指南之前查看概述文档。

先决条件

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

支持的应用程序和资源

在强制实施策略之前,请确保用户正在运行受支持的最新版本客户端。 旧版本或不受支持的版本可能不兼容,可以阻止。

应用程序

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

  • Exchange PowerShell 模块
  • Microsoft 365 Copilot
  • Microsoft Edge(仅支持登录 Edge 个人资料)*
  • Microsoft Graph PowerShell 使用 EnableLoginByWAM 选项
  • Microsoft Loop
  • Microsoft Teams
  • 微软待办
  • OneNote(微软笔记应用)
  • OneDrive
  • 展望
  • Power BI桌面
  • 适用于 Excel 的 PowerQuery 扩展(仅适用于 当前频道上的用户)
  • Visual Studio Code
  • 使用“Windows身份验证代理”登录选项时的Visual Studio
  • Windows 应用程序
  • Word、Excel、PowerPoint

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

资源

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

  • Exchange 在线版
  • SharePoint Online
  • Microsoft Teams
  • Azure 虚拟桌面
  • Windows 365

已知的限制

  • 不支持 Office 永久客户端。
  • 访问 Exchange 和SharePoint时,以下应用程序不支持使用受保护的令牌流登录,并且用户会被阻止:
    • 访问 SharePoint 的 PowerShell 模块
    • 适用于不在当前频道更新中的用户的 PowerQuery 扩展
    • 用于访问 Exchange 或 SharePoint 的 Visual Studio Code 扩展
  • 不支持以下Windows客户端设备:
    • Surface Hub
    • 基于 Windows 的 Microsoft Teams 会议室(MTR)系统
  • 满足主租户中令牌保护设备注册要求的外部用户将得到支持。 但是,不符合这些要求的用户会看到一条不明原因的错误消息,且无法指出问题所在。
  • 不支持使用以下方法向 Microsoft Entra ID 注册的设备:

若要识别由于前面列出的注册类型不受支持而受影响的设备,请检查 tokenProtectionStatusDetails 登录日志中的属性。 由于设备注册类型不受支持而被阻止的令牌请求,可以通过 signInSessionStatusCode 值为 1003 进行标识。

为防止在加入过程中出现中断,您可以通过添加设备筛选条件,排除先前描述的部署类别中的设备,来修改令牌保护的条件访问策略。 例如,若要排除:

  • 已建立 Microsoft Entra 联接的云电脑,可以使用 systemLabels -eq "CloudPC" and trustType -eq "AzureAD"
  • 已建立 Microsoft Entra 联接的 Azure 虚拟桌面,可以使用 systemLabels -eq "AzureVirtualDesktop" and trustType -eq "AzureAD"
  • 在已加入Microsoft Entra的Power Automate托管计算机组中,您可以使用 systemLabels -eq "MicrosoftPowerAutomate" and trustType -eq "AzureAD"
  • 通过自部署模式部署的 Windows Autopilot 设备,可以使用 enrollmentProfileName 属性。 例如,如果在 Intune 中为 Autopilot 自我部署模式设备创建了注册配置文件作为“Autopilot 自部署配置文件”,则可以使用 enrollmentProfileName -eq "Autopilot self-deployment profile"
  • Azure 中已建立 Microsoft Entra 联接的 Windows 虚拟机,可以使用 profileType -eq "SecureVM" and trustType -eq "AzureAD"

如何在Windows上启用令牌保护

对于用户来说,在已注册设备和兼容应用程序上使用兼容客户端平台时,用于强制实施令牌保护的条件访问策略的部署应该是不可见的。

若要最大程度地减少因应用或设备不兼容而导致用户中断的可能性,请遵循以下建议:

  • 从一组试点用户开始,并随着时间推移而扩展。
  • 在强制实施令牌保护之前,在 仅报告模式下 创建条件访问策略。
  • 捕获交互式和非交互式身份验证日志。
  • 分析这些日志的时间足够长,足以涵盖正常的应用程序使用。
  • 将已知可靠用户添加到强制策略。

此过程有助于评估用户的客户端和应用兼容性,以便强制实施令牌保护。

创建条件访问策略

执行专用角色的用户(如 特权访问安全级别 中所述的用户)可能是此功能的目标。 建议先通过一小部分开展试点。

以下步骤可帮助你创建条件访问策略,以要求在 Windows 设备上为 Exchange Online 和 SharePoint Online 提供令牌保护。

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

      1. Office 365 Exchange Online
      2. Office 365 SharePoint Online
      3. Microsoft Teams 服务
      4. 如果在您的环境中部署了 Windows 应用程序,请包括如下内容:
        1. Azure 虚拟桌面
        2. Windows 365
        3. Windows 云登录

      警告

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

    2. 选择 选择

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

        警告

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

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

      3. 选择完成

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

确认设置后,使用策略影响模式或仅报告模式,将“启用策略”开关从 “仅报告” 切换到 “打开”

小窍门

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

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

捕获日志并进行分析

使用 策略影响登录日志Log Analytics 等功能,监视条件访问在强制实施令牌保护前后的情况。

登录日志

使用 Microsoft Entra 登录日志,在仅报告模式或启用模式下验证令牌保护强制策略的结果。

显示策略未满足的示例的屏幕截图。

  1. 至少以条件访问管理员的身份登录到Microsoft Entra 管理中心
  2. 浏览到 Entra ID>监控和运行状况>登录日志
  3. 选择特定请求以确定是否已应用策略。
  4. 根据状态转到“条件访问”或“仅报告”窗格,然后选择需要进行令牌保护的策略名称。
  5. “会话控制” 下,检查是否满足策略要求。
  6. 若要查找有关请求绑定状态的更多详细信息,请选择窗格 “基本信息 ”,并查看字段 “令牌保护 - 登录会话”。 可能的值为:
    1. 绑定:请求使用绑定协议。 某些登录可能包括多个请求,并且所有请求都必须绑定以满足令牌保护策略。 即使单个请求似乎已绑定,如果其他请求未绑定,也不会确保符合策略。 若要查看登录的所有请求,可以筛选特定用户的所有请求或按 corelationid 查找。
    2. 未绑定:请求未使用绑定协议。 请求未绑定时可能的 statusCodes 为:
      1. 1002:由于缺少 Microsoft Entra ID 设备状态,请求处于未绑定状态。
      2. 1003:请求未绑定,因为Microsoft Entra ID 设备状态不符合令牌保护的条件访问策略要求。 此错误可能是由于设备注册类型不受支持,或者未使用全新登录凭据注册设备。
      3. 1005:由于其他未指定的原因,请求被解除绑定。
      4. 1006:请求未绑定,因为 OS 版本不受支持。
      5. 1008:请求未绑定,因为客户端未与平台代理集成,例如Windows帐户管理器(WAM)。

显示示例登录的屏幕截图,其中突出显示了“令牌保护 - 登录会话”属性。

注释

登录日志输出:在 2023 年 6 月下旬,enforcedSessionControlssessionControlsNotSatisfied 中使用的字符串的值从 Binding 变为 SignInTokenProtection。 应更新登录日志数据的查询,以反映此更改。 示例涵盖了这两个值以包含历史数据。

Log Analytics

还可以使用 Log Analytics 查询登录日志(交互式和非交互式),以查询由于令牌保护强制失败而被阻止的请求。 这些查询只是示例,可能会发生更改。

示例查询

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

按应用程序发出的请求
//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" or ResourceDisplayName =="Azure Virtual Desktop" or ResourceDisplayName =="Windows 365" or ResourceDisplayName =="Windows Cloud Login"
| 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, 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 

此查询的结果应类似于以下屏幕截图:

包含寻求令牌保护策略的 Log Analytics 查询示例结果的截图。

以下查询示例查看了过去 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" or ResourceDisplayName =="Azure Virtual Desktop" or ResourceDisplayName =="Windows 365" or ResourceDisplayName =="Windows Cloud Login"
| 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   

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

设备不满足策略要求
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"]) 
| where bindingStatusCode == 1003 
| summarize count() by UserPrincipalName 

最终用户体验

启用令牌保护要求时,注册或注册其支持设备的用户在令牌保护支持的应用程序中的登录体验没有任何差异。

尚未注册或注册其设备的用户,如果已启用令牌保护策略,身份验证后会显示以下屏幕截图。

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

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

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

什么是主刷新令牌?