如何在香港服务器的Windows Server系统中配置组策略,抵御跨境网络环境中的RDP暴力破解?

那天晚上,我正值夜班,香港机房的空调压缩机声像低沉的背景乐,伴随着一排排服务器蓝灯的闪烁。刚喝下一口温掉的咖啡,安全日志就像失控的瀑布一样刷屏——4625 登录失败,一秒几十条,源 IP 遍布全球,从美国到东欧,从东南亚到境内云厂商,密集得让我第一反应以为是误报。CPU 占用倒是没飙高,但远程会话队列一波一波像海浪拍过来,明显就是 RDP 暴力破解。我当时心里一凉,立刻意识到:香港服务器暴露在跨境环境下,RDP 绝对是最脆弱的缺口。那一夜之后,我重新梳理了整套加固方案,并把组策略作为防御的核心骨架,一步步搭建出能经得住实战考验的防护体系。
现场背景与基础参数
机房与网络
- 位置:香港葵芳某 Tier III 机房
- 线路:双线接入(CN2 GIA + 本地国际 BGP),上联 1 Gbps,防火墙前置 L3 ACL 仅做粗粒度放行
- 典型跨境往返延迟:深圳 ↔ 香港 15–35ms,晚高峰抖动明显
- 公网策略:固定 EIP,RDP 需对外(业务值守、紧急变更使用)
服务器与系统
- 机型:Dell PowerEdge R640(双电源)
- CPU:Xeon Silver 4210(10C),内存 64GB
- 系统盘:2 × 960GB SSD(RAID1),数据盘:4 × 1.92TB SSD(RAID10)
- OS:Windows Server 2019/2022 混部(本文以 2019/2022 通用项为准)
- 角色:无域/有域混合:
- 单机(工作组)若干台,直接本地策略
- 域成员服务器(OU:HK-Servers)由 GPMC 下发域 GPO
攻击画像
主要来源:全球扫描 + 局部区域高频(含境内外云厂商 IP 段)
攻击方式:RDP 3389 端口暴露后字典/撞库型暴力尝试
典型特征:Security 日志 4625(LogonType 10 远程交互)爆增
总体防护思路(先给结论)
- 先收口:最小暴露面——端口漂移 + 源地址白名单(能白就白)。
- 再加固:靠组策略统一收敛:密码/锁定策略、NLA 强制、权限边界、RDP 加密与传输选择。
- 再设限:Windows Defender 防火墙按“允许优先,默认拒绝”管理 RDP;失败即封(脚本联动)。
- 可观测:审计策略 + 事件订阅/转发,失败阈值告警与自动阻断闭环。
- 能分层就分层:条件允许时上 RD Gateway + MFA(NPS + 短信/令牌),对外不直曝 3389。
- 可回滚:每条变更都有“反操作”,避免锁死。
快速清单(我在线上用的“开工表”)
| 类别 | 项 | 推荐值 | 目标 |
|---|---|---|---|
| 账号策略 | 锁定阈值 | 5 次 | 暴力尝试熔断 |
| 账号策略 | 锁定时长 | 30 分钟 | 减缓撞库效率 |
| 账号策略 | 重置计数 | 30 分钟 | 与锁定时长对齐 |
| RDP | NLA | 强制启用 | 预验证凭据 |
| RDP | 传输协议 | 仅 TCP(禁 UDP) | 稳定/审计清晰 |
| RDP | 加密级别 | High 或 FIPS | 传输加密 |
| 权限 | 允许通过 RDS 登录 | 仅授权组 | 缩小面 |
| 权限 | 拒绝通过 RDS 登录 | Guests/非授权 | 双保险 |
| 账户 | 重命名 Administrator | 自定义名 | 降低猜测命中率 |
| 防火墙 | RDP 对外策略 | 优先白名单;否则默认阻断 | 面向源收口 |
| 端口 | RDP 端口 | 非默认(如 51288) | 降低“被扫即撞”概率 |
| 审计 | 4624/4625/4771/4768 | 启用失败/成功 | 可追可溯 |
| 联动 | 失败阈值封堵 | 10 次/5 分钟 | 自动阻断 |
| 维护 | TTL 清理封堵规则 | 24 小时 | 防“封死误杀” |
组策略落地(域控与单机两套说法)
注:域环境用 GPMC(gpmc.msc)在 HK-Servers OU 新建 GPO;单机用本地组策略编辑器(gpedit.msc)。路径我同时给中文与英文,避免语言包差异带来的找不到。
1)账号锁定与密码策略
路径:
计算机配置 → Windows 设置 → 安全设置 → 账户策略 → 账户锁定策略
Computer Configuration → Windows Settings → Security Settings → Account Policies → Account Lockout Policy
- 账户锁定阈值(Account lockout threshold):5
- 账户锁定时间(Account lockout duration):30 分钟
- 复位锁定计数器(Reset account lockout counter):30 分钟
- 密码策略(同级目录下“密码策略”)建议:最小长度 ≥ 12、复杂性启用、最短使用期限 ≥ 1 天、历史记住 ≥ 24。
坑点:域里改“域密码策略”会影响整域。若只想管 RDP 服务器,考虑细化为**细化密码策略(FGPP)**或把锁定策略放在本地安全策略侧(配合 GPP-Registry 下发)。我线上优先使用“锁定策略域统一”,密码复杂度域统一,个别特例走 FGPP。
2)RDP 安全基线
路径:
计算机配置 → 管理模板 → Windows 组件 → 远程桌面服务 → 远程桌面会话主机 → 安全
Computer Configuration → Administrative Templates → Windows Components → Remote Desktop Services → Remote Desktop Session Host → Security
- 要求使用网络级别身份验证(Require user authentication for remote connections by using NLA):已启用
- 始终提示输入密码(Always prompt for password upon connection):已启用
- 客户端连接加密级别(Set client connection encryption level):High(如有合规要求选 FIPS)
- 选择 RDP 传输协议(Select RDP transport protocols):仅 TCP(Use only TCP)
路径(连接):
… → 连接(Connections)
- 限制连接数(Limit number of connections):根据运维并发设上限(比如 3–5)
- 空闲会话限制(Set time limit for active but idle RDS sessions):2 小时(或按需)
- 坑点:禁用 UDP 后,弱网下体验略降,但我的经验是稳定与可观测性更重要,跨境抖动下 TCP 更可控。
3)RDP 登录权限边界
路径:
计算机配置 → Windows 设置 → 安全设置 → 本地策略 → 用户权限分配
… → Local Policies → User Rights Assignment
- 允许通过远程桌面服务登录(Allow log on through Remote Desktop Services):仅加入你定义的域组,例如 HK-RDP-Operators。
- 拒绝通过远程桌面服务登录(Deny log on through Remote Desktop Services):Guests、不需要远程权限的默认组。
- 做法:专门建一个组(域:HK-RDP-Operators / 本地:RDP-Operators),把确需运维的账号加入,不要把 Domain Admins 等大权限组直接放进来。
4)重命名内置管理员、禁用来宾
路径:
计算机配置 → Windows 设置 → 安全设置 → 本地策略 → 安全选项
… → Security Options
- 账户:重命名管理员帐户(Accounts: Rename administrator account):自定义名(例如 svc_root_hk)
- 账户:来宾帐户状态(Accounts: Guest account status):已禁用
- 限制空口令本地账户仅允许控制台登录:已启用
- 坑点:如果你在别的自动化脚本里写死了 Administrator 名称,重命名会导致联机失败;先检查。
5)改变 RDP 端口(可选,但我一直做)
路径(注册表首选单位:GPP 下发):
计算机配置 → 首选项 → Windows 设置 → 注册表
项:HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber(REG_DWORD,十进制)
值:例如 51288
同步:同时在 Windows Defender 防火墙创建匹配端口的允许规则;否则改完端口直接“自绝于人”。
注意:端口漂移不是安全“银弹”,但非常有效地降低“被扫即撞”的噪声面,我的统计里 24 小时 4625 次数能降一个数量级。
6)Windows Defender 防火墙(按“白名单优先”)
路径:
计算机配置 → Windows 设置 → 安全设置 → 带高级安全的 Windows Defender 防火墙
入站规则:
- 删除/禁用默认 3389 允许规则;
- 新建 允许规则:作用于自定义端口(如 51288),远程 IP 限制为办公公网、跳板机 IP、堡垒机;
- 最后新建一条阻止规则:阻止所有其他源到 RDP 端口的连接(位置在“允许规则之后”无所谓,WFP 基于最佳匹配优先与权重,GPO 下发通常已满足顺序)。
- 出站规则:默认允许即可;如有合规再细化。
- 坑点:跨境办公有时公网 IP 会变化,要么走跳板/堡垒机,要么配合 DDNS + 脚本动态刷新规则(见下文自动封堵脚本思路)。
7)审计与日志转发
路径:
计算机配置 → Windows 设置 → 安全设置 → 高级审核策略配置 → 登录/帐户登录等
关键:
- 登录:成功/失败(Tracking 4624/4625)
- 帐户登录:Kerberos/NTLM 失败(4768/4771)
- 策略变更:成功/失败(审计 GPO 与本地策略修改)
- 事件转发(可选强烈建议):把 HK-Servers 的安全日志(过滤 4625)转发到集中日志服务器(WEF/WEC),便于统一告警。
- 自动封堵:用事件驱动 + 防火墙动态黑名单
- 核心逻辑:5 分钟内同源 IP 连续 ≥10 次 4625(LogonType=10),自动下发一条入站阻断规则,规则 TTL 24 小时自动清理。
我把它作为 计划任务(每 1 分钟)+ 启动脚本(兜底清理)下发;域环境用 GPP(首选项 → 控制面板设置 → 计划任务)。
PowerShell 核心脚本(可直接落地)
# AutoBlock-RDP.ps1
param(
[int]$WindowMinutes = 5,
[int]$Threshold = 10,
[int]$TtlHours = 24,
[int]$RdpPort = 51288, # 与实际端口一致
[string]$RuleGroup = "AutoBlockRDP"
)
# 1) 收集近窗口期 4625 且为远程交互(LogonType=10)的失败
$since = (Get-Date).AddMinutes(-$WindowMinutes)
$failures = Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=$since} -ErrorAction SilentlyContinue |
ForEach-Object {
$xml = [xml]$_.ToXml()
$data = @{}
foreach($d in $xml.Event.EventData.Data){ $data[$d.Name] = $d.'#text' }
[pscustomobject]@{
Ip = $data['IpAddress']
LogonType = $data['LogonType']
}
} |
Where-Object { $_.LogonType -eq '10' -and $_.Ip -and $_.Ip -ne '::1' -and $_.Ip -ne '127.0.0.1' }
# 2) 聚合并找出超阈值 IP
$badIps = $failures | Group-Object Ip | Where-Object { $_.Count -ge $Threshold } | Select-Object -ExpandProperty Name -Unique
# 3) 创建阻断规则(若已存在则跳过)
foreach ($ip in $badIps) {
$name = "AutoBlock-RDP-$ip"
if (-not (Get-NetFirewallRule -DisplayName $name -ErrorAction SilentlyContinue)) {
New-NetFirewallRule -DisplayName $name -Group $RuleGroup -Direction Inbound -Action Block `
-Protocol TCP -LocalPort $RdpPort -RemoteAddress $ip -Profile Any | Out-Null
Write-EventLog -LogName Application -Source "Windows PowerShell" -EventId 50001 -EntryType Information -Message "Blocked $ip on RDP"
}
}
# 4) 清理超过 TTL 的旧规则
$now = Get-Date
Get-NetFirewallRule -Group $RuleGroup -ErrorAction SilentlyContinue | ForEach-Object {
if ($_.TimeCreated -and (($now - $_.TimeCreated).TotalHours -gt $TtlHours)) {
Remove-NetFirewallRule -Name $_.Name
}
}
下发方式(域):
组策略首选项 → 控制面板设置 → 计划任务:
触发器:每 1 分钟
操作:powershell.exe -File C:\Windows\Scripts\AutoBlock-RDP.ps1 -RdpPort 51288
条件:仅接通电源/不唤醒(按需)
同时用“文件”首选项把脚本分发到 C:\Windows\Scripts\AutoBlock-RDP.ps1。
下发方式(单机):
任务计划程序本地创建同样的触发器与操作;或用 Startup Script(gpedit.msc → 计算机配置 → Windows 设置 → 脚本)做兜底。
现场经验:这段脚本把 4625 高频源 IP 的“噪声”快速剪掉,日志量立降 60%+。真正异常登录(比如撞库后成功 4624)会被阈值前置挡掉更多。
一表看全:GPO 下发项与取值(可拷贝成工单)
| 分类 | GPO 路径 | 策略项 | 取值/示例 |
|---|---|---|---|
| 账户锁定 | 账户策略 → 账户锁定策略 | 锁定阈值/时长/重置 | 5 / 30 / 30 |
| 密码 | 账户策略 → 密码策略 | 最小长度/复杂度/历史 | 12 / 启用 / 24 |
| RDP | RDS → 安全 | NLA/加密级别/仅 TCP | 启用/High/启用 |
| RDP | RDS → 连接 | 限制连接数/空闲限制 | 3–5 / 2h |
| 权限 | 本地策略 → 用户权限分配 | 允许/拒绝经 RDS 登录 | 仅 HK-RDP-Operators / 拒绝 Guests |
| 账户 | 本地策略 → 安全选项 | 重命名管理员/禁 Guest | 自定义 / 禁用 |
| 防火墙 | 带高级安全的 WDF | RDP 白名单/阻断 | 只允许办公/堡垒 IP;其余阻断 |
| 注册表 | 首选项 → 注册表 | RDP 端口 | HKLM...\PortNumber = 51288 |
| 审计 | 高级审核策略 | 登录/账户登录 | 成功+失败 |
| 计划任务 | 首选项 → 计划任务 | AutoBlock-RDP | 每 1 分钟执行 |
端口与规则:
- Test-NetConnection <EIP> -Port 51288(外部堡垒机执行),应可通;非白名单源应不通。
- NLA:旧版 RDP 客户端(无 NLA)连接应被拒。
- 锁定策略:用测试账户连续 5 次输错,账户应锁定 30 分钟。
- 自动封堵:从测试源快速错误登录 10 次,计划任务应生成 AutoBlock-RDP-<IP> 规则,24 小时后自动清理。
- 审计:安全日志 4625/4624/4768/4771 是否完整落库(如启用 WEF 也要检查订阅)。
我踩过的坑与解决过程
改端口忘了开防火墙允许规则
结果:远程直接断联。
解决:在 GPO 同一次提交里先下发允许规则,再改端口注册表;脚本里增加存活探测(任务最后 qwinsta/query user 检查有会话再结束)。
域密码策略影响到其他业务
结果:开发测试环境抱怨密码过期太快。
解决:把“密码复杂度/最短使用期限”留在域统一,针对具体服务器用 FGPP 或本地安全策略覆盖“锁定策略”。
UDP 被禁导致弱网卡顿
结果:个别同事反映输入延迟。
解决:跨境高抖动场景下我优先保留 TCP;个别需要 UDP 的机器单独放宽并贴标签(GPO 安全筛选)。
白名单 IP 经常变化
结果:人一在外地就连不上。
解决:统一走云堡垒或固定跳板;临时场景用脚本动态刷新规则(读取某个 DDNS 解析结果写入 RemoteAddress)。
把 Administrator 重命名后脚本失效
结果:批处理里写死 Administrator。
解决:脚本全部改为 SID 识别(S-1-5-21-…-500);或引用本地管理员组成员关系而非帐号名。
回滚与应急手册(别把自己锁外边)
- 防火墙回滚:保留一条隐藏的临时通道(例如仅允堡垒机/运维跳板 IP 的旧端口),变更成功后一小时内再撤。
- 脚本失误:Get-NetFirewallRule -Group AutoBlockRDP | Remove-NetFirewallRule 一键移除;必要时 netsh advfirewall reset(会重置全部,慎用)。
- 端口回滚:改回 3389,同时启用临时允许规则(先规则后端口)。
- 账户锁定:本地 / 域管理员登录控制台(iDRAC/ILO/KVM),在 lusrmgr.msc 解锁或等锁定过期。
进阶选项(条件允许请上)
- RD Gateway + NPS + MFA:对外只开 443,RDP 走网关并强制 MFA,真正把 3389 关死公网。
- LAPS/Windows LAPS:本地管理员随机强密码+定期轮换,防止凭据复用。
- Credential Guard / LSA 保护:抬高凭据窃取难度。
- 安全基线:以微软官方 Baseline 为蓝本,与你的 GPO 取值对齐(加固但不牺牲可用性)。
真实效果与数据(某批 12 台 HK-Servers 的一周对比)
| 指标 | 变更前(均值/天) | 变更后(均值/天) | 变化 |
|---|---|---|---|
| 4625(LogonType=10) | 14,200 | 1,080 | ↓ 92.4% |
| 触发封堵 IP(个) | — | 37 | — |
| 误封回滚(次) | — | 1 | — |
| 运维连接成功率 | 98.3% | 99.1% | ↑ 0.8pp |
| 平均登录时延(跨境) | 1.7s | 1.9s | +0.2s(禁 UDP 后可接受) |
注:以上为我线上真实区间的代表性数据(做了匿名化与平滑处理),你的环境会有差异,但降噪与可控的趋势基本一致。
附:命令行“秒落地”片段(单机快速试点)
用于 PoC 或单机;域环境请以 GPO 为准。
# 账户锁定策略(本地)
net accounts /lockoutthreshold:5 /lockoutduration:30 /lockoutwindow:30
# 强制 NLA、仅 TCP(通过本地组策略等效项更可控,这里给注册表/策略备忘)
# NLA 对应项通常通过 RDS 安全策略下发,命令行多用 PowerShell DSC/GPO 才标准
# 修改 RDP 端口
$newPort = 51288
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "PortNumber" -Value $newPort
New-NetFirewallRule -DisplayName "ALLOW-RDP-$newPort" -Direction Inbound -Action Allow -Protocol TCP -LocalPort $newPort -Profile Any
# 删除默认 3389 允许(若存在)
Get-NetFirewallRule | Where-Object {$_.DisplayName -match "Remote Desktop" -and $_.Enabled -eq "True"} | Disable-NetFirewallRule
# 审计(开启登录失败/成功)
auditpol /set /subcategory:"Logon" /success:enable /failure:enable
# 部署自动封堵脚本(示意)
$script = "C:\Windows\Scripts\AutoBlock-RDP.ps1"
# 将上文脚本保存到此路径,然后创建计划任务:
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File `"$script`" -RdpPort $newPort"
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddMinutes(1) -RepetitionInterval (New-TimeSpan -Minutes 1) -RepetitionDuration ([TimeSpan]::MaxValue)
Register-ScheduledTask -TaskName "AutoBlock-RDP" -Action $action -Trigger $trigger -RunLevel Highest -User "SYSTEM"
收尾与心法
- 把“谁能连上”当主战场:权限边界 + 源白名单 > 密码口令之争。
- 日志与自动化是双翼:看得见,才能挡得住;挡得住,才有底气减噪。
- 变更要有“退路”:任何一步都配套回滚方案,尤其跨境远程时。
- 组合拳,而非某一招:端口漂移、NLA、锁定、白名单、自动封堵、审计合在一起,效果才稳定。
回过头看,那套策略跑了几个月之后,我再翻安全日志,已经不会再见到漫天的 4625 洪水了,取而代之的是零星的几条失败尝试和定时的封堵记录。整个环境安静了下来,运维同事再也不用半夜被报警拉起来排查可疑登录。
在香港这种跨境网络环境里,RDP 就像一扇“永远有人来敲”的门,真正的挑战不是挡住一次攻击,而是要让这扇门背后的系统始终在自己掌控之中。组策略、白名单、端口漂移、自动化封堵……这些看似枯燥的配置,其实就是运维夜里能睡个安稳觉的底气。
如果你也在值守香港的服务器,我想你大概能理解那种半夜盯着安全日志的心情。把这套方案落地,你会发现,原本让人头皮发麻的暴力破解,只不过是几条不起眼的告警,像走廊里偶尔响起的脚步声,不再让你心惊胆战。