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

如何在香港服务器的 Windows Server 2022 上启用 Shielded VM,防止“恶意管理员”作祟

发布人:Minchunlin 发布时间:2025-09-03 09:15 阅读量:718


凌晨 2:40,我在香港葵涌的机房值夜。监控里,一个 SQL Server 实例 CPU 骤升、会话暴涨。我远程上去发现本地管理员密码被改过,RDP 审计里看不到登录记录,Hyper-V 的控制台也正常。那一刻我很清楚:如果底层宿主机的某个高权限账户动了手脚,传统的“客体 OS”审核根本挡不住。

那次事故让我在第二天一早就敲定了一个计划:把核心业务虚机全部“上盾”——启用 Shielded VM 和 Guarded Fabric。这篇文章,就是我在香港机房基于 Windows Server 2022 Datacenter 实战落地的完整过程、配置细节、坑点与复盘。

方案总览:Guarded Fabric 三件套

目标:让虚机即使被搬走 VHDX,或被未授权的 Hyper-V 宿主加载,也无法启动/解密磁盘或被本地控制台窥视。

核心组成:

  • HGS(Host Guardian Service):密钥与证明服务,建议独立域与三节点群集。
  • 受保护的 Hyper-V 宿主:通过 TPM/证书向 HGS 证明“我是谁 & 我很干净”。
  • Shielded VM:Gen2、vTPM、Secure Boot、BitLocker(由 vTPM 保护密钥)、可选禁用控制台。

证明模式(Attestation):

  • TPM-trusted(优先):宿主机有物理 TPM 2.0 + Secure Boot + CI 策略,可度量启动链。
  • Host Key(Admin-trusted):没有 TPM 也可用,用宿主机证书(或域)建立信任,门槛低但安全弱一些。
  • 许可要求:Shielded VM 与 HGS 均需 Windows Server 2022 Datacenter;受保护宿主也建议 Datacenter。来港上机的朋友别在许可上翻车。

我们的现场拓扑与清单(节选)

机柜与硬件(核心三类)

角色 型号与配置 关键参数 备注
HGS 节点 ×3 Dell R650 (Xeon Gold 6330 ×2 / 256GB / 2×480G SATA / iDRAC) TPM 2.0、UEFI、Secure Boot On 独立域 hgs.lab.hk
Hyper-V 宿主 ×6 Supermicro 1114S-WTRT (EPYC 7543P / 512GB / 2×3.84TB U.2 NVMe / 25GbE) TPM 2.0、IOMMU、SR-IOV、Datacenter 组成 S2D & 受保护宿主
管理/模板库 HPE DL360 Gen10 20TB NFS + 2×10GbE 放母盘、WAC、CA

网络/VLAN

VLAN 用途 网段 备注
10 管理 10.10.10.0/24 WAC/AD 管理平面
20 HGS 10.10.20.0/24 仅 HGS API(443),DNS 受限
30 业务 10.10.30.0/23 业务前后端
40 存储 172.16.40.0/24 S2D/备份

版本/角色

组件 版本 角色
Windows Server 2022 Datacenter 20348.x HGS/Hyper-V/S2D
Windows Admin Center 2311 创建/管理 Shielded VM
AD CS 企业根 CA 为 HGS/Host Key/TLS 发证

前置检查(别省,这些最容易踩坑)

  1. BIOS/UEFI:开启 UEFI、Secure Boot、Intel VT-d/AMD-VI(IOMMU)、SR-IOV;插好 TPM 2.0,清空/激活。
  2. 系统特性:宿主需装 Hyper-V、Isolated User Mode、Host Guardian Hyper-V Support。
  3. 版别:Datacenter。
  4. 网络与证书:HGS 专属 VLAN,443/TCP 开放;内部 PKI 颁发 HGS TLS;准备 CRL。
  5. VM 要求:Gen2、支持 Secure Boot;模板盘采用 VHDX,尽量固定大小(或在上盾前定型)。

步骤 1:部署 HGS(三节点,独立林)

为何要独立林? 设计原则是“安全边界最小化”。HGS 作为密钥/证明源,独立林更容易做最少信任与职责分离。

在三台 HGS 节点上(Windows Server 2022 Datacenter):

# 1) 安装角色
Install-WindowsFeature HostGuardianService -IncludeManagementTools

