Windows Server 环境中,SMBv1(服务器消息块版本 1)是必须优先处理的安全隐患。这个协议诞生于上世纪 80 年代,完全没有抵御现代网络攻击的能力。2017 年肆虐全球的 WannaCry 勒索软件就是利用 SMBv1 的永恒之蓝漏洞进行传播。微软从 Windows 10 秋季创意者更新和 Windows Server 2016 开始,默认会在 15 天无使用后自动卸载 SMBv1,但在很多由旧版本升级而来的服务器上,或者因为某些遗留应用需求,SMBv1 可能仍然处于启用状态。手动逐台关闭不仅效率低,还容易遗漏。通过组策略在域控或本地策略上统一禁用这些老旧协议,是确保网络边界收缩、攻击面减少的最有效手段。

确认环境中 SMBv1 的启用状态

在推送组策略之前,先要摸清当前环境有多少服务器还开着 SMBv1。以管理员身份打开 PowerShell,运行 Get-SmbServerConfiguration | Select EnableSMB1Protocol 命令。如果返回 True,说明 SMBv1 还在运行。对于 SMBv2 和 SMBv3,微软已经强制启用且无法单独关闭,但 SMBv1 的独立开关必须手动处理。如果环境中还有 Windows Server 2008 R2 甚至更老的系统,它们默认开启 SMBv1,需要特别关注。另外,检查是否有依赖 SMBv1 的旧版网络附加存储设备、多功能打印机或者老旧的 Linux 客户端。如果存在这类设备,直接禁用会导致连接中断,需要提前制定迁移或替换计划。

通过组策略首选项修改注册表禁用 SMBv1

SMBv1 的开关本质上由注册表控制。微软官方的做法是通过修改注册表项来禁用。在域控上打开组策略管理控制台,创建一个新的 GPO 并链接到目标组织单位。导航到计算机配置下的首选项,然后进入 Windows 设置中的注册表。新建一个注册表项,操作选择更新,配置单元为 HKEY_LOCAL_MACHINE,键路径填写 SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters。在这个路径下新建一个 DWORD 值,名称设为 SMB1,数值数据填入 0。这个键值控制着 SMBv1 服务端的开关。为了让修改生效,还需要处理依赖项。在同一个注册表路径下,检查是否存在一个名为 DependsOnService 的多字符串值,如果存在,确保其中不包含对 SMBv1 驱动程序的强制依赖。对于客户端侧的 SMBv1,需要修改另一个路径 SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters,同样新建 DWORD 值 SMB1,设为 0。这样服务端和客户端两侧都禁用了 SMBv1。

使用 PowerShell 脚本通过组策略启动脚本部署

注册表方式虽然直接,但不如 PowerShell 命令彻底。Windows Server 自带 Disable-WindowsOptionalFeature 和 Set-SmbServerConfiguration 命令。在组策略中,可以利用启动脚本或关机脚本来执行 PowerShell 禁用操作。在 GPO 编辑器中,定位到计算机配置下的 Windows 设置,选择脚本(启动/关机)。双击启动,点击 PowerShell 脚本选项卡,添加一个脚本文件。脚本内容可以写成:

$ErrorActionPreference = "Stop"
if (Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol | Where-Object State -eq "Enabled") {
    Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestart -WarningAction SilentlyContinue
}
Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force -Confirm:$false
Set-SmbClientConfiguration -EnableSMB1Protocol $false -Force -Confirm:$false

这段脚本先检查 SMB1Protocol 可选功能是否开启,如果是则禁用它,然后分别关闭服务端和客户端的 SMBv1 协议。注意 Set-SmbClientConfiguration 需要单独处理,因为客户端配置独立于服务端。将这段脚本保存为 .ps1 文件,放在域控的 NETLOGON 共享文件夹中,然后在组策略启动脚本里引用这个路径。这样每次服务器重启,都会强制执行一次禁用检查,确保配置不会被意外回滚。

通过组策略管理模板控制 SMBv1 可选功能

对于 Windows Server 2016 及以上版本,微软提供了更优雅的方式。在组策略编辑器中,进入计算机配置下的管理模板,展开系统,找到可选功能安装。这里有一个策略设置叫做“配置可选功能安装”,可以指定要禁用的可选功能。SMBv1 在 Windows Server 中就是一个可选功能。启用这个策略,在选项框中添加要禁用的功能名称,输入 SMB1Protocol。这样系统会通过 Windows Update 或本地源自动卸载 SMBv1 组件。不过这个方法对 Windows Server 2012 R2 及更早版本无效,因为它们没有将 SMBv1 作为独立的可选功能来管理。对于混合环境,还是注册表或 PowerShell 脚本的方式覆盖范围更广。

针对 NetBIOS 和 LLMNR 的连带加固

