为什么 MS GPO 选项会破坏使用 hosts 文件作为机器名称的 SMB 共享?

为什么 MS GPO 选项会破坏使用 hosts 文件作为机器名称的 SMB 共享?

我们设定了“Microsoft 网络服务器:服务器 SPN 目标名称验证级别“在我们的测试 GPO 上将其更改为“客户端所需”。

我们的测试系统在其主机文件中有一些自定义机器别名,但是一旦打开该选项,我们就无法再使用机器别名访问 SMB 共享。

我一直在努力寻找有关这种互动的信息,所以希望有人能够在这里解释这种互动,以及是否有办法补救它?

答案1

这与“hosts”文件无关——它破坏了通过以下方式访问的共享:与服务器“真实”名称不同的主机名。您的结果是正常的,因为这实际上就是 GPO 的全部目的。

所讨论的 GPO 非常类似于某些 Web 服务器中的 TLS SNI 强制措施:客户端声明“我来这里是为了与服务器 SRV01.EXAMPLE.COM 对话”,如果服务器无法识别该名称作为其服务的虚拟主机之一,则会完全拒绝该客户端。因此,如果客户端声明它想要与您的某个 /etc/hosts 别名对话,但服务器不知道该别名,则会拒绝该客户端。

Kerberos 已经内置了类似的强制措施(这就是为什么你需要使用注册别名的 SPN setspn),但 GPO 使其更加严格将同样的保护扩展至 NTLM。

(正如文档页面中提到的,这是为了防止 NTLM 中继攻击,其中恶意服务器 A 接受 NTLM 身份验证,然后将完全相同的 NTLM 数据包转发到真实服务器 B - 该攻击将被阻止,因为服务器 B 会从客户端看到“我想与服务器 A 对话”。)

仍然可以使用主机别名,但需要越来越多的注册表旋钮。官方方法是netdom computername REALHOST /add:THEALIAS使用这篇 TechNet 帖子,我发现一些博客文章声称,即使经过严格的 SPN 验证,也足以使别名可用,但实际上似乎并非如此不是相当足够 – 至少有一个(如果不是两个)注册表值被它忘记触碰了。

  1. NETDOM 寄存器凯尔伯罗斯AD 中别名的 SPN,允许为其获取 Kerberos 票证,类似于手动发出这两个命令:

    setspn -S HOST/THEALIAS REALHOST$
    setspn -S HOST/thealias.example.com REALHOST$
    

    这是 Kerberos 所必需的,没有理由不在 AD 环境中使用 Kerberos,因此无论您选择使用 NETDOM 还是手动执行,都应该注册别名 SPN。

    (从技术上讲,SMB 使用“cifs/”主体,但在 AD 中,只要注册“host/”SPN,它们就会隐式存在。)

  2. 然后,NETDOM 在服务器注册表的两个地方添加别名,导致服务器在 AD DNS 中注册其其他名称并通过 NetBIOS 浏览器宣布它们:

    • 路径:HKLM:\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters
      名称:AlternateComputerNames
      类型: REG_MULTI_SZ
      数据: { thealias.example.com}

    • 路径:HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
      名称:OptionalNames
      类型: REG_MULTI_SZ
      数据: { THEALIAS}

    它们似乎对身份验证没有任何影响(甚至 Kerberos 也没有),所以我相信如果您使用 /etc/hosts 或在 DNS 中创建手动 CNAME 记录,那么这两者都是完全可选的。

  3. NETDOM 的一个附加参数没有创建,但我发现从服务器内部访问别名所必需的是:

    • 路径:HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0
      名称:BackConnectionHostNames
      类型: REG_MULTI_SZ
      数据: { thealias.example.com}

    这个只需要用于“环回”连接,所以一般来说可能不是严格必要的,但至少在我的情况下,服务器做过需要连接到其自己的别名,因此需要设置。

  4. 最后,我发现“SPN 目标名称验证”功能它自己的必须手动更新的允许名称列表 - 否则,即使存在上述所有设置,别名也会因严格的 SPN 验证而被拒绝:

    • 路径:HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters
      名称:SrvAllowedServerNames
      类型:REG_MULTI_SZ
      数据:{ THEALIAS, thealias.example.com}

    您需要列出两个简称每个别名的 FQDN – 根据我的实验,列出一个并不一定自动暗示另一个。

注册 Kerberos SPN 并SrvAllowedServerNames设置注册表值后,即使经过严格的目标验证,别名也应该能够正常工作。

相关内容