检测和修正 Kerberos 中的 RC4 使用情况

Active Directory (AD) 环境中的 Kerberos 身份验证以前依赖于 RC4 加密算法。 RC4 是一种流密码,由于它与旧系统兼容,因此非常有用。 但是,RC4 现在被视为不安全,正在逐步淘汰。

本文介绍如何检测域中的 RC4 使用情况、审核仍依赖于 RC4 的设备和用户帐户,并采取措施修正使用情况,以支持更强大的加密类型或管理 RC4 依赖项。 使用这些说明为即将更改 Kerberos 默认值准备环境,并改进组织的安全状况。

总体而言,IT 管理员应执行以下操作,以为 Kerberos 对 RC4 支持的默认更改做好准备:

  1. 审核当前的 RC4 使用情况:使用本文中所述的审核工具和事件日志来识别仍在使用 RC4 的帐户、服务或设备。

  2. 解决旧版设备的问题:迁移或替换不支持的设备,尤其是运行 Windows Server 2003 或更早版本的设备,因为它们缺乏 AES-SHA1 支持。

  3. 禁用 RC4:尽可能显式禁用 RC4。

Windows 中的 RC4 使用情况及其风险

当帐户或设备不支持更强大的加密类型(如 AES-SHA1)时,通常会在 Windows 环境中使用 RC4。 RC4 的使用可能发生在旧系统、在引入 AES-SHA1 支持之前创建的帐户,或者在未显式配置加密设置时使用。 RC4 是默认加密类型,使其成为与旧基础结构兼容的常见选择。 但是,依赖 RC4 会使环境面临安全风险,其使用正积极逐步淘汰,以支持更安全的算法。

为了响应 CVE-2022-37966,2022 年 11 月 8 日或之后发布的 Windows 更新将 Kerberos 中的默认加密类型更改为使用高级加密标准 (AES)-SHA1,而不是针对未显式设置加密类型的帐户使用 RC4。 此更改导致 RC4 使用率显著减少,但默认情况下,不支持 AES-SHA1 的帐户仍使用 RC4。 有关详细信息,请参阅 KB5021131

此更新添加了设置注册表值以控制 Kerberos 中默认支持的加密类型的功能。 如果未设置此注册表值,则默认支持的加密类型为 DES、RC4 和 AES 会话密钥。

可以滥用 Kerberos RC4 默认加密类型来执行称为 Kerberoasting 的攻击方法,该方法以 Microsoft Active Directory 中的服务票证为目标。 在 Kerberoasting 中,攻击者捕获这些票证并脱机破解其加密,以窃取用户凭据,从而可能损害整个网络的安全性。 将 Kerberos 的加密类型更改为默认使用 AES-SHA1,而不是 RC4 有助于保护客户免受此攻击。

重要

Microsoft计划在 2026 年第二季度结束时禁用 RC4 用作 Active Directory 域控制器的默认加密类型。

先决条件

在开始之前,需要满足以下先决条件:

  • 需要有权访问域控制器上的安全事件日志,例如是 域管理员 组的成员或等效的成员。

  • 若要运行本文中的 PowerShell 命令和脚本,需要在运行命令的设备上安装 ActiveDirectory 模块

审核 RC4 使用情况

有关 RC4 使用情况的详细信息存储在 Windows Server 2019 及更高版本的 Kerberos 密钥分发中心 (KDC)上的安全事件日志中。 2025 年 1 月累积更新中,事件日志中的 RC4 用法也添加到 Windows Server 2016。 以下事件 ID 标识了 RC4 的使用情况以及仅能使用 RC4 的帐户:

RC4 使用情况的事件日志字段

在事件 ID 4768 和 4769 的每个条目中,有几个字段提供对帐户支持的加密类型以及用于票证的加密类型的见解。 下面是一个示例屏幕截图。 以下列表描述了这两个事件中的相关字段。