仅仅禁用 SMBv1 还不够彻底。SMB 协议常常与 NetBIOS over TCP/IP 以及 LLMNR(链路本地多播名称解析)协同工作,这两个协议同样是老旧且不安全的。攻击者可以利用 LLMNR 和 NetBIOS 进行中间人攻击,捕获哈希凭据。在同一个组策略对象中,应该一并禁用它们。进入计算机配置下的管理模板,展开网络,找到 DNS 客户端。启用“关闭多播名称解析”策略,这将禁用 LLMNR。接着进入网络连接下的 Windows 防火墙,或者直接通过注册表禁用 NetBIOS。注册表路径为 SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Interfaces,遍历每个网络接口的子键,将 NetbiosOptions 设为 2 表示禁用。可以通过 PowerShell 脚本在组策略中统一设置:

$adapters = Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Interfaces"
foreach ($adapter in $adapters) {
    if (Test-Path "$($adapter.PSPath)\NetbiosOptions") {
        Set-ItemProperty -Path $adapter.PSPath -Name "NetbiosOptions" -Value 2
    }
}

这段脚本遍历所有网络接口并强制禁用 NetBIOS。禁用这两个协议后,网络发现和名称解析会完全依赖 DNS,这是更安全的设计。

验证组策略应用效果和排错

组策略刷新后,需要在客户端验证是否生效。在目标服务器上以管理员身份运行 gpupdate /force 强制刷新策略,然后重启服务器使注册表修改和功能卸载生效。重启后,运行 Get-SmbServerConfiguration | Select EnableSMB1Protocol,确认返回 False。再运行 Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol,确认 State 显示为 Disabled。如果某些服务器策略未生效,先用 gpresult /r 检查该服务器是否在正确的组织单位下,以及 GPO 是否被正确应用。常见问题包括权限不足、WMI 筛选器配置错误或者 GPO 被强制覆盖。对于使用启动脚本的情况,检查 PowerShell 执行策略是否允许脚本运行。可以在同一个 GPO 中设置计算机配置下的管理模板,展开 Windows 组件,找到 Windows PowerShell,启用“打开脚本执行”策略,设为“允许本地脚本和远程签名脚本”。

处理遗留应用和兼容性过渡

禁用 SMBv1 后,如果突然有业务中断,说明环境中还存在依赖 SMBv1 的设备。这时不要立即回滚策略,而是先定位具体设备。在 Windows Server 上启用 SMB 客户端和服务器的审计日志,通过事件查看器中的“应用程序和服务日志”下的 Microsoft/Windows/SmbClient 和 SmbServer 操作日志,可以找到哪些客户端还在尝试用 SMBv1 连接。对于确实无法升级的老旧设备,考虑使用独立的隔离网段,通过防火墙严格限制其访问范围,并部署 IPS 规则来检测和阻断针对 SMBv1 漏洞的攻击。但隔离只是临时方案,最终目标仍是彻底淘汰这些设备或升级其固件。

扩展到其他老旧协议的系统性禁用

SMBv1 只是老旧协议中的一个典型代表。同样的组策略方法可以用于禁用 TLS 1.0 和 TLS 1.1,以及过时的加密套件。在组策略中,通过“计算机配置\管理模板\网络\SSL 配置设置”下的“SSL 密码套件顺序”可以精确控制启用的加密算法。对于 RDP 的安全层,在“计算机配置\管理模板\Windows 组件\远程桌面服务\远程桌面会话主机\安全”中,要求使用特定的安全层,并设置为仅允许 TLS 1.2 以上的连接。将这些安全基线整合到同一个 GPO 中,形成一个服务器安全加固基线策略,可以系统性地提升整个域的防护水平。每次微软发布新的安全基线,都应该与现有策略进行比对,及时调整注册表键值和组策略配置,保持攻击面持续收敛。

持续合规与自动化检测

安全配置不是一次性工作。在后续的服务器上线流程中,应该将禁用 SMBv1 等老旧协议的检查项加入系统合规扫描。可以使用 PowerShell Desired State Configuration 来定义服务器的目标状态,确保 SMBv1 始终处于禁用状态。DSC 配置脚本可以写成:

Configuration DisableSMBv1 {
    Import-DscResource -ModuleName PSDesiredStateConfiguration
    Node "localhost" {
        WindowsOptionalFeature SMB1Feature {
            Name = "SMB1Protocol"
            Ensure = "Absent"
        }
        Registry SMB1ServerReg {
            Key = "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters"
            ValueName = "SMB1"
            ValueData = "0"
            ValueType = "Dword"
            Ensure = "Present"
        }
    }
}

将这个配置推送到所有服务器,并定期检查合规性。任何配置漂移都会被自动修正。结合组策略的强制部署和 DSC 的持续合规,可以构建一个多层防护体系,确保老旧协议不会因为人为误操作或系统重置而重新启用。