当用户属于多个组时 Kerberos 身份验证的问题

本文可帮助解决当用户属于多个组时 Kerberos 身份验证失败的问题。

原始 KB 数: 327825

现象

属于大量安全组的用户进行身份验证时遇到问题。 进行身份验证时,用户可能会看到 HTTP 400 - 错误请求(请求标头过长)消息。 用户还无法访问资源,并且用户的组策略设置可能无法正确更新。

有关错误上下文的详细信息,请参阅 HTTP 400 错误请求(请求标头过长)对 HTTP 请求的响应。

注意

在类似情况下,Windows NTLM 身份验证按预期工作。 除非分析 Windows 行为,否则可能无法看到 Kerberos 身份验证问题。 但是,在这种情况下,Windows 可能无法更新组策略设置。

此行为发生在任何当前支持的 Windows 版本中。 有关当前支持的 Windows 版本的信息,请参阅 Windows 生命周期事实数据表

原因

用户无法进行身份验证,因为 Kerberos 生成的表示用户的票证不够大,无法包含所有用户的组成员身份。

作为身份验证服务 Exchange一部分,Windows 会生成一个令牌来表示用户进行授权。 此令牌(也称为授权上下文)包括用户的安全标识符(SID),以及用户所属的所有组的 SID。 它还包括存储在用户帐户 sIDHistory 属性中的任何 SID。 Kerberos 将此令牌存储在 Kerberos 票证获取票证(TGT)中的特权属性证书(PAC)数据结构中。 从 Windows Server 2012 开始,Kerberos 还会将令牌存储在 Kerberos 票证中的 Active Directory 声明信息(动态访问控制)数据结构中。 如果用户是大量组的成员,并且如果用户或正在使用的设备有许多声明,则这些字段可能会占用票证中的大量空间。

