什么是服务器消息块签名?

本文介绍 Windows 和 Windows Server 中的服务器消息块 (SMB) 2.x 和 3.x 签名。 本文还介绍 SMB 签名安全注意事项和策略设置。

SMB 签名意味着每条 SMB 消息都包含一个使用会话密钥和 AES 生成的签名。 SMB 签名在 SMB 标头中添加包含整个消息哈希的签名。 如果有人篡改传输中的消息,则被篡改消息中的数据与签名中的哈希值将不匹配。 该哈希还包括原始发送方和预期收件人的标识。 签名不匹配会提醒用户可能存在的恶意行为,帮助他们保护其部署免受中继和欺骗攻击。

签名的工作原理

SMB 签名是一种安全功能,使用会话密钥和密码套件向通过连接的消息添加签名。 SMB2 消息完整性体现在签名会话上,其中签名的数据包从客户端流到服务器。 在签名会话中,每个签名数据包都包含一个接收方可以验证的签名。 与使用 MD5 [RFC1321] 哈希算法的 SMB1 签名不同,SMB2 使用更好的哈希进行签名。 MS-SMB2 中的安全模型依赖于在访问服务器上的共享之前对客户端用户标识进行身份验证。 用户通过身份验证后,服务器可以强制消息签名或加密。 服务器还根据用户、组或声明被授权具有不同级别的访问权限来控制对共享的访问权限。

签名算法随着时间的推移而发展,SMB 2.02 中使用 HMAC-SHA-256 改进了签名,取代了 SMB1 中旧的 MD5 方法。 此外,SMB 3.0 引入了 AES-CMAC。 Windows Server 2022 和 Windows 11 引入了 AES-128-GMAC 签名加速。 若要了解有关 AES-128-GMAC 签名的详细信息,请参阅 AES-128-GMAC 签名加速

所有版本的 Windows 中都启用了 SMB 签名。 SMB 签名要求可能涉及出站签名(涵盖来自 SMB 客户端的流量)和入站签名(涵盖到服务器的流量)。 Windows 和 Windows Server 可以仅要求出站签名、仅要求入站签名、两者都要求或两者都不要求。 如果环境使用非 Microsoft 文件服务器,则系统设置可能会阻止默认设置和连接生效。 在这种情况下,可能需要禁用 SMB 签名的要求。 有关如何禁用 SMB 签名的指导,请参阅控制 SMB 签名行为

SMB2 和 SMB3 中的安全注意事项

SMB 2.x 和 3.x 签名中使用的所有加密密钥都源自会话密钥。 SMB 2/3 签名和加密的安全性依赖于会话密钥。 如果有人在传输过程中更改消息,则哈希会不匹配,SMB 就可以知道有人篡改了数据。 签名还可以确认发送者和接收者的标识,并防止中继攻击。

使用 SMB 签名时,应考虑:

  • 由于会话密钥本身是从密码派生而来的,因此使用长的、复杂的、非字典式的密码可以增强 SMB 签名和加密。
  • 建议使用 Kerberos 而不是 NTLMv2,以便会话密钥以强方式启动。
  • 请勿使用 IP 地址或 CNAME 记录连接到共享,否则将使用 NTLM 而不是 Kerberos。 建议使用 Kerberos。 若要了解有关使用 CNAME 记录的替代方法的详细信息,请参阅使用计算机名称别名代替 DNS CNAME 记录

默认情况下,域控制器需要对连接到它们的任何人进行 SMB 签名,通常 SYSVOL 和 NETLOGON 需要 SMB 签名才能获取组策略和登录脚本。 来自客户端的 UNC 强化还要求在与这两个相同的共享进行通信时进行签名,并进一步要求使用 Kerberos。 SMB 签名还自动用作预身份验证完整性的一部分,以防止降级攻击。 有关详细信息,请参阅 Windows 10 中的 SMB 3.1.1 预身份验证完整性

SMB 签名的策略位置

SMB 签名的策略位于计算机配置>Windows 设置>安全设置>本地策略>安全选项中。

  • Microsoft 网络客户端:对通信进行数字签名(始终)
    注册表项:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanManWorkstation\Parameters
    注册表值:RequireSecuritySignature
    数据类型:REG_DWORD
    数据:0(禁用),1(启用)

  • Microsoft 网络服务器:对通信进行数字签名(始终)
    注册表项:HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanManServer\Parameters
    注册表值:RequireSecuritySignature
    数据类型:REG_DWORD数据:0(禁用),1(启用)

注意

在这些策略中,始终表示需要 SMB 签名。

了解“RequireSecuritySignature”和“EnableSecuritySignature”

SMB2 及更高版本客户端和服务器的 EnableSecuritySignature 注册表设置被忽略。 因此,除非使用 SMB1,否则此设置不会起任何作用。 SMB 2.02 及更高版本的签名仅由是否需要来控制。 当服务器或客户端需要 SMB 签名时,使用此设置。 只有当服务器和客户端都将签名设置为 0 时,才不会进行签名。

总之,SMB 在以下情况下签名:

  • SMB 客户端和服务器都将 RequireSecuritySignature 设置为 1
  • SMB 客户端将 RequireSecuritySignature 设置为 1,服务器将RequireSecuritySignature 设置为 0
  • SMB 服务器将 RequireSecuritySignature 设置为 1,客户端将RequireSecuritySignature 设置为 0

在以下情况下不使用签名:

  • SMB 客户端和服务器将 RequireSecuritySignature 设置为 0

SMB 签名和加密审核

从 Windows 11 版本 24H2 开始,管理员可以为 SMB 客户端启用审核,以检测不支持 SMB 加密或签名的第三方客户端或服务器。 如果第三方设备或软件声明支持 SMB 3.1.1,但不支持 SMB 签名,则违反了 SMB 3.1.1 预身份验证完整性协议要求。

可以在组策略中或通过 PowerShell 调整 SMB 签名和加密审核设置。 组策略的这些设置存储在以下路径中:

  • Computer Configuration\Administrative Templates\Network\Lanman Server\Audit client does not support encryption

  • Computer Configuration\Administrative Templates\Network\Lanman Server\Audit client does not support signing

  • Computer Configuration\Administrative Templates\Network\Lanman Workstation\Audit server does not support encryption

  • Computer Configuration\Administrative Templates\Network\Lanman Workstation\Audit server does not support signing

对于 PowerShell,运行以下命令可以审核相同的设置:

Set-SmbServerConfiguration -AuditClientDoesNotSupportEncryption $true
Set-SmbServerConfiguration -AuditClientDoesNotSupportSigning $true

Set-SmbClientConfiguration -AuditServerDoesNotSupportEncryption $true
Set-SmbClientConfiguration -AuditServerDoesNotSupportSigning $true

事件查看器在以下路径下使用各自的事件 ID 捕获这些事件:

路径 事件 ID
Applications and Services Logs\Microsoft\Windows\SMBClient\Audit 31998
31999
Applications and Services Logs\Microsoft\Windows\SMBServer\Audit 3021
3022

以下文章提供了有关 SMB 的详细信息: