令牌保护(在行业中有时称为令牌绑定)尝试通过确保只能从预期设备使用令牌来减少使用窃取的令牌进行的攻击。 当攻击者能够通过劫持或重播来窃取令牌时,他们可以在令牌过期或吊销之前模拟其受害者。 令牌失窃被认为是一个相对罕见的事件,但由此造成的损害可能是巨大的。
令牌保护在令牌与接受令牌的设备(客户端密码)之间创建加密安全关联。 如果没有客户端密码,绑定令牌将毫无用处。 当用户在 Microsoft Entra ID 中注册 Windows 10 或更高版本的设备时,其主标识将会绑定到该设备。 这意味着:策略可以确保应用程序在请求访问资源时仅使用绑定的登录会话(或刷新)令牌,又称主刷新令牌 (PRT)。
重要
令牌保护目前为公共预览版。 有关预览版的详细信息,请参阅联机服务的通用许可条款。 通过此预览版,我们将支持创建条件访问策略,以要求对特定服务的登录令牌(刷新令牌)进行令牌保护。 我们在 Windows 设备上支持对通过桌面应用程序访问 Exchange Online 和 SharePoint Online 的条件访问中的登录令牌进行令牌保护。
重要
自首次公开预览版发布以来,令牌保护进行了如下更改:
登录日志输出:2023 年 6 月下旬,enforcedSessionControls 和 sessionControlsNotSatisfied 中使用的字符串值已从 Binding 更改为 SignInTokenProtection。 应更新对登录日志数据的查询来反映这一更改。
不再支持使用某些方法加入到 Microsoft Entra 的设备。 有关完整列表,请参阅 已知限制部分 。
错误代码更改:令牌保护条件访问策略错误代码从 53003 更改为530084,以更好地识别与令牌保护相关的错误。
使用此功能需要 Microsoft Entra ID P2 许可证。 要根据需要查找合适的许可证,请参阅比较 Microsoft Entra ID 的正式发布功能。
注意
令牌保护机制的实施是 Microsoft Entra ID 保护的一部分,并在正式发布时需要 Microsoft Entra ID P2 许可证。
以下设备和应用程序支持访问应用令牌保护条件访问策略的资源:
- 已加入 Microsoft Entra、已加入 Microsoft Entra 混合和已注册 Microsoft Entra 的 Windows 10 或更新版设备。 请参阅不受支持的设备类型的 已知限制部分 。
- 已建立混合 Microsoft Entra 联接的 Windows Server 2019 或更高版本。
- OneDrive 同步客户端版本 22.217 或更高版本
- Teams 本机客户端版本 1.6.00.1331 或更高版本
- Power BI Desktop 版本 2.117.841.0(2023 年 5 月)或更高版本
- Exchange PowerShell 模块版本 3.7.0 或更高版本
- 使用 Microsoft Graph PowerShell 版本 2.0.0 或更高版本,并启用 EnableLoginByWAM 选项
- Visual Studio 2022 或更高版本在使用“Windows 身份验证代理”登录选项时
- 不支持 Office 永久客户端。
- 以下应用程序不支持使用受保护的令牌流登录,并且在用户访问 Exchange 和 SharePoint 时会阻止用户:
- 访问 SharePoint 的 PowerShell 模块
- 适用于 Excel 的 PowerQuery 扩展
- 用于访问 Exchange 或 SharePoint 的 Visual Studio Code 的扩展
- 不支持以下 Windows 客户端设备:
- Surface Hub
- 基于 Windows 的 Microsoft Teams 会议室 (MTR) 系统
- 满足主租户中令牌保护设备注册要求的外部用户将得到支持。 但是,不符合这些要求的用户会看到一条不明原因的错误消息,且无法指出问题所在。
- 不支持使用以下方法向 Microsoft Entra ID 注册的设备:
- Microsoft Entra 已加入 Azure 虚拟桌面会话主机。
- 使用 批量注册部署的 Windows 设备。
- 已建立 Microsoft Entra 联接的由 Windows 365 部署的云电脑。
- 与 Microsoft Entra 联接的 Power Automate 托管计算机组。
- 使用 自部署模式部署的 Windows Autopilot 设备。
- 在 Azure 中使用虚拟机(VM)扩展部署的 Windows 虚拟机,启用了 Microsoft Entra ID 身份验证。
- 在 24H2 之前的 Windows 版本中,如果用户在注册时没有重新登录,新注册的 Microsoft Entra 设备 可能会被阻止。 如果被阻止,用户必须重新注册设备。
若要识别由于前面列出的注册类型不受支持而受影响的设备,请检查 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"
。 - Azure 中已建立 Microsoft Entra 联接的 Windows 虚拟机,可以使用
systemLabels -eq "AzureResource" and trustType -eq "AzureAD"
。
对于用户来说,在已注册设备和兼容应用程序上使用兼容客户端平台时,用于强制实施令牌保护的条件访问策略的部署应该是不可见的。
为了最大程度地降低因应用或设备不兼容而导致用户中断的可能性,我们强烈建议:
- 从试点用户组开始,并随着时间的推移扩展。
- 在移动到强制令牌保护之前,在仅报告模式下创建条件访问策略。
- 同时捕获交互式和非交互式登录日志。
- 分析这些日志足够长的时间,以涵盖正常的应用程序使用。
- 将已知的良好用户添加到强制策略。
此过程有助于评估用户的客户端和应用兼容性,以强制实施令牌保护。
执行特权访问安全级别中所述的专用角色的用户可能是此功能的目标。 建议先通过一小部分开展试点。
后续步骤可帮助创建条件访问策略,以要求对 Windows 设备上的 Exchange Online 和 SharePoint Online 进行令牌保护。
- 以条件访问管理员、安全管理员或全局管理员的身份登录到 Azure 门户。
- 浏览到“Microsoft Entra ID”“安全性”>“条件访问”。>
- 选择“创建新策略”。
- 为策略指定名称。 建议组织为其策略的名称创建有意义的标准。
- 在“分配”下,选择“用户或工作负载标识” 。
- 在“包括”下面,选择将要测试此策略的用户或组。
- 在“排除”下选择“用户和组”,然后选择组织的紧急访问帐户或不受限帐户。
- 在“目标资源”>“资源(以前为云应用)”>“包括”>“选择资源”下
在“选择”下,选择预览版支持的以下应用程序:
- Office 365 Exchange Online
- Office 365 SharePoint Online
警告
应仅为这些应用程序配置条件访问策略。 选择 Office 365 应用程序组可能会导致意外失败。 此更改是一般规则的例外,即应在条件访问策略中选择 Office 365 应用程序组。
选择“选择”。
- 在“条件”下,执行以下操作:
- 在“设备平台”下:
- 将“配置”设置为“是”。
- 依次选择“包括”>“选择设备平台”>“Windows”。
- 选择“完成” 。
- 在“客户端应用”下:
将“配置”设置为“是”。
警告
未设置客户端应用条件,或者将 浏览器 保持在选中状态,可能导致使用 MSAL.js的应用程序(例如 Teams Web)被阻止。
在“新式身份验证客户端”下面,仅选择“移动应用和桌面客户端”。 将其他项目保留为未选中状态。
选择“完成” 。
- 在“设备平台”下:
- 在“访问控制”>“会话”下面,选择“要求对登录会话使用令牌保护”,然后选择“选择”。
- 确认设置,然后将“启用策略”设置为“仅限报告”。
- 选择“创建”,以便创建启用策略所需的项目。
管理员在确认使用仅报告模式的设置后,可将“启用策略”切换开关从“仅报告”移至“开”。
提示
由于要求令牌保护的条件访问策略目前仅适用于 Windows 设备,因此当攻击者似乎来自其他平台时,必须保护环境免受潜在的策略绕过。
此外,还应配置以下策略:
使用策略影响(预览)、登录日志或 Log Analytics 等功能监视令牌保护实施前后的条件访问实施情况。
在“仅报告”模式或“已启用”模式下,使用 Microsoft Entra 登录日志验证令牌保护强制策略的结果。
- 最低以条件访问管理员身份登录到 Microsoft Entra 管理中心。
- 浏览到“标识”“监视和运行状况”>“登录日志”>。
- 选择特定请求以确定是否已应用策略。
- 根据状态转到“条件访问”或“仅报告”窗格,然后选择需要进行令牌保护的策略名称。
- 在“会话控制”下,检查以确认是否已满足策略要求。
- 若要查找有关请求绑定状态的更多详细信息,请选择窗格 “基本信息 ”,并查看字段 “令牌保护 - 登录会话”。 可能的值为:
- 绑定:请求使用绑定协议。 某些登录可能包括多个请求,并且所有请求都必须绑定以满足令牌保护策略。 即使单个请求似乎已绑定,如果其他请求未绑定,也不会确保符合策略。 若要查看登录的所有请求,可以筛选特定用户的所有请求或按 corelationid 查找。
- 未绑定:请求未使用绑定协议。 请求未绑定时可能的
statusCodes
为:- 1002:由于缺少 Microsoft Entra ID 设备状态,请求未绑定。
- 1003:请求未绑定,因为Microsoft Entra ID 设备状态不符合令牌保护的条件访问策略要求。 此错误可能是由于设备注册类型不受支持,或者未使用全新登录凭据注册设备。
- 1005:由于其他未指定的原因,请求被解除绑定。
- 1006:请求未绑定,因为 OS 版本不受支持。
- 1008:请求未绑定,因为客户端未与平台代理集成,例如 Windows 帐户管理器(WAM)。
还可以使用 Log Analytics 查询登录日志(交互式和非交互式),以查询由于令牌保护强制失败而被阻止的请求。
下面是搜索过去七天非交互式登录日志的示例 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
上一个查询的结果应类似于以下屏幕截图:
以下查询示例查看了过去 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
以下查询示例查看过去七天的非交互式登录日志,其中突出显示了使用设备的用户,其中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