香港服务器的Windows Server 2016如何启用Credential Guard,防止跨境网络环境下的凭证窃取攻击?

那天凌晨两点,内地—香港专线刚从维护中恢复,几台对外提供 ERP 和跳板登录的 Windows Server 2016 服务器相继上线。安全审计同事丢给我一句话:“跨境登录链路太复杂,RDP 用得多,尽快把 Credential Guard 上起来,别让 LSASS 里的东西被人顺手牵羊。”
我看了看工单,又看了看摆在机柜顶上的螺丝刀——今晚注定不是纯软件活,得从 BIOS 到组策略一路走到底。
我这次的环境与风险模型
物理/虚拟基础(可对照你自己的环境替换)
| 项目 | 参数(本次实际) | 备注 |
|---|---|---|
| 机型 | 1U 独服,Xeon Silver 4210R ×1,64GB RAM | 支持 VT-x/VT-d |
| 启动 | UEFI,Secure Boot 已开启 | 必要前提 |
| TPM | 固件 TPM(PTT)2.0,已激活 | 非强制,但强烈推荐 |
| 存储 | NVMe 1.92TB(系统+日志分区分离) | 便于开启 BitLocker |
| OS | Windows Server 2016 Datacenter(英文版,核心/桌面混部) | 统一补丁水平 |
| 网络 | 香港出口 + IPsec 到内地办公网 + 独立跳板 VLAN | 典型跨境场景 |
| 虚拟化 | 部分为物理机、部分为 Hyper-V/VMware VM | VM 需额外配置 VBS 支持 |
威胁模型(简化)
- 大量跨境 RDP/WinRM/SMB 管理操作 → 存在“传递哈希/票据(PtH/PtT)”风险。
- 旧运维工具/脚本可能在服务器落地可重放的凭据(WDigest/Nego 缓存)。
- 被控主机一旦被提权,直接读 LSASS 抓明文/NTLM/票据是最常见的横向入口。
目标:启用 Credential Guard(基于 VBS 的隔离 LSA/LSAISO),把可用于横向移动的敏感凭据隔离在受 Hyper-V 保护的内存中,从源头降低“抓凭据→横移”的可行性。
Credential Guard 工作原理的“运维视角”
VBS(Virtualization-Based Security) 启动后,系统用 Hyper-V 的微型 Hypervisor 在内存中切一片“圈外地带”,跑一个 LSAISO(Isolated LSA)。
本地系统 LSASS 不再直接保管那些“能横移的宝贝”(如 Kerberos TGT、NTLM 派生值),查询时通过受保护的通道向 LSAISO 请求。
即便攻击者拿到 SYSTEM 权限,试图在线 dump LSASS,也只摸到“空袋子”。配合 LSA 保护(RunAsPPL) 与 WDigest 关闭,能显著抬高进攻成本。
启用前的三项硬件/固件前置检查
我是先在现场“干确认,再动配置”,否则半夜一重启,开不了机就是事故。
UEFI + Secure Boot
进入 BIOS/UEFI:开启 UEFI Boot,Secure Boot(一般在 Security 或 Boot 菜单)。
部分主板要先清除旧密钥再装载出厂密钥(Factory Keys)才能启用 Secure Boot。
虚拟化与 IOMMU
Intel VT-x/AMD-V 与 VT-d/AMD-Vi(IOMMU) 都要启用。
这关系到 VBS 的内存隔离和 DMA 保护能力(Server 2016 时代主要是“Secure Boot 模式”,有 IOMMU 更好)。
TPM 2.0(推荐)
打开固件 TPM(PTT/fTPM)并 Activate/Own。
方便把 Credential Guard 和 BitLocker 的保护链打通(度量启动/密钥保护)。
Windows 内快速自检(不开机房门能做的):
# UEFI + Secure Boot
Confirm-SecureBootUEFI
# TPM
Get-Tpm
# 虚拟化支持(核对 Hyper-V 要求项)
systeminfo | findstr /i "Hyper-V"
- Confirm-SecureBootUEFI 返回 True 即安全启动开启。
- Get-Tpm 里 TpmPresent/TpmReady/ManagedAuthLevel 看状态。
- systeminfo 末尾 4 行与 Hyper-V 相关能力全部为 “是/Yes” 最稳。
三条启用路线图(按我现场采用频率排序)
路线 A:组策略(批量/标准化,最推荐)
GPO 路径
计算机配置 → 管理模板 → 系统 → Device Guard → 启用基于虚拟化的安全
启用
- “基于虚拟化的安全平台安全功能” 选 仅 Secure Boot(Server 2016 一般选这项即可)。
- “Credential Guard 配置” 选 启用(带 UEFI 锁)(生产机优先),或先 不带 UEFI 锁 做灰度。
应用并重启。重启后 hypervisor 必须启动。
可配套的两个策略(强烈建议一起)
- 计算机配置 → 管理模板 → 系统 → 本地安全机构 → 将 LSASS 作为受保护进程运行(LSA 保护/RunAsPPL)。
- 计算机配置 → 管理模板 → 系统 → 凭据分配 → 关闭 WDigest,限制 委派。
路线 B:PowerShell/注册表(Server Core 或半自动化)
灰度期我常用这套,一台台推进,观察兼容性。
# 1) 确保 Hypervisor 启动
bcdedit /set hypervisorlaunchtype Auto
# 2) 打开 VBS(Secure Boot 模式)
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DeviceGuard" -Force | Out-Null
New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DeviceGuard" `
-Name "EnableVirtualizationBasedSecurity" -PropertyType DWord -Value 1 -Force | Out-Null
# 1=仅 Secure Boot,3=Secure Boot+DMA 保护(硬件/IOMMU 支持时)
New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DeviceGuard" `
-Name "RequirePlatformSecurityFeatures" -PropertyType DWord -Value 1 -Force | Out-Null
# 3) 启用 Credential Guard(1=启用并加 UEFI 锁,2=启用不加锁)
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\CredentialGuard" -Force | Out-Null
New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\CredentialGuard" `
-Name "LsaCfgFlags" -PropertyType DWord -Value 1 -Force | Out-Null
# 4)(推荐)开启 LSA 保护
New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Force | Out-Null
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" `
-Name "RunAsPPL" -PropertyType DWord -Value 1 -Force | Out-Null
# 5)(确认)WDigest 不缓存明文
New-Item -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest" -Force | Out-Null
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest" `
-Name "UseLogonCredential" -PropertyType DWord -Value 0 -Force | Out-Null
Write-Host "配置完成,重启后生效。"
关于“UEFI 锁”:选 1(带锁)后,OS 侧无法直接关闭 Credential Guard,需要改固件/清除安全设置或重装;生产稳,回退不便。灰度可先用 2。
路线 C:在虚拟机内启用(VMware/Hyper-V)
VMware ESXi:虚拟机需 UEFI + Secure Boot,开启 Virtualization Based Security、Expose hardware assisted virtualization、IOMMU/虚拟化 VT-d(版本与硬件需支持)。
Hyper-V:宿主为 Server 2016+;来宾 VM 勾选 Enable Secure Boot(模板选择 Microsoft Windows),必要时打开 vTPM(增强度量/BitLocker 方案)。
云厂商香港区:大多支持 UEFI/Secure Boot/TPMv2 的新一代实例规格;老代实例可能不支持 VBS——评估迁移。
一键体检/开关脚本(我投产用的“保守版”)
用法:先在一台非关键节点跑 -AuditOnly 看结果,再选 -Enable;遇到异常时用 -Report 生成文件回传审计。
function Test-CGStatus {
$dg = Get-CimInstance -ClassName Win32_DeviceGuard
[PSCustomObject]@{
VBSStatus = $dg.VirtualizationBasedSecurityStatus # 0=Off; 1=SecureBoot; 2=SecureBoot+DMA
Configured = ($dg.SecurityServicesConfigured -join ',') # 1=CG; 2=HVCI
Running = ($dg.SecurityServicesRunning -join ',') # 1=CG; 2=HVCI
SecureBoot = (Confirm-SecureBootUEFI -ErrorAction SilentlyContinue)
TPM = (Get-Tpm | Select-Object -ExpandProperty TpmPresent)
Hypervisor = (bcdedit /enum | findstr /i "hypervisorlaunchtype")
}
}
param(
[switch]$AuditOnly, [switch]$Enable, [switch]$Disable, [string]$Report="C:\Temp\CG-Audit.json"
)
if ($AuditOnly) {
$r = Test-CGStatus
$null = New-Item -Path (Split-Path $Report) -ItemType Directory -Force
$r | ConvertTo-Json | Out-File $Report -Encoding UTF8
Write-Host "审计完成:$Report"
return
}
if ($Enable) {
bcdedit /set hypervisorlaunchtype Auto | Out-Null
New-Item "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DeviceGuard" -Force | Out-Null
New-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DeviceGuard" -Name EnableVirtualizationBasedSecurity -Type DWord -Value 1 -Force | Out-Null
New-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DeviceGuard" -Name RequirePlatformSecurityFeatures -Type DWord -Value 1 -Force | Out-Null
New-Item "HKLM:\SOFTWARE\Policies\Microsoft\Windows\CredentialGuard" -Force | Out-Null
New-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\CredentialGuard" -Name LsaCfgFlags -Type DWord -Value 1 -Force | Out-Null
New-Item "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Force | Out-Null
New-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name RunAsPPL -Type DWord -Value 1 -Force | Out-Null
New-Item "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest" -Force | Out-Null
New-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest" -Name UseLogonCredential -Type DWord -Value 0 -Force | Out-Null
Write-Host "已启用,重启后生效。"
}
if ($Disable) {
# 温和回退:不触碰 UEFI 锁,仅将策略/注册表设为关闭
New-Item "HKLM:\SOFTWARE\Policies\Microsoft\Windows\CredentialGuard" -Force | Out-Null
New-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\CredentialGuard" -Name LsaCfgFlags -Type DWord -Value 0 -Force | Out-Null
New-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DeviceGuard" -Name EnableVirtualizationBasedSecurity -Type DWord -Value 0 -Force | Out-Null
Write-Host "已标记为禁用(若曾加 UEFI 锁,仍需固件层面回退)。"
}
验证是否“真的在跑”
方式 1:PowerShell
Get-CimInstance -ClassName Win32_DeviceGuard | fl *
关注:
VirtualizationBasedSecurityStatus:1/2 表示 VBS On(1=Secure Boot,2=Secure Boot+DMA)。
SecurityServicesConfigured 与 SecurityServicesRunning:包含 1 代表 Credential Guard 已配置/已运行。
方式 2:msinfo32
打开 系统信息 → Device Guard 安全服务:应看到 Credential Guard 已运行。
方式 3:事件日志(可选)
应用和服务日志 → Microsoft → Windows → DeviceGuard/Operational中有启动事件。
我遇到的“坑位地图”与当场解法
| 坑点 | 现象 | 根因/定位 | 现场解法 |
|---|---|---|---|
| 服务器重启后提示不支持 VBS | SecurityServicesConfigured=1 但 Running 为空 |
BIOS 虽是 UEFI,但 Secure Boot 未真正启用(密钥丢失/自签) | 在 UEFI 里恢复出厂 PK/KEK/DB/DBX,再启用 Secure Boot |
| VMware VM 内 VBS 启不起来 | VirtualizationBasedSecurityStatus=0 |
VM 仍是 Legacy BIOS 或未勾 VBS/Expose VT-x | 关机 → 切 UEFI + Secure Boot → 打开 VBS 相关复选项,再开机 |
| 装了第三方旧驱动后蓝屏 | 开启后偶发 HVCI 冲突 | 老驱动不兼容内核代码完整性(即便只开 CG,部分厂商驱动也误伤) | 分阶段:先只开 CG,HVCI 留到兼容性清点后再开 |
| RDP 工具链被策略打断 | 某些“自动输入密码”的工具失效 | Credential Guard + LSA 保护后,某些注入/读取路径不可用 | 收敛工具链,推行 Remote Credential Guard/凭据委派限制 |
| 想回退却发现锁死 | 政策改回 0 也不生效 | UEFI 锁 生效 | 变更记录要留好。灰度期用 LsaCfgFlags=2;生产一旦锁定,要走固件/重装回退流程 |
与跨境运维配套的“正确姿势”(把链条补齐)
Remote Credential Guard(客户端侧)
从内地办公网登录香港服务器,要求客户端(Win10/11/Server 2016+)启用 Remote Credential Guard 来替代明文凭据下发。
组策略:计算机配置 → 管理模板 → 系统 → 凭据委派 → 仅使用 Remote Credential Guard。
或在客户端用:mstsc.exe /remoteGuard。
本地管理员口令随机化(LAPS 或 LAPS NG)
避免“同一把本地管理员密码走天下”,防爆破、防横移。
最小化管理会话
推 JEA/PowerShell Just-Enough-Admin,RDP 只进跳板。
SMB/管理共享按需启用,审计纵深做细(进/出站防火墙 + Sysmon)。
BitLocker + TPM
把磁盘落地 dump 的空间收紧,尤其日志/转储分区;TPM 绑定度量启动链。
变更与验证:我在现场的“前后对比”
| 指标 | 变更前 | 启用 CG+LSA 保护 后 | 备注 |
|---|---|---|---|
| 本机 LSASS 可读出可用票据/哈希 | 高 | 极低 | 内存抓取基本失效 |
| 登录耗时(域控在香港) | 约 2.0 s | 约 2.2 s | +0.2s,肉眼无感 |
| CPU 峰值(批量 RDP 并发 30 会话) | 58% | 60% | 开销 ≈ 1–2% |
| 故障回退难度 | 低 | 中(UEFI 锁) | 灰度期先无锁 |
以上为我当晚在两组服务器上的实测均值,用作参考;不同硬件与负载结果会有差异。
变更回滚与应急(万一要退)
- 策略回滚:把 LsaCfgFlags=0、EnableVirtualizationBasedSecurity=0;重启。
- 已加 UEFI 锁:需到 UEFI/固件里清除安全配置或重新部署 OS 才能完全关闭。
- 兼容性救火:若只是极个别驱动冲突,先保持 CG 开启,关闭 HVCI(本文默认未强制开启 HVCI)。
交付清单(我给审计和同事的“验收包”)
- 配置基线:GPO 导出/注册表快照。
- 验证截图:msinfo32 的 Device Guard 区域、Get-CimInstance Win32_DeviceGuard 输出。
- 变更记录:哪些服务器加了 UEFI 锁,哪些还在灰度。
- 应急 SOP:驱动不兼容时的处理顺序与维护窗口申请模板。
清晨五点走出机房,天刚泛白。我在巡检脚本里看着最后一台 Server 2016 报告 SecurityServicesRunning = 1,心里那根弦才松下来。
跨境的链路不会因此变得更短,运维的夜也不会更安稳,但 把凭据离攻击者远远地放在隔离区,至少我们不再把钥匙挂在门上。下一次审计来临时,我有底气摊开这份变更记录,也有勇气把故事讲给后来的人听。
附:关键注册表与含义速查
| 路径 | 键 | 值 | 含义 |
|---|---|---|---|
HKLM\SOFTWARE\Policies\Microsoft\Windows\DeviceGuard |
EnableVirtualizationBasedSecurity |
1 |
开启 VBS |
| 同上 | RequirePlatformSecurityFeatures |
1 或 3 |
1=仅 Secure Boot;3=加 DMA 保护(硬件支持时) |
HKLM\SOFTWARE\Policies\Microsoft\Windows\CredentialGuard |
LsaCfgFlags |
1/2/0 |
1=启用+UEFI 锁;2=启用无锁;0=禁用 |
HKLM\SYSTEM\CurrentControlSet\Control\Lsa |
RunAsPPL |
1 |
LSA 作为受保护进程 |
HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest |
UseLogonCredential |
0 |
不缓存明文凭据 |
最后一句提醒
- 先灰度,再上 UEFI 锁。
- 现场硬件差异 很大,VM 与物理机的 VBS 兼容性要分别验证。
- Credential Guard 不是银弹,把登录链、最小权限、审计一起补上,效果才完整。