令牌的最大大小固定(MaxTokenSize)。 在为身份验证操作分配缓冲区时,传输协议(如远程过程调用(RPC)和 HTTP 依赖于 MaxTokenSize 该值。 MaxTokenSize 具有以下默认值,具体取决于生成令牌的 Windows 版本:

  • Windows Server 2008 R2 及更低版本,以及 Windows 7 及更低版本:12,000 字节
  • Windows Server 2012 及更高版本,以及 Windows 8 及更高版本:48,000 字节

通常,如果用户属于 120 多个通用组,则默认值 MaxTokenSize 不会创建足够大的缓冲区来保存信息。 用户无法进行身份验证,并且可能会收到 内存 不足的消息。 此外,Windows 可能无法为用户应用组策略设置。

注意

其他因素还影响最大组数。 例如,全局组和域本地组的 SID 的空间要求较小。 Windows Server 2012 及更高版本将声明信息添加到 Kerberos 票证,并压缩资源 SID。 这两个功能都改变了空间要求。

解决方法

若要解决此问题,请更新参与 Kerberos 身份验证过程的每台计算机上的注册表,包括客户端计算机。 我们建议更新所有基于 Windows 的系统,尤其是在用户必须跨多个域或林登录时。

重要

如果注册表修改不正确,可能会发生严重问题。 在修改注册表之前, 请备份注册表进行还原,以防出现问题。

在每个计算机上,将 MaxTokenSize 注册表项设置为更大的值。 可以在子项中找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters 此条目。 进行此更改后,计算机必须重启。

有关确定新值 MaxTokenSize的详细信息,请参阅 本文的“计算最大令牌大小 ”部分。

例如,请考虑使用依赖于 SQL Server 客户端的 Web 应用程序的用户。 在身份验证过程中,SQL Server 客户端会将用户的令牌传递到后端 SQL Server 数据库。 在这种情况下,需要在以下每台计算机上配置 MaxTokenSize 注册表项:

  • 运行 Internet Explorer 的客户端计算机
  • 运行 IIS 的 Web 服务器
  • SQL Server 客户端计算机
  • SQL Server 数据库计算机

在 Windows Server 2012(及更高版本)中,如果令牌大小通过特定阈值,Windows 可以记录事件(事件 ID 31)。 若要启用此行为,必须针对大型 Kerberos 票证配置计算机配置\管理模板\System\KDC\Warning 配置组策略设置

计算最大令牌大小

使用以下公式计算 Windows 为特定用户生成的令牌的大小。 此计算有助于确定是否需要更改 MaxTokenSize

TokenSize = 1200 + 40d + 8s

对于 Windows Server 2012(及更高版本),此公式按如下所示定义其组件:

  • 1200。Kerberos 票证的估计开销值。 此值可能会有所不同,具体取决于 DNS 域名的长度和客户端名称长度等因素。
  • d. 以下值的总和:
    • 用户帐户域外部的通用组中的成员身份数。
    • 存储在帐户 sIDHistory 属性中的 SID 数。 此值计算组成员身份和用户 SID。
  • s. 以下值的总和:
    • 用户帐户域中的通用组中的成员身份数。
    • 域本地组中的成员身份数。
    • 全局组中的成员身份数。

Windows Server 2008 R2 和早期版本使用相同的公式。 但是,这些版本将域本地组成员身份数视为 d 值的一部分,而不是 s 值。

如果 MaxTokenSize 值为 0x0000FFFF (64K),则也许可以缓冲大约 1600 个 d 类 SID 或大约 8000 s 类 SID。 但是,许多其他因素会影响可以安全使用 MaxTokenSize的值,包括:

  • 如果使用 受信任的委派 帐户,则每个 SID 需要两倍的空间。

  • 如果有多个信任,请将信任配置为筛选 SID。 此配置可减少 Kerberos 票证大小的影响。

  • 如果使用 Windows Server 2012 或更高版本,以下因素也会影响 SID 空间要求:

    • 有一个新方案用于压缩 PAC 中的 SID。 有关详细信息,请参阅 KDC 资源 SID 压缩。 此功能可减小票证中 SID 所需的大小。
    • 动态访问控制向票证添加 Active Directory 声明,从而增加了大小要求。 但是,使用 Windows Server 2012 文件服务器部署声明后,你可能希望逐步淘汰大量控制文件访问的组。 这种减少反过来可以减少票证所需的大小。 有关详细信息,请参阅动态访问控制:方案概述
  • 如果已将 Kerberos 配置为使用不受约束的委派,则必须将公式中的值加倍 TokenSize ,以获取有效的估计值 MaxTokenSize

    重要

    2019 年,Microsoft向 Windows 提供更新,这些更新更改了 Kerberos 禁用的未约束委派的默认配置。 有关详细信息,请参阅 Windows Server 中传入信任的 TGT 委派更新。

    由于广泛使用资源 SID 压缩,并且弃用了不受约束的委派, MaxTokenSize 因此 48000 或更大的委派应该足以满足所有方案。

影响 MaxTokenSize 的已知问题

MaxTokenSize值 48,000 字节应足以满足大多数实现。 这是 Windows Server 2012 及更高版本中的默认值。 但是,如果你决定使用更大的值,请查看本节中的已知问题。

  • LSA 访问令牌的大小限制为 1,010 个组 SID

    此问题与拥有过多组成员身份的用户无法进行身份验证类似,但管理问题的计算和条件不同。 例如,用户在使用 Kerberos 身份验证或 Windows NTLM 身份验证时可能会遇到此问题。 有关详细信息,请参阅 在属于 1,010 多个组的成员的用户帐户上登录可能会在基于 Windows Server 的计算机上失败。

  • 使用大于 48,000 的 MaxTokenSize 值时的已知问题

    为了缓解拒绝服务攻击途径,Internet Information Server (IIS) 使用 64 KB 的有限 HTTP 请求缓冲区大小。 作为 HTTP 请求的一部分的 Kerberos 票证编码为 Base64(6 位扩展为 8 位)。 因此,Kerberos 票证使用其原始大小的 133%。 因此,当 IIS 中的最大缓冲区大小为 64 KB 时,Kerberos 票证可以使用 48,000 个字节。

    如果将注册表项设置为 MaxTokenSize 大于 48000 字节的值,并且缓冲区空间用于 SID,则可能会出现 IIS 错误。 但是,如果将注册表项设置为 MaxTokenSize 48,000 字节,并且对 SID 和声明使用空间,则会发生 Kerberos 错误。

    有关 IIS 缓冲区大小的详细信息,请参阅 如何限制 IIS 从 Windows 2000 中的客户端接受的 HTTP 传输的标头大小。

  • 使用大于 65,535 的 MaxTokenSize 值时的已知问题

    本文的早期版本讨论了最多 100,000 字节的值 MaxTokenSize。 但是,我们发现,当 100,000 字节或更大时 MaxTokenSize ,SMS 管理员的版本出现问题。

    我们还确定,IPSEC IKE 协议不允许安全 BLOB 大于 66,536 字节,并且当设置为更大的值时 MaxTokenSize 也会失败。