# 2) 初始化第一个 HGS 节点(建立 HGS 林与服务)
$dsrm = Read-Host "DSRM 密码" -AsSecureString
Initialize-HgsServer `
  -HgsDomainName "hgs.lab.hk" `
  -HgsServiceName "HGS" `
  -SafeModeAdministratorPassword $dsrm

加入其余两台节点到 hgs.lab.hk 后,在其中任一台执行:

# 3) 创建 HGS 群集(使用现有 AD 站点/复制,或配合 LB/VIP)
Install-WindowsFeature Failover-Clustering -IncludeManagementTools
# 通过故障转移群集管理器建 3 节点群集(略)

为 HGS 配置 TLS 证书 与 服务 URL(示例走 443,DNS 指向 VIP):

# 4) 配置 HGS 端点(Attestation & Key Protection)
Set-HgsServer `
  -AttestationServerUrl "https://hgs-api.hgs.lab.hk/Attestation" `
  -KeyProtectionServerUrl "https://hgs-api.hgs.lab.hk/KeyProtection"

小贴士:生产里把 HGS 的 Attestation 与 KeyProtection 走同一 VIP 简化网络,但在 WAF/SLB 上分两条转发策略便于审计与限流。

步骤 2:选择证明模式并登记宿主

2.1 我们选 TPM-trusted(推荐)

在宿主(Hyper-V 主机)侧先导出“平台标识”和(可选)代码完整性(CI)策略:

# 宿主机执行 —— 导出 TPM 平台标识(含 EKpub/AIK 等)
$plat = Get-HgsClientPlatformIdentifier
$plat | Export-Clixml "C:\temp\HV01_platformId.xml"

# 生成并应用 Code Integrity 策略(可选但强烈建议)
New-CIPolicy -Level PcaCertificate -FilePath C:\temp\ci.xml -UserPEs 0
ConvertFrom-CIPolicy C:\temp\ci.xml C:\temp\ci.bin
Copy-Item C:\temp\ci.bin "C:\Windows\System32\CodeIntegrity\SIPolicy.p7b"
Restart-Computer

在 HGS 侧登记宿主平台:

# 将宿主导出的平台标识文件拷到 HGS 节点后执行
Add-HgsAttestationTpmHost -Path "C:\share\HV01_platformId.xml" -Name "HV01"
Add-HgsAttestationTpmHost -Path "C:\share\HV02_platformId.xml" -Name "HV02"
# ……批量导入即可

切换 HGS 到 TPM 信任模式:

Set-HgsServer -TrustTpm

注意:如果你暂时没有 TPM 2.0,可以先用 Host Key 跑起来(见下),后续补 TPM 再切换。

2.2(可选)Host Key 模式的要点(我在测试区用过)

在每台宿主机生成并注册主机证书:

# 宿主机:生成 Host Key 证书(使用企业 CA 签发更佳)
$cert = New-SelfSignedCertificate -DnsName "HV01.lab.hk" -CertStoreLocation Cert:\LocalMachine\My
Export-Certificate -Cert $cert -FilePath C:\temp\HV01_hostkey.cer

在 HGS 侧导入:

Add-HgsAttestationHostKey -Name "HV01" -Path "C:\share\HV01_hostkey.cer"
Set-HgsServer -TrustHostKey

步骤 3:让宿主“认识”HGS,并自检

每台宿主机:

# 1) 安装隔离/守护支持(如未装)
Install-WindowsFeature Hyper-V, HostGuardian -IncludeAllSubFeature -IncludeManagementTools

# 2) 指定 HGS 端点(与前面 HGS 设置一致)
Set-HgsClientConfiguration `
  -AttestationServerUrl "https://hgs-api.hgs.lab.hk/Attestation" `
  -KeyProtectionServerUrl "https://hgs-api.hgs.lab.hk/KeyProtection"

# 3) 连通性 & 状态自检
Get-HgsClientConfiguration
Get-HgsAttestationStatus

常见红灯与我的处理:

  • Connectivity: Blocked → 防火墙/WAF 忘放 443 或 CRL/OCSP 出口。
  • IsHostGuarded: False → 还没加到 HGS(TPM 平台标识未导入/证书未导入)。
  • CodeIntegrity: NotEnforced → CI 策略路径或签名问题,确认 SIPolicy.p7b 已加载。

步骤 4:打造“可信模板盘”与 Shielding Data(PDK)

目标:让 VM 只能从被“认得”的模板盘部署,且部署参数(如本地 Admin 密码/域加入)被HGS Guardian + Owner Guardian 共同保护。

4.1 准备模板盘(母盘)

用 Gen2 虚机装好 Windows Server 2022,打齐补丁、装常用代理、关机。

Sysprep /generalize /oobe /shutdown。

产出 Win2022-Base.vhdx(存放在模板库)。

模板盘尽量固定大小,避免后续扩容触发度量不一致。

4.2 在“模板/运维跳板机”安装 Shielded VM 工具

Add-WindowsCapability -Online -Name Rsat.ShieldedTools~~~~0.0.1.0

4.3 对模板盘打“模板签”(Template Disk)

Protect-TemplateDisk `
  -Path "D:\Templates\Win2022-Base.vhdx" `
  -TemplateName "Win2022-Base-2025-08" `
  -Version "1.0"