事件查看器的屏幕截图,其中显示了 Kerberos 事件 ID 4768 详细信息,包括加密类型和帐户信息。

  • 帐户信息和服务信息部分:

    • MSDS-SupportedEncryptionTypes:是一个 Active Directory 属性,表示帐户支持的加密类型。 如果没有为帐户定义 msDS-SupportedEncryptionTypes,KDC 将应用来自 DefaultSupportedEncryptionTypes 的值。 此字段有时称为 msds-SET

      此值是已处理的值,这意味着某些帐户在 AD 数据库中设置的值之外 msDS-SupportedEncryptionTypes 指定了额外的条件。 例如,在 Windows Server 2022 及更早版本上, msDS-SupportedEncryptionTypes 始终显示数据加密标准版(DES)和 RC4,以确保与较旧的域控制器兼容,而不考虑你的设置。 从 Windows Server 2025 开始,仅显示 AES-SHA1 和更强的算法。 如果这些安全主体的已处理值与 Active Directory 属性中的内容不完全匹配,则这是正常的。

      此字段仅在帐户查找期间填充。 帐户查找在 ID 为 4768 的事件期间填充帐户信息和服务信息,并在 ID 为 4769 的事件期间将其列出在服务信息中。 有关详细信息,请参阅 支持的加密类型位标志

    • 可用密钥:AD 中帐户可用的密钥。 密码使用显示的算法进行哈希处理。 此字段的人群受与msDS-SupportedEncryptionTypes相同的限制。 无论使用何种用法,都会显示 RC4。

  • “域控制器信息” 部分。 本部分还使用已处理的值,并遵循前面所述的相同指南

    • MSDS-SupportedEncryptionTypes:包括域控制器的msDS-SupportedEncryptionTypes

    • 帐户密钥:包括域控制器的帐户密钥。

  • 网络信息 部分:

    • Advertised Etypes:客户端计算机宣称支持用于当前操作的加密类型的枚举。
  • 其他信息 部分:

    • 会话加密类型:用于票证会话密钥的加密类型。

可以使用 msDS-SupportedEncryptionTypesAdvertized Etypes 字段来确定客户端或目标计算机是否不支持 AES-SHA1 或仅支持 RC4。

展开此部分以查看将加密类型映射到所用算法的表。
十进制值 十六进制值 支持的加密类型
0 0x0 未定义 - 默认为RC4_HMAC_MD5
1 0x1 DES_CBC_CRC
2 0x2 DES_CBC_MD5
3 0x3 DES_CBC_CRC,DES_CBC_MD5
4 0x4 RC4
5 0x5 DES_CBC_CRC,RC4
6 0x6 DES_CBC_MD5,RC4
7 0x7 DES_CBC_CRC、DES_CBC_MD5、RC4
8 0x8 AES 128
9 0x9 DES_CBC_CRC AES 128
10 0xA DES_CBC_MD5 AES 128
11 0xB DES_CBC_CRC、DES_CBC_MD5、AES 128
12 0xC RC4、AES 128
13 0xD DES_CBC_CRC、RC4、AES 128
14 0xE DES_CBC_MD5、RC4、AES 128
15 0xF DES_CBC_CRC、DES_CBC_MD5、RC4、AES 128
16 0x10 AES 256
17 0x11 DES_CBC_CRC, AES 256
18 0x12 DES_CBC_MD5,AES 256
19 0x13 DES_CBC_CRC、DES_CBC_MD5、AES 256
20 0x14 RC4、AES 256
21 0x15 DES_CBC_CRC、RC4、AES 256
22 0x16 DES_CBC_MD5、RC4、AES 256
23 0x17 DES_CBC_CRC、DES_CBC_MD5、RC4、AES 256
24 0x18 AES 128、AES 256
二十五 0x19 DES_CBC_CRC、AES 128、AES 256
26 0x1A DES_CBC_MD5、AES 128、AES 256
二十七 0x1B DES_CBC_CRC、DES_CBC_MD5、AES 128、AES 256
28 0x1C RC4、AES 128、AES 256
二十九 0x1D DES_CBC_CRC、RC4、AES 128、AES 256
30 0x1E DES_CBC_MD5、RC4、AES 128、AES 256
31 0x1F DES_CBC_CRC、DES_CBC_MD5、RC4-HMAC、AES128-CTS-HMAC-SHA1-96、AES256-CTS-HMAC-SHA1-96

