适用场景
Windows 服务器安全加固适用于以下场景:企业将业务部署在 Windows Server 2016/2019/2022 上,需要满足等保 2.0 或内部安全基线要求;服务器暴露于公网,遭受 RDP 暴力破解、弱口令爆破与未授权访问风险;运维人员希望建立可复现的加固流程,降低被入侵后的横向移动风险。本文提供一套可直接执行的加固方案,覆盖本地安全策略、账户策略、远程桌面、审核日志与常见攻击面。
前置条件
- Windows Server 2016 及以上版本,具有本地管理员权限
- 在加固前创建系统还原点或完整快照,便于回滚
- 通过
Get-ExecutionPolicy确认脚本执行策略,必要时执行Set-ExecutionPolicy RemoteSigned
原理说明
Windows 服务器安全加固的核心是最小权限原则与纵深防御。攻击者入侵 Windows 服务器通常分三步:通过弱口令或 RDP 爆破获取入口,利用本地权限提升漏洞提权到 SYSTEM,最后通过持久化机制维持控制。加固的目标就是在每一步阻断攻击:账户策略限制口令猜测次数,本地安全策略关闭不必要的服务与共享,审核策略让入侵行为留下完整日志,安全基线脚本则把上述规则固化为标准配置。
操作步骤
1. 账户与口令策略加固
通过 secpol.msc 或 PowerShell 设置密码复杂度、最小长度与锁定阈值:
# 设置密码策略:最小长度 14,复杂度开启,最长使用 90 天
net accounts /minpwlen:14 /maxpwage:90 /uniquepw:5
# 设置账户锁定策略:5 次失败锁定 30 分钟
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters" -Name "MaximumPasswordAge" -Value 90
# 启用账户锁定(secpol 命令组)
secedit /configure /db secedit.sdb /cfg lockout.cfg /areas SECURITYPOLICY
echo "[System Access]" > lockout.cfg
echo "LockoutBadCount = 5" >> lockout.cfg
echo "ResetLockoutCount = 30" >> lockout.cfg
echo "LockoutDuration = 30" >> lockout.cfg
关键参数:LockoutBadCount 为锁定阈值,LockoutDuration 为锁定分钟数。禁用本地 Administrator 以外的默认账户,并为管理员账户改名:
# 重命名内置 Administrator 并禁用 Guest
Rename-LocalUser -Name "Administrator" -NewName "SecAdmin2026"
Disable-LocalUser -Name "Guest"
Get-LocalUser
2. 远程桌面防护
RDP 是最常被爆破的入口。建议开启 NLA 网络级别认证并更换默认 3389 端口:
# 开启 NLA(网络级别认证)
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "UserAuthentication" -Value 1
# 修改 RDP 端口为 53389(需同时放行防火墙)
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "PortNumber" -Value 53389
Restart-Service TermService
# 防火墙放行新端口并限制来源 IP
New-NetFirewallRule -DisplayName "RDP-Custom" -Direction Inbound -LocalPort 53389 -Protocol TCP -RemoteAddress 192.168.1.0/24 -Action Allow
关键参数:RemoteAddress 务必改为你的办公网段,实现白名单访问。若通过堡垒机访问,应将来源限制为堡垒机 IP。
3. 关闭高风险服务与共享
# 停用并禁用高危服务:Telnet、FTP 发布、打印后台(非必要)
Set-Service -Name "TlntSvr" -StartupType Disabled -ErrorAction SilentlyContinue
Set-Service -Name "FTPSVC" -StartupType Disabled -ErrorAction SilentlyContinue
# 删除默认共享
Remove-SmbShare -Name "ADMIN$" -Force -ErrorAction SilentlyContinue
Remove-SmbShare -Name "C$" -Force -ErrorAction SilentlyContinue
# 开启 SMB 签名,防止中间人攻击
Set-SmbServerConfiguration -RequireSecuritySignature $true -Force
4. 启用审核策略与日志增强
# 开启登录、账户管理、进程创建审核
auditpol /set /subcategory:"Logon" /success:enable /failure:enable
auditpol /set /subcategory:"Account Logon" /success:enable /failure:enable
auditpol /set /subcategory:"Process Creation" /success:enable
# 扩大安全日志容量并启用 Sysmon(需下载 Sysmon 工具)
wevtutil sl Security /ms:104857600
# Sysmon 配置示例:记录进程创建与网络连接
sysmon64 -accepteula -i sysmon-config.xml
5. 基线一键加固脚本
将以上规则整合为脚本,固化到 C:\Scripts\Harden.ps1,通过计划任务每周自动校验:
# Harden.ps1 - Windows 安全基线加固脚本
$ErrorActionPreference = "Continue"
net accounts /minpwlen:14
Set-Service -Name "TlntSvr" -StartupType Disabled
auditpol /set /subcategory:"Logon" /success:enable /failure:enable
Write-Host "[OK] 安全基线已应用 $(Get-Date)"
配置验证
# 验证密码策略
net accounts
# 验证账户锁定状态
Get-LocalUser | Select-Object Name, Enabled
# 验证 RDP 端口监听
netstat -ano | findstr 53389
# 验证审核策略
auditpol /get /subcategory:"Logon"
# 验证安全日志事件(登录失败 4625)
Get-WinEvent -FilterHashtable @{LogName="Security"; Id=4625} -MaxEvents 10 | Select-Object TimeCreated, Message
常见问题
Q1:修改 RDP 端口后无法远程连接怎么办?
先在本地控制台确认服务状态:Get-Service TermService。若服务运行中,检查防火墙规则是否只放行了新端口而未放行旧端口;若 RemoteAddress 白名单未包含当前来源 IP,会直接拒绝连接。建议保留一条受 IP 限制的管理员规则,避免被锁在服务器外。
Q2:禁用默认共享后业务受影响吗?
ADMIN$ 与 C$ 是管理共享,仅供管理员远程管理使用,正常业务应用不受影响。但需确认备份软件、监控代理没有依赖管理共享,否则需在备份策略中改用专用共享目录并单独授权。
Q3:安全日志增长过快怎么办?
可设置日志容量上限(建议 100MB 以上)并配置覆盖策略:wevtutil sl Security /ms:104857600 /rt:true /ab:true。同时将日志转发到 SIEM 或集中日志平台(如 ELK、Windows Event Forwarding),实现异地保存,防止攻击者清理本地日志。
总结
Windows 服务器安全加固应遵循最小权限与纵深防御原则,重点封堵 RDP 爆破、弱口令与默认共享三大攻击面。口令策略、账户锁定、NLA 认证与端口白名单是立即可见效的基础项,审核策略与 Sysmon 则解决”看不到”的问题。建议将加固步骤固化为基线脚本,纳入变更管理流程,并定期用安全基线检查工具复核配置漂移。