4.4 准备 Guardian:Owner 与 HGS

在 HGS 一侧导出 HGS Guardian 公钥;在模板/跳板机生成 Owner Guardian(代表我们运维方):

# HGS 节点:导出公钥给运维
Get-HgsGuardian -Name "HGS" | Export-HgsGuardian -Path "\\jump\share\HGSGuardian.cer" -Public

# 跳板机:生成 Owner Guardian(或导入既有)
New-HgsGuardian -Name "OpsOwner" -GenerateCertificates
Get-HgsGuardian -Name "OpsOwner" | Export-HgsGuardian -Path "C:\temp\OpsOwner.cer" -Public

4.5 生成 Shielding Data(.PDK)

准备一个无人值守 XML(域加入/本地管理员随机密码策略等),然后:

New-ShieldingDataFile `
  -ShieldingDataFilePath "C:\temp\HK-Prod-Join.pdk" `
  -TemplateDiskPath "D:\Templates\Win2022-Base.vhdx" `
  -Owner (Get-HgsGuardian -Name "OpsOwner") `
  -Guardian (Get-HgsGuardian -Name "HGS") `
  -Policy "AdminPasswordRandom", "DisallowVMC" `
  -UnattendXmlPath "C:\temp\unattend-domainjoin.xml"

DisallowVMC 可以禁止 Hyper-V 控制台交互(VMC),进一步降低本地窥探面(我在生产都启了)。

步骤 5:创建 Shielded VM(或给存量 VM“套盾”)

5.1 新建 Shielded VM(从被保护模板 + PDK)

Windows Admin Center(WAC)里最顺滑:

Virtual Machines → Add → 选择模板盘 Win2022-Base.vhdx → 勾选 Make this VM shielded → 选择 HK-Prod-Join.pdk → 指定宿主群集与虚拟交换机 → 部署。

WAC 会自动做下面这些 PowerShell 事情:

# (示意)核心动作:为 VM 设置密钥保护器 + vTPM
$hgs = Get-HgsGuardian -Name "HGS"
$owner = Get-HgsGuardian -Name "OpsOwner"
$kp = New-VMKeyProtector -Owner $owner -Guardian $hgs

New-VM -Name "DB-Prod-01" -Generation 2 -VHDPath "D:\VMs\DB-Prod-01.vhdx" -MemoryStartupBytes 8GB -SwitchName "vSwitch-Prod"
Set-VMSecurity -VMName "DB-Prod-01" -KeyProtector $kp -ShieldingRequested On
Enable-VMTPM -VMName "DB-Prod-01"

结果:

  • VM 的 vTPM 密钥只会在**通过 HGS 证明的“受信宿主”**上解封;
  • VHDX 被 BitLocker 透明加密,搬走盘也没用;
  • (若启用)控制台阻断,必须走你允许的远程通道(比如企业跳板/RDP/WinRM/代理)。

5.2 现有 VM“套盾”(我迁了几台老生产)

前置:把老 VM 转为 Gen2(不行就迁移重建,别硬怼)。然后:

# 为存量 VM 注入 Key Protector + vTPM 并请求 Shielding
$kp = (Get-HgsGuardian -Name "HGS","OpsOwner" | New-VMKeyProtector)
Set-VMSecurity -VMName "APP-Old-07" -KeyProtector $kp -ShieldingRequested On
Enable-VMTPM -VMName "APP-Old-07"

提醒:如果老 VM 的系统盘没用母盘签名/PDK,首次启用会做卷保护与测量,谨慎选维护窗。

步骤 6:验证与攻防思维

我做了三组验证,建议你也照做:

  • 搬盘测试:把 DB-Prod-01.vhdx 拷到未受信的测试宿主上挂载启动 → 启动失败,vTPM 密钥无法解封。
  • 控制台窥探:在受信宿主上尝试 Hyper-V 控制台连接 → 被策略拒绝(启用 DisallowVMC 时)。
  • 宿主“染污”:临时关闭 Secure Boot/替换启动驱动 → Get-HgsAttestationStatus 失败,Shielded VM 不会启动。

现场常见坑与我的处理手记