展开此部分可查看将事件中的值映射到已颁发的票证的加密类型的表。
类型值 加密类型
0x1 DES_CBC_CRC
0x3 DES_CBC_MD5
0x11 AES128-CTS-HMAC-SHA1-96
0x12 AES256-CTS-HMAC-SHA1-96
0x17 RC4-HMAC
0x18 RC4-HMAC-EXP

有关更深入的 msDS-SupportedEncryptionTypes 加密类型和加密类型细分,请参阅我们的博客文章 解密支持的 Kerberos 加密类型的选择

使用 PowerShell 审核 RC4 使用情况

手动查看事件日志以识别 RC4 使用情况是一项繁琐的任务。 为了提高审核效率,可以下载两个 PowerShell 脚本来帮助:

  • List-AccountKeys.ps1 用于查询事件日志以枚举帐户的可用加密密钥。
  • Get-KerbEncryptionUsage.ps1 ,用于识别正在使用的 Kerberos 加密类型,以及 RC4 等特定算法的筛选选项。

Microsoft将这些脚本发布为开放源代码,Microsoft Kerberos-Crypto GitHub 存储库中提供这些脚本。 或者,还可以使用安全信息和事件管理(SIEM)解决方案(如 Microsoft Sentinel)或内置的 Windows 转发来识别 RC4 使用情况,如我们的博客文章中所述 ,因此,你认为已准备好强制实施适用于 Kerberos 的 AES?

  1. Microsoft Kerberos-Crypto GitHub 存储库下载列出的两个 PowerShell 脚本。

  2. 以域控制器上的管理员身份打开 PowerShell 会话,或使用用于管理域控制器的设备上的 Enter-PSSession cmdlet 进行远程连接。

  3. 使用以下命令运行脚本 List-AccountKeys.ps1 。 此脚本查询安全事件日志,并枚举其找到的帐户可用的密钥。

    .\List-AccountKeys.ps1
    

    在此示例输出中,可以看到事件发生的时间、帐户名称、帐户类型和帐户的密钥。 在这种情况下,可以看到 AES-SHA1 密钥可用,并且它们支持使用 AES-SHA1。

    Time                  Name         Type  Keys
    ----                  ----         ----  ----
    1/21/2025 2:00:10 PM  VM01$      Machine {RC4, AES128-SHA96, AES256-SHA96, AES128-SHA256...}
    1/21/2025 2:00:10 PM  AdminUser     User {RC4, AES128-SHA96, AES256-SHA96, AES128-SHA256...}
    1/21/2025 6:50:34 PM  VM01$      Machine {RC4, AES128-SHA96, AES256-SHA96, AES128-SHA256...}
    1/21/2025 6:50:34 PM  AdminUser     User {RC4, AES128-SHA96, AES256-SHA96, AES128-SHA256...}
    1/21/2025 6:50:34 PM  VM01$      Machine {RC4, AES128-SHA96, AES256-SHA96, AES128-SHA256...}
    
  4. 使用以下命令运行脚本 Get-KerbEncryptionUsage.ps1 。 此脚本查询相同的事件,以查看环境中发现的 Kerberos 用法。

    .\Get-KerbEncryptionUsage.ps1
    
    Time       : 1/21/2025 2:00:10 PM
    Requestor  : ::1
    Source     : AdminUser@CONTOSO.COM
    Target     : VM01$
    Type       : TGS
    Ticket     : AES256-SHA96
    SessionKey : AES256-SHA96
    
    Time       : 1/21/2025 2:00:10 PM
    Requestor  : 192.168.1.1
    Source     : AdminUser
    Target     : krbtgt
    Type       : AS
    Ticket     : AES256-SHA96
    SessionKey : AES256-SHA96
    

    此脚本包括特定算法的筛选选项,可针对 RC4 用法进行筛选,如以下示例所示:

    .\Get-KerbEncryptionUsage.ps1 -Encryption RC4
    

