Windows服务器注册表是系统配置的核心数据库,很多默认设置为了兼容性而牺牲了安全性。直接针对高风险键值做加固,比安装额外防护软件更底层、更有效。下面按攻击面分类,给出具体可操作的注册表加固项。

网络层加固:阻断基础探测与中间人

攻击者第一步通常是扫描和探测。关闭NetBIOS over TCP/IP能大幅减少内网横向渗透时的信息泄露。定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Interfaces,在对应网卡GUID子键下,将NetbiosOptions的值设为2(禁用)。如果存在多个网卡,需要逐一修改。同时建议在服务层面直接禁用TCP/IP NetBIOS Helper服务,防止配置被重新启用。

SMB签名是防止中间人攻击的关键。默认情况下,服务器可能不强制要求SMB签名。在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters下,将RequireSecuritySignature设为1,EnableSecuritySignature设为1。对于客户端侧,在LanmanWorkstation\Parameters下同样设置。强制签名会略微增加CPU开销,但能有效阻断SMB中继攻击。

针对RDP暴力破解,除了修改默认3389端口外,更有效的是启用网络级身份验证(NLA)。在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp下,将UserAuthentication设为1。同时建议将SecurityLayer设为2(强制TLS),MinEncryptionLevel设为3(高级加密)。这些设置能确保RDP会话在认证前就建立加密通道。

认证与凭据保护:防止哈希传递与暴力破解

Windows默认在内存中缓存登录凭据,这是哈希传递攻击的主要目标。在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa下,将LimitBlankPasswordUse设为1,禁止空密码的远程登录。更重要的是设置RestrictAnonymous为1,限制匿名枚举SAM账户和共享。对于域环境,RestrictAnonymousSAM设为1,EveryoneIncludesAnonymous设为0。

WDigest协议会在内存中保存明文密码,这是历史遗留问题。在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest下,新建或修改DWORD值UseLogonCredential为0。如果该键不存在,直接创建。修改后需要重启服务器才能生效。这一步能有效防止Mimikatz等工具直接抓取明文密码。

本地账户锁定策略通过注册表配置更直接。在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RemoteAccess\Policy下,根据实际远程访问服务配置锁定阈值。对于系统整体账户策略,建议通过本地安全策略(secpol.msc)配置,注册表路径在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa下的RestrictRemoteSAM和SAM子键相关项。设置账户锁定阈值为5次,锁定时间30分钟,能显著增加暴力破解成本。

服务与进程加固:减少攻击面

关闭不必要的服务是减少攻击面的直接手段。通过注册表修改服务启动类型,路径在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\服务名,将Start值改为4(禁用)或3(手动)。重点关注以下服务:Print Spooler(打印后台处理程序,常被用于提权漏洞利用)、Remote Registry(远程注册表服务,默认应禁用)、Server(如果服务器不需要作为文件共享服务器)。特别是Print Spooler,历史漏洞频发,建议在纯Web服务器或数据库服务器上直接禁用。

Windows远程管理(WinRM)如果不需要,应该彻底关闭。在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN\Service下,将启动相关配置禁用。同时检查HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinRM,将Start设为4。很多自动化攻击会尝试通过WinRM进行横向移动,关闭它能阻断一条重要通道。

针对PowerShell攻击,可以通过注册表限制脚本执行策略。在HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\PowerShell下,新建ExecutionPolicy字符串值,设为Restricted或AllSigned。同时建议启用ScriptBlockLogging和ModuleLogging,在同一个策略路径下创建EnableScriptBlockLogging和EnableModuleLogging的DWORD值设为1。这样即使攻击者尝试执行恶意脚本,也会留下详细日志。

注册表自身防护:权限与审计

注册表自身的访问控制往往被忽略。使用regedit定位到敏感键,右键权限,移除Everyone和Users组的写权限。重点关注以下路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services(服务配置)、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run(启动项)、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa(认证配置)。默认情况下,Users组对这些键只有读权限,但部分第三方软件安装时可能修改了权限,需要定期审计。