症状 现场排查 解决
Get-HgsAttestationStatus = NotApplicable/Unknown HGS URL 能 ping 但抓包无 TLS 握手 宿主代理/安全基线拦了 443,放行并加 HGS URL 直连白名单
PDK 导入失败/模板不匹配 Protect-TemplateDisk 的模板名与版本没对上 统一模板命名规范,版本号入库(WAC 标注),更新 PDK
Gen1 VM 套盾失败 旧虚机是 Gen1 迁移重建(Disk2VHD 不行),或新建 Gen2 并数据级迁移
CI 策略一开驱动挂 第三方 HBA/NIC 驱动未签 重签/换驱动,CI 用 PcaCertificate 级别重新学习生成
证书链报错 HGS/Host Key 用了企业 CA,但 CRL 不可达 为 HGS 网段开放 CRL/OCSP 出口,CRL 配置短期过期提前刷新
启用 Shielded VM 后备份挂了 代理走控制台或挂载 VHDX 的老法子 统一改为 主机级快照 API 或代理内备份,别再摸底层盘

运维与治理建议(我现在的日常)

  • 备份 Guardian 证书材料:Owner/HGS Guardian 私钥离线保管 + 双人双锁。
  • 证书轮换:把 Host Key/HGS TLS 纳入 PKI 生命周期。
  • 变更窗口:套盾/解盾/CI 策略变更都进变更单,预演 + 回滚。
  • 最小授权:宿主只给到需要的人;WAC/RDP 必须经堡垒审计。
  • HGS DR:三节点跨机架,定期模拟一节点失效 + DNS 切换演练。
  • 基线即代码:将 Set-HgsClientConfiguration、模板签名、PDK 生成脚本纳入 Git,跑流水线发版。

我用到的关键命令速查(收藏级)

# 宿主与 HGS 互认
Get-HgsClientConfiguration
Set-HgsClientConfiguration -AttestationServerUrl "https://.../Attestation" -KeyProtectionServerUrl "https://.../KeyProtection"
Get-HgsAttestationStatus

# HGS 侧
Add-HgsAttestationTpmHost -Path .\HV01_platformId.xml -Name HV01
Add-HgsAttestationHostKey -Path .\HV01_hostkey.cer -Name HV01
Set-HgsServer -TrustTpm    # 或 -TrustHostKey

# 模板与 PDK
Protect-TemplateDisk -Path .\Win2022-Base.vhdx -TemplateName "Win2022-Base-2025-08" -Version "1.0"
New-ShieldingDataFile -ShieldingDataFilePath .\HK-Prod-Join.pdk -TemplateDiskPath .\Win2022-Base.vhdx -Owner (Get-HgsGuardian -Name OpsOwner) -Guardian (Get-HgsGuardian -Name HGS)

# VM 上盾
$kp = (Get-HgsGuardian -Name "HGS","OpsOwner" | New-VMKeyProtector)
Set-VMSecurity -VMName "App01" -KeyProtector $kp -ShieldingRequested On
Enable-VMTPM -VMName "App01"

日志位置(排障非常有用)

宿主:Event Viewer → Applications and Services Logs → Microsoft → Windows → HostGuardianService-Client/Operational

HGS 服务器:... → HostGuardianService-Server/Operational、.../Attestation、.../KeyProtection

必要端口

宿主 → HGS:TCP 443(Attestation/KeyProtection)

宿主 → PKI:TCP 80(CRL/OCSP,视环境)

结尾:再也睡得着的凌晨

那批核心虚机上盾后,我刻意做了几次“红队式”演练:
把 VHDX 拖到实验宿主上、试着用本地管理员连控制台、甚至拔掉宿主的 Secure Boot 再重启。Shielded VM 毫不买账。
几周后,外包团队有人离职,交接时我们让他“尽情尝试”。结果当然——一无所获。
我在机房长椅上打了个盹,醒来时是清晨 6 点,冷气还那么足,但心是热的:安全这事,不靠喊口号,靠的是把“能力边界”压成制度与技术,Shielded VM 就是那个能落地的边界。

附:最小可行清单(MVP)——给赶时间的你

  1. 三台 Windows Server 2022 Datacenter(HGS,独立域),TLS/PKI 就绪。
  2. 宿主机开启 UEFI/Secure Boot/TPM 2.0,装 Hyper-V + Host Guardian 支持。
  3. HGS 选 TPM 模式,导入宿主平台标识,宿主指向 HGS URL 并通过自检。
  4. 用 Protect-TemplateDisk 对母盘签名,New-ShieldingDataFile 生成 PDK。
  5. 用 WAC 或 PowerShell 创建 Shielded VM(或为存量 VM “套盾”)。
  6. 做三项验证:“搬盘”、“控制台”、“宿主染污”。通过,才算真的上线。
目录结构
全文