处理 RC4 用法的选项

如果发现仍使用 RC4,可以执行一些措施,具体取决于您使用 RC4 的原因。

用户帐户正在使用 RC4,因为它没有 AES-SHA1 密钥

如果在 Windows Kerberos 中支持 AES-SHA1 密钥之前创建了用户帐户,并且添加支持后从未重置密码,该帐户将缺少 AES-SHA1 密钥。 Windows Kerberos 中的 AES-SHA1 支持已在 Windows Server 2003 中添加。 更改帐户密码会生成这些密钥。

无需为 msDS-SupportedEncryptionTypes 没有服务主体名称(SPN)的用户帐户设置值。 设备的配置确定服务票证请求和会话密钥的加密类型。

处理后的 msDS-SupportedEncryptionTypes 值不包含 AES-SHA1 位数

如果已处理 msDS-SupportedEncryptionTypes 的值不包括 AES-SHA1,则可能是少数条件的结果。

  1. 案例: 源和/或目标计算机支持的加密类型不包括 AES-SHA1。 在这种情况下,请确认策略的配置并对其进行更新,使其包括 AES-SHA1。 可以通过 Active Directory 用户和计算机控制台中的帐户属性或使用 PowerShell 查看已配置的 msDS-SupportedEncryptionTypes

    • 对于 Active Directory 用户和计算机,请确保已启用 “高级功能 ”视图,然后打开计算机帐户的属性并导航到“ 属性编辑器 ”选项卡。查找 msDS-SupportedEncryptionTypes 属性:

      Active Directory 用户和计算机中的“属性编辑器”选项卡的屏幕截图,其中显示了 msDS-SupportedEncryptionTypes 属性。

    • 对于 PowerShell,请运行以下命令以检索 msDS-SupportedEncryptionTypes 属性。 请务必将 <computer account name> 替换为要检查的帐户的实际名称。

      $accountName = "<computer account name>"
      $parameters = @{
           Filter     = "Name -eq '$($accountName)' -and (ObjectClass -eq 'Computer' -or ObjectClass -eq 'User')"
           Properties = "msDS-SupportedEncryptionTypes"
      }
      
      Get-ADObject @parameters | FL "DistinguishedName","msDS-SupportedEncryptionTypes","Name","ObjectClass"
      

      下面是输出的示例。 msDS-SupportedEncryptionTypes该值以十进制而不是十六进制为单位,可以使用 RC4 使用情况的“事件日志”字段中提供的表进行转换。

      DistinguishedName             : CN=vm01,CN=Computers,DC=contoso,DC=com
      msDS-SupportedEncryptionTypes : 28
      Name                          : vm01
      ObjectClass                   : computer
      

    如果 AD 中未定义源和/或目标计算机的msDS-SupportedEncryptionTypes值,则 KDC 会回退到DefaultDomainSupportedEncTypes值,如第二种情况所述。

    若要确定最适合你的环境设置的值,建议阅读 Active Directory 强化系列 - 第 4 部分 - 为 Kerberos 强制实施 AES | Microsoft 社区中心。 找到适合环境的组合后,请重启计算机,并在 AD 数据库中更新其 msDS-SupportedEncryptionTypes 属性。

  2. 案例:源计算机在 AD 中的msDS-SupportedEncryptionTypes值未定义时,KDC 将回退到DefaultDomainSupportedEncTypes。 这种情况更为复杂,需要全面了解环境才能解决。 该值DefaultDomainSupportedEncTypes用于为没有值的设备定义msDS-SupportedEncryptionTypes加密类型。 可通过两种方法解决这种情况:

    • 定义帐户属性中的特定 msDS-SupportedEncryptionTypes 值,以确保它不会回退到 DefaultDomainSupportedEncTypes 该值。

    • 或者,将 DefaultDomainSupportedEncTypes 值设置为包含 AES-SHA1。

    正确的方法依赖于单个风险容忍度,因为更新 DefaultDomainSupportedEncTypes 值会更改所有没有 值的帐户的行为