启用注册表审计能记录所有关键键值的修改尝试。在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa下,设置SCENoApplyLegacyAuditPolicy为1,启用高级审计策略。然后通过auditpol命令配置具体审计项:auditpol /set /subcategory:"Registry" /success:enable /failure:enable。这样任何对注册表敏感区域的修改都会记录到安全日志,便于事后追溯。

防止注册表被远程修改同样重要。Remote Registry服务如果无法禁用(某些管理场景需要),至少限制其访问权限。在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurePipeServers\winreg下,设置AllowedPaths和MachineLaunchRestriction的权限。默认情况下,只有管理员组能远程访问注册表,但建议显式配置MachineLaunchRestriction的ACL,只允许特定管理账户。

自动化加固脚本示例

以下是一个批处理脚本,整合了核心注册表加固项,可以直接在Windows服务器上以管理员身份运行。执行前建议先备份注册表。

@echo off
rem 备份当前注册表
reg export HKLM\SYSTEM\CurrentControlSet\Services %TEMP%\services_backup.reg /y
reg export HKLM\SYSTEM\CurrentControlSet\Control\Lsa %TEMP%\lsa_backup.reg /y

rem 禁用NetBIOS over TCP/IP
for /f "tokens=*" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Services\NetBT\Parameters\Interfaces"') do (
    reg add "%%i" /v NetbiosOptions /t REG_DWORD /d 2 /f
)

rem 强制SMB签名
reg add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" /v RequireSecuritySignature /t REG_DWORD /d 1 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" /v EnableSecuritySignature /t REG_DWORD /d 1 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v RequireSecuritySignature /t REG_DWORD /d 1 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v EnableSecuritySignature /t REG_DWORD /d 1 /f

rem 启用RDP网络级身份验证
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 1 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v SecurityLayer /t REG_DWORD /d 2 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v MinEncryptionLevel /t REG_DWORD /d 3 /f

rem 禁用WDigest明文凭据缓存
reg add "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest" /v UseLogonCredential /t REG_DWORD /d 0 /f

rem 限制匿名枚举
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RestrictAnonymous /t REG_DWORD /d 1 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RestrictAnonymousSAM /t REG_DWORD /d 1 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v EveryoneIncludesAnonymous /t REG_DWORD /d 0 /f

rem 禁用远程注册表服务
reg add "HKLM\SYSTEM\CurrentControlSet\Services\RemoteRegistry" /v Start /t REG_DWORD /d 4 /f

rem 禁用Print Spooler(如果不需要打印服务)
reg add "HKLM\SYSTEM\CurrentControlSet\Services\Spooler" /v Start /t REG_DWORD /d 4 /f

echo 注册表加固完成,部分设置需要重启服务器生效。
pause

执行上述脚本后,务必检查服务器上运行的应用是否依赖被禁用的服务。特别是Print Spooler,某些应用可能间接依赖它。建议先在测试环境验证,确认无影响后再在生产环境部署。

加固后的验证与持续监控

注册表加固完成后,需要验证设置是否真正生效。使用reg query命令检查关键键值,例如reg query "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RestrictAnonymous,确认返回值为0x1。对于服务启动类型,使用sc query命令查看服务状态,确认RemoteRegistry和Spooler已停止且启动类型为禁用。

持续监控注册表变化比一次性加固更重要。建议部署Sysmon并配置注册表监控规则,重点监控上述加固键值的修改。攻击者如果获得管理员权限,可能会尝试回滚这些安全设置。通过Sysmon的RegistryEvent事件,可以实时发现异常修改。同时定期导出关键注册表路径与基线对比,能发现未授权的变更。

注册表加固不是一次性的工作。Windows更新、软件安装、系统配置变更都可能引入新的注册表键值或修改现有设置。建议每季度进行一次注册表安全审计,重点关注新增的自动启动项、服务注册、以及LSA和认证相关键值的变化。结合Windows事件日志中的Security日志,分析是否有异常的注册表访问行为。