在交付高安全性虚拟机时,我们面临一个矛盾:既要防止甲方通过控制台修改启动参数绕过登录,又要确保业务重启时能够自动进入系统。本文将演示如何利用 TPM 2.0 硬件信任根,在 VMware 环境下实现一套 “无感且强力” 的安全交付方案。

1. 方案设计与威胁模型

防护手段

  • 全磁盘加密 (LUKS):防止磁盘镜像被离线挂载窃取数据。

  • TPM 2.0 绑定:利用虚拟 TPM 存储密钥,实现 “合规硬件环境下自动开机,环境变更则需口令”。

  • GRUB 口令锁定:拦截控制台 init=/bin/bash 等提权操作。

边界限制

本方案可防御控制台越权和离线拷贝。若攻击者获取了 Hypervisor 最高管理员权限并克隆了带有 TPM 状态的完整 VM 快照,安全性将受挑战。

2. 第一阶段:VMware 虚拟硬件配置

在安装系统前,必须为虚拟机准备物理(虚拟)安全基础:

开启虚拟机加密

在 VMware 虚拟机设置 -> 选项 (Options) -> 访问控制 (Access Control) 中点击 加密 (Encrypt)。

微信图片_20260310152909_53_131.png

原因:VMware 要求必须先对虚拟机进行加密,才能添加虚拟 TPM 模块。

添加 TPM 设备

在 硬件 (Hardware) 选项卡中点击 添加 (Add) -> 可信平台模块 (Trusted Platform Module)。

ScreenShot_2026-03-10_153443_689.png

确认 UEFI 引导

在 选项 -> 高级 (Advanced) 中,确保固件类型为 UEFI,并建议开启 安全启动 (Secure Boot)。

ScreenShot_2026-03-10_153652_479.png

3. 第二阶段:带加密的 Ubuntu 24.04 安装

  1. 启动 Ubuntu 24.04 安装程序,在 “安装类型” 步骤,选择 “擦除磁盘并安装”。

  2. 点击 “高级功能 (Advanced Features)”,勾选 “在新的安装中使用 LVM 并启用加密”。

  3. 设置 LUKS 主密码:此密码是最高恢复权限,请妥善保存。在交付后,除非硬件环境变动,否则平时不需要输入它。

    ScreenShot_2026-03-10_155758_518.png

4. 第三阶段:配置 TPM 2.0 自动化解密

在 Ubuntu 24.04 中,由于默认引导工具对 TPM 支持不完善,我们需要切换到更强大的 Dracut 来处理引导过程,确保 LUKS + TPM 自动解密功能正常生效。

1) 切换到 Dracut 引导生成器

Dracut 原生支持 systemd-cryptsetup,是实现 TPM 自动解密的关键依赖工具。

sudo apt update
sudo apt install dracut tpm2-tools -y
# 注意:安装 dracut 会自动移除 initramfs-tools,这是正常操作

2) 配置 Dracut 引入 TPM 模块

强制 Dracut 在生成引导镜像时加入 TPM 支持,确保解密所需的核心模块被加载。

# 创建 Dracut 专属配置文件并启用 hostonly 模式
echo 'hostonly="yes"' | sudo tee /etc/dracut.conf.d/tpm2.conf
# 添加 TPM 2.0 支持模块
echo 'add_dracutmodules+=" tpm2-tss "' | sudo tee -a /etc/dracut.conf.d/tpm2.conf

3) 将 LUKS 密钥绑定到 TPM

将 LUKS 解密密钥绑定到 PCR 0(固件代码)和 PCR 7(安全启动状态),确保只有合规的硬件环境才能自动解密。

# 确认加密分区名称(例如 /dev/sda3 或 /dev/nvme0n1p3)
lsblk

# 执行 TPM 绑定操作(执行后需输入安装系统时设置的 LUKS 主密码)
sudo systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=0+7 /dev/sda3

4) 修改配置以支持自动解锁

编辑 /etc/crypttab 文件,确保 TPM 自动解密参数被正确识别。

sudo nano /etc/crypttab

修改后示例(关键参数说明):

sda3_crypt UUID=... none luks,discard,tpm2-device=auto

注意:请确保 tpm2-device=auto 紧跟在 discard 后面,使用英文逗号分隔,无多余空格。

5) 刷新并生成引导镜像

这是最关键的一步,使用 Dracut 重新生成内核引导文件,使所有配置生效。

# 为当前运行的内核生成新的 initrd 镜像(-f 强制覆盖原有文件)
sudo dracut -f --kver $(uname -r)

5. 第四阶段:GRUB 引导程序加固

为了防止甲方在 GRUB 界面通过快捷键篡改启动行为,需锁定编辑权限。

生成哈希密码

grub-mkpasswd-pbkdf2  # 记录输出的 grub.pbkdf2.sha512...

定义超级用户

编辑 /etc/grub.d/40_custom,添加:

set superusers="admin"
password_pbkdf2 admin <你的哈希值>

允许默认项免密启动

编辑 /etc/grub.d/10_linux,在 menuentry 行中插入 --unrestricted

# 搜索并修改如下
echo "menuentry '${title}' --unrestricted ${CLASS} ..."

更新 GRUB

sudo update-grub

6. 验证与交付检查

  1. 重启验证:系统应直接进入登录界面,无需手动输入磁盘密码。

  2. 权限测试:在 GRUB 菜单按 e,应强制要求输入 admin 账号密码。

  3. 迁移测试:若将该虚拟机文件拷贝到未授权的物理机上运行,由于 TPM 密钥不匹配,系统会弹出 LUKS 密码框,阻断非法访问