设备不支持 AES-SHA1

对于 Windows 设备,不支持 AES-SHA1 的最后一个版本的 Windows 是 Windows Server 2003,该版本 不受支持。 应迁移到支持 AES-SHA1 的 Windows 版本。 对于在 AES-SHA1 支持之前创建的帐户,请重置密码以生成新式加密密钥,例如 AES-SHA1。 对于不支持 SHA-1 的帐户,请手动配置支持的加密类型以包括 RC4。

小窍门

如果你有不支持 AES-SHA1 的第三方设备,请联系 stillneedrc4@microsoft.com 有关设备和方案的信息。

限制或禁用 RC4 用法

默认 Kerberos 加密类型的更改导致 RC4 使用量显著减少。 但是,如果要进一步减少 RC4 的使用,则可以限制组策略对 RC4 的使用范围,或者完全在域中禁用 RC4。

注意

从 Windows Server 2025 开始,域控制器不再颁发 RC4 票证授予票据。 虽然可以使用 RC4 旧版设备进行身份验证,但旧版设备无法使用 Kerberos 进行身份验证。 需要为域控制器使用早期版本的 Windows Server。

限制或禁用 RC4 用法:

  1. 使用组策略管理控制台创建组策略对象(GPO)。 有关详细信息,请参阅 组策略管理

  2. 编辑 GPO 并导航到 计算机配置>策略>Windows 设置>安全设置>本地策略>安全选项

  3. 找到策略设置 网络安全:配置 Kerberos 允许的加密类型。 双击策略以打开其属性。

  4. 指定要允许的加密类型。 下面是一些示例:

    • 若要仅允许 AES-SHA1,请选中 AES128_HMAC_SHA1AES256_HMAC_SHA1 的复选框。

    • 若要允许 AES-SHA1 和 RC4,请选中AES128_HMAC_SHA1、AES256_HMAC_SHA1RC4_HMAC_MD5的框。

      网络安全的屏幕截图:在 Windows 中配置 Kerberos 策略设置允许的加密类型,其中选中并突出显示了 RC4。

  5. 将 GPO 范围确定为包含要向其应用策略的设备的适当组织单位(OU)或组。 确保它传播到目标设备,然后重启设备以应用新设置。

  6. 应用策略后,监视身份验证事件,以确保不会发生意外的身份验证失败。 可以使用“ 使用 PowerShell”部分中提到的 PowerShell 脚本来审核 RC4 使用情况 ,以验证不再使用 RC4。

或者,还可以通过设置以下注册表值来禁用域控制器上的 RC4,仅允许 AES128_HMAC_SHA1AES256_HMAC_SHA1

  • 键:HKEY_LOCAL_MACHINE\System\CurrentControlSet\services\KDC
  • 值名称:DefaultDomainSupportedEncTypes
  • 类型:REG_DWORD
  • 值数据: 0x38

识别禁用 RC4 后身份验证失败

