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

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

适用于: Windows 10 - 所有版本、Windows Server 2019、Windows Server 2016、Windows Server 2012 R2
原始 KB 编号: 327825

症状

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

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

注意

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

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

原因

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

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

令牌具有固定的最大大小 (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 信息服务器 (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 ,它也会失败。