Windows服务器默认配置离“安全”二字差得很远。装完系统直接扔到公网上,不到半小时就会被扫描器标记,RDP端口被爆破是常态,SMB漏洞、PowerShell无约束执行、日志被清空、防火墙规则松散,任何一个环节出问题都可能让整台机器变成肉鸡。下面直接进入实操,按“系统基线—账户与认证—网络与防火墙—服务与组件—日志与审计—纵深防御”的顺序逐层加固。

1. 系统基线与补丁管理

第一步不是装安全软件,而是确认系统版本和补丁状态。Windows Server 2016及以下版本如果还在跑,建议立刻评估升级到2019或2022,旧版本停止主流支持后很多漏洞没有官方补丁。在PowerShell里执行以下命令查看系统版本和补丁情况:

systeminfo | findstr /B /C:"OS Name" /C:"OS Version"
wmic qfe list brief /format:texttable

补丁管理要有固定周期,生产环境不要开自动更新直接重启,建议搭建内部WSUS服务器,设置维护窗口,每月至少一次安全更新。关键补丁(尤其是远程代码执行类,如MS17-010、CVE-2023-23397这类Exchange/Netlogon级别漏洞)必须在24小时内评估并部署。补丁不是装完就完事,还要定期用漏洞扫描器做验证,确认补丁真正生效。

2. 账户与认证加固

默认Administrator账户必须禁用或改名。很多攻击的第一步就是枚举管理员账户名。执行以下命令禁用默认管理员并创建新的低权限管理账户:

Rename-LocalUser -Name "Administrator" -NewName "sysadmin_ops"
New-LocalUser -Name "srv_admin" -Password (Read-Host -AsSecureString) -FullName "Server Admin"
Add-LocalGroupMember -Group "Administrators" -Member "srv_admin"

本地账户密码策略必须强化。打开本地安全策略(secpol.msc),设置密码长度至少14位,启用复杂度,密码最长使用期限60天,账户锁定阈值5次,锁定时间30分钟。更重要的是,生产环境应该全部走域账户或LAPS(本地管理员密码解决方案),避免多台服务器共用同一个本地管理员密码。LAPS会在每台机器上随机生成本地管理员密码并定期轮换,这是防止横向移动的关键措施。

RDP登录不要用明文密码裸奔。如果条件允许,启用网络级别身份验证(NLA),并限制只有特定用户组可以远程登录。在“本地安全策略—用户权限分配”中,把“允许通过远程桌面服务登录”只保留给指定的管理组,移除Everyone和Users组。

3. 网络与防火墙策略

Windows防火墙默认规则太宽松,尤其是入站方向。建议先全部阻断入站,再按需放行。用PowerShell快速清空并重建规则:

Set-NetFirewallProfile -Profile Domain,Public,Private -DefaultInboundAction Block
Set-NetFirewallProfile -Profile Domain,Public,Private -DefaultOutboundAction Allow

放行RDP时不要直接对0.0.0.0开放3389。至少限制来源IP段,如果管理端IP不固定,可以用跳板机或堡垒机中转。示例只允许特定IP访问RDP:

New-NetFirewallRule -DisplayName "RDP_Limited" -Direction Inbound -Protocol TCP -LocalPort 3389 -RemoteAddress 203.0.113.50 -Action Allow

SMB端口(445)是重灾区,除非有明确文件共享需求,否则直接禁用。如果必须开放,至少限制来源网段并启用SMB签名。在PowerShell里检查SMB签名状态:

Get-SmbServerConfiguration | Select EnableSMB2Protocol, RequireSecuritySignature

把RequireSecuritySignature设为True,防止中间人攻击。对于暴露在公网的服务器,还要考虑把RDP端口改掉,但这只是减少噪音,不能替代IP限制和NLA。

4. 服务与组件最小化

安装系统时只勾选必要角色和功能。IIS、FTP、打印服务、远程注册表、远程差分压缩这些组件用不上就卸载。用以下命令查看已安装的角色和功能:

Get-WindowsFeature | Where-Object {$_.InstallState -eq "Installed"}

重点检查几个高危服务:Remote Registry、Print Spooler(如果不需要打印)、Server(如果不需要文件共享)、NetBIOS over TCP/IP。Print Spooler在过去两年爆出多个提权漏洞,很多服务器根本不需要打印功能,直接禁用:

Stop-Service Spooler -Force
Set-Service Spooler -StartupType Disabled

远程注册表服务是横向移动和持久化的常用通道,必须禁用:

Set-Service RemoteRegistry -StartupType Disabled
Stop-Service RemoteRegistry -Force

PowerShell执行策略不能只靠Restricted,因为攻击者可以用-ExecutionPolicy Bypass绕过。真正有效的做法是启用PowerShell日志记录和约束语言模式,配合AppLocker或WDAC限制可执行文件和白名单脚本路径。生产服务器上建议启用Windows Defender Application Control(WDAC),它比传统AppLocker更底层,能阻止未签名二进制和脚本运行。

5. 日志与审计策略

日志是事后追溯的唯一依据。默认日志策略记录太少,必须开启详细审计。在本地安全策略里启用“审核登录事件”“审核账户管理”“审核策略更改”“审核进程跟踪”。重点记录成功和失败的登录事件,尤其是通过RDP和SMB的登录。

PowerShell日志要单独配置。启用模块日志、脚本块日志和转录日志:

Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging" -Name "EnableModuleLogging" -Value 1
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" -Name "EnableScriptBlockLogging" -Value 1

日志文件大小和保留策略要调整,默认20MB太小,攻击者清空日志后你什么都看不到。把安全日志大小设到1GB以上,并配置日志转发。如果有多台服务器,建议部署Windows事件收集器(WEC)或第三方SIEM,把日志集中存储,防止单机日志被篡改或删除。

6. 纵深防御与入侵检测

单靠系统自身配置不够,还需要额外的检测和响应能力。Windows Defender在服务器上默认功能有限,建议开启实时保护、云保护、PUA拦截,并定期做全盘扫描。用PowerShell配置Defender:

Set-MpPreference -DisableRealtimeMonitoring $false -MAPSReporting Advanced -SubmitSamplesConsent Always
Set-MpPreference -PUAProtection Enabled

如果服务器有公网暴露面,部署Sysmon可以大幅提升进程、网络、文件创建等行为的可见性。Sysmon配合好的配置文件能记录PowerShell执行、DLL加载、网络连接等关键事件,再通过Windows事件日志转发到SIEM分析。这里不展开Sysmon配置,但强烈建议生产服务器安装。

另外,定期做本地安全基线扫描。微软提供免费的Security Compliance Toolkit,里面有针对不同Windows Server版本的安全基线模板,可以直接导入本地安全策略。用Secedit命令导出当前策略与基线对比,找出偏差项。

7. 备份与恢复验证

安全加固的最后一步是确保能恢复。没有备份的加固等于裸奔,勒索软件一旦进来,没有备份就只能交钱。Windows Server Backup虽然简陋,但至少能做系统状态和卷级备份。更推荐用Veeam或Azure Backup做应用感知备份,定期做恢复演练,确认备份文件没有被加密或损坏。备份文件要离线存放或使用不可变存储,防止攻击者同时加密备份。

加固不是一次性动作。每季度做一次安全审计,检查账户、防火墙规则、补丁状态、日志策略是否被篡改,用脚本自动化巡检比人工检查可靠得多。把上面这些检查项写成PowerShell脚本,定期输出报告,发现异常立刻告警。