禁用 RC4 后,某些系统的身份验证可能会失败。 本部分介绍常见方案和指示器,以识别禁用 RC4 引起的潜在问题。 下面是可能出现身份验证失败的两种常见方案:

  • 服务器消息块(SMB):当您尝试使用 SMB 访问共享,而 RC4 是 msDS-SupportedEncryptionTypes 唯一的值时,身份验证失败将导致产生网络错误,如以下屏幕截图所示:

    访问 SMB 共享时 Windows 中的网络错误对话框的屏幕截图,指示身份验证失败,因为加密类型不受支持。

  • Windows Management Instrumentation (WMI):尝试使用 使用 WMI 的 New-PSSession cmdlet 创建远程 PowerShell 会话时,RC4 是唯一的值 msDS-SupportedEncryptionTypes,身份验证失败将生成错误消息,如以下示例所示:

    New-PSSession : [vm01.contoso.com] Connecting to remote server vm01.contoso.com failed with the following
    error message : WinRM cannot process the request. The following error with errorcode 0x80090342 occurred
    while using Kerberos authentication: An unknown security error occurred.
    
    Possible causes are:
       -The user name or password specified are invalid.
       -Kerberos is used when no authentication method and no user name are specified.
       -Kerberos accepts domain user names, but not local user names.
       -The Service Principal Name (SPN) for the remote computer name and port does not exist.
       -The client and remote computers are in different domains and there is no trust between the two domains.
    After checking for the above issues, try the following:
       -Check the Event Viewer for events related to authentication.
       -Change the authentication method; add the destination computer to the WinRM TrustedHosts configuration
    setting or use HTTPS transport.
    Note that computers in the TrustedHosts list might not be authenticated.
    -For more information about WinRM configuration, run the following command: winrm help config. For more
    information, see the about_Remote_Troubleshooting Help topic.
    At line:1 char:6
    + $s = New-PSSession vm01.contoso.com
    +      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         + CategoryInfo          : OpenError: (System.Manageme....RemoteRunspace:RemoteRunspace) [New-PSSession],
         PSRemotingTransportException
         + FullyQualifiedErrorId : err ,PSSessionOpenFailed
    

若要完成上述任一方案,请执行以下步骤:

  1. 尝试使用 klist Windows 命令向此终结点发出直接服务凭据请求,该命令为失败提供了更详细的错误信息。 以下示例演示了 vm01.contoso.com 上对 HOST 服务的服务票证的请求。

    打开 PowerShell 会话,并从尝试向目标设备进行身份验证的设备运行以下命令:

    klist get HOST/vm01.contoso.com
    

    下面是输出的示例,显示 KDC 不支持请求的加密类型:

    Current LogonId is 0:0xd6ed18
    Error calling API LsaCallAuthenticationPackage (GetTicket substatus): 0x80090342
    
    klist failed with 0xc00002fd/-1073741059: The encryption type requested is not supported by the KDC.
    
  2. 在 KDC 上为同一请求打开事件 ID 4769 时,可以看到错误代码0xE,该代码映射到错误名称KDC_ERR_ETYPE_NOTSUPP。 此错误表示 KDC 不支持加密类型。 可以在 附录 C:Kerberos 和 LDAP 错误消息中关联更多错误。

    A Kerberos service ticket was requested.
    
    Account Information:
        Account Name:       adele@CONTOSO.COM
        Account Domain:     CONTOSO.COM
        Logon GUID:     {00000000-0000-0000-0000-000000000000}
        MSDS-SupportedEncryptionTypes:  -
        Available Keys: -
    
    Service Information:
        Service Name:       HOST/vm01.contoso.com
        Service ID:     NULL SID
        MSDS-SupportedEncryptionTypes:  -
        Available Keys: -
    
    Domain Controller Information:
        MSDS-SupportedEncryptionTypes:  -
        Available Keys: -
    
    Network Information:
        Client Address:     ::ffff:192.168.1.112
        Client Port:        60090
        Advertized Etypes:  -
    
    Additional Information:
        Ticket Options:     0x40810000
        Ticket Encryption Type: 0xFFFFFFFF
        Session Encryption Type:    0x2D
        Failure Code:       0xE
        Transited Services: -
    
  3. 请遵循“处理过的 msDS-SupportedEncryptionTypes 值不包括 AES-SHA1 位”部分中的步骤,以确定目标设备支持的加密类型。 在此示例中,vm01.contoso.commsDS-SupportedEncryptionTypes值是 0x4,这表示该帐户仅配置了 RC4。