Linux cryptsetup LUKS2 的加密分区与 TPM2 auto-unlock 集成

0次阅读

luks2 分区必须显式指定 –pbkdf argon2id 才能兼容 tpm2 auto-unlock,因默认 pbkdf2 会导致 systemd-cryptenroll 拒绝绑定;需验证 pbkdf 类型、tpm2 设备节点、initramfs 模块及 pcr 策略一致性。

Linux cryptsetup LUKS2 的加密分区与 TPM2 auto-unlock 集成

LUKS2 分区创建时必须启用 --pbkdf argon2id 才能兼容 TPM2 auto-unlock

TPM2 绑定密钥依赖 LUKS2 的 keyslot 类型和 PBKDF 参数,而默认 cryptsetup luksFormat 在某些发行版(如 debian 12、ubuntu 22.04+)仍可能用 pbkdf2,这会导致后续 systemd-cryptenroll 拒绝绑定 TPM2 —— 报错类似 Cannot enroll TPM2 Token: Not supported

  • 创建时显式指定 --type luks2 --pbkdf argon2id --iter-time 5000--iter-time 建议 ≥2000ms,太低会触发 TPM2 策略校验失败
  • 避免用 --pbkdf pbkdf2 或省略 --pbkdf(依赖 distro 默认值,不可靠)
  • 验证是否生效:cryptsetup luksDump /dev/sdX1 | grep -A5 "PBKDF",输出中应含 argon2id 和非零 Time cost

systemd-cryptenroll --tpm2-device=auto 失败的常见原因

不是所有 TPM2 设备都能直接 auto-detect;即使 tpm2_getcap properties.tpm 显示正常,systemd-cryptenroll 仍可能卡在策略生成或密钥导入阶段。

  • 确认内核已加载 tpm_tistpm_crb 驱动:dmesg | grep -i tpm 应有 TPM2 device detected
  • /dev/tpmrm0 必须存在且可读 —— 某些 BIOS 启用 TPM 后需手动 reboot 一次才能暴露该设备节点
  • UEFI Secure Boot 开启时,部分主板(如某些 Dell XPS)会限制 PCR 7 使用,改用 --tpm2-pcrs=0,2,4,7 不够稳妥;优先试 --tpm2-pcrs=0,2,4(跳过 PCR 7)
  • 若报 Failed to open TPM2 device: No such file or Directory,别急着装 tpm2-tss:先检查 ls /dev/tpm*,再确认 systemd-cryptenroll 是否为 v252+(旧版不支持 --tpm2-device=auto

initramfs 中必须包含 systemd-cryptsetuptpm2-tss 模块

即便 enrollment 成功,boot 时仍可能卡在 “Unlocking LUKS2 device…” —— 这通常不是密码输错,而是 initramfs 缺少 TPM2 解锁运行时依赖。

  • Debian/Ubuntu:运行 update-initramfs -u -k all 前,确保 /etc/crypttab 第四列含 tpm2(如 root UUID=xxx none luks,tries=3,timeout=60,remove=1,tpm2
  • Fedora/RHEL:需手动在 /etc/dracut.conf.d/tpm2.confinstall_items+=" /usr/lib/systemd/systemd-cryptsetup ",再执行 dracut -f
  • 验证 initramfs 内容:lsinitrd /boot/initramfs-$(uname -r).img | grep -E "(cryptsetup|tss|tpm)",至少应见 systemd-cryptsetuplibtss2*/dev/tpmrm0 设备节点

PCR 策略变更后无法自动解锁,但不会提示具体哪条 PCR 不匹配

TPM2 auto-unlock 是“全或无”策略:只要一个 PCR 值与 enrollment 时记录的不符(比如 kernel 更新触发 PCR 7 变更,或 BIOS 设置微调影响 PCR 0),整个解锁就静默失败,回落到密码输入。

  • 调试时加内核参数 rd.debug=1 rd.break=pre-mount,进 emergency shell 后手动跑 systemd-cryptenroll --tpm2-device=/dev/tpmrm0 --tpm2-pcrs=0,2,4 /dev/sdX1,观察是否报 PCR mismatch
  • 不要盲目重 enroll —— 先用 tpm2_pcrread sha256:0,2,4 对比当前 PCR 值和 cryptsetup luksDump 中 token 段里的 pcr0/pcr2 字段
  • 最稳妥的长期策略是固定 PCR 组合(如只用 0+2),并禁用可能扰动 PCR 7 的功能(如 Secure Boot + Measured Boot 混用)

真正麻烦的从来不是第一次配通,而是半年后某次 BIOS 升级或内核更新悄悄改了 PCR 0 —— 它不报错,只让你凌晨三点对着黑屏输密码。

text=ZqhQzanResources