上一篇 下一篇 分享链接 返回 返回顶部

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

发布人:Minchunlin 发布时间:2025-08-17 10:35 阅读量:890


那天晚上,我正值夜班,香港机房的空调压缩机声像低沉的背景乐,伴随着一排排服务器蓝灯的闪烁。刚喝下一口温掉的咖啡,安全日志就像失控的瀑布一样刷屏——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 就像一扇“永远有人来敲”的门,真正的挑战不是挡住一次攻击,而是要让这扇门背后的系统始终在自己掌控之中。组策略、白名单、端口漂移、自动化封堵……这些看似枯燥的配置,其实就是运维夜里能睡个安稳觉的底气。

如果你也在值守香港的服务器,我想你大概能理解那种半夜盯着安全日志的心情。把这套方案落地,你会发现,原本让人头皮发麻的暴力破解,只不过是几条不起眼的告警,像走廊里偶尔响起的脚步声,不再让你心惊胆战。

目录结构
全文