systemd-cryptenroll
- systemd-cryptenroll 是一个用于将硬件安全令牌和设备注册到 LUKS2 加密卷的工具,这些令牌和设备随后可在启动期间用于解锁卷。
systemd-cryptenroll 允许将智能卡、FIDO2 令牌和可信平台模块安全芯片以及普通密码注册到 LUKS 设备中。这些设备稍后由 systemd-cryptsetup@.service(8) 使用注册的令牌解锁。
安装
systemd-cryptenroll 是 systemd 的一部分并随其打包。但是,使用硬件设备作为密钥需要额外的软件包
- 要使用 PKCS#11 令牌,安装 libp11-kit,您可能还需要 opensc 和 opensc-p11-kit-moduleAUR。
- 要使用 FIDO2 令牌,安装 libfido2。
- 要使用 TPM2 设备,安装 tpm2-tss。
列出密钥槽位
systemd-cryptenroll 可以列出 LUKS 设备中的密钥槽位,类似于 cryptsetup
luksDump,但格式更用户友好。
# systemd-cryptenroll /dev/disk
SLOT TYPE 0 password 1 recovery 2 tpm2
擦除密钥槽位
# systemd-cryptenroll /dev/disk --wipe-slot=SLOT
其中 SLOT 可以是
- 单个密钥槽位索引,如 #列出密钥槽位 中所示
- 密钥槽位的类型,这将擦除该类型的所有密钥槽位。有效类型为
empty
、password
、recovery
、pkcs11
、fido2
、tpm2
- 以上所有类型的组合,以逗号分隔
- 字符串
all
,它会擦除设备上的所有密钥槽位。仅当同时注册另一个设备或密码时才能使用此选项。
--wipe-slot
操作可以与所有注册选项结合使用,这对于更新现有设备注册非常有用
# systemd-cryptenroll /dev/disk --wipe-slot=fido2 --fido2-device=auto
注册密码
普通密码
这等效于 cryptsetup luksAddKey
。
# systemd-cryptenroll /dev/disk --password
恢复密钥
- 恢复密钥与密码基本相同,但它是计算机生成的,而不是由人选择的,因此具有保证的高熵。该密钥使用易于输入的字符集,并且可以通过 QR 码从屏幕上扫描。
恢复密钥旨在用作硬件令牌不可用时的后备方案,并且可以在需要普通密码时代替使用。
# systemd-cryptenroll /dev/disk --recovery-key
注册硬件设备
--type-device
选项必须指向其各自类型的有效设备路径。可以通过将 list
参数传递给此选项来获取可用设备列表。或者,如果您只有一个所需类型的设备连接,则可以使用 auto
选项自动选择它。
PKCS#11 令牌或智能卡
令牌或智能卡必须包含 RSA 密钥对,该密钥对将用于加密生成的密钥,该密钥将用于解锁卷。
# systemd-cryptenroll /dev/disk --pkcs11-token-uri=device
FIDO2 令牌
任何支持 "hmac-secret" 扩展的 FIDO2 令牌都可以与 systemd-cryptenroll 一起使用。以下示例会将 FIDO2 令牌注册到加密的 LUKS2 块设备,仅需要用户存在作为身份验证。
# systemd-cryptenroll /dev/disk --fido2-device=device --fido2-with-client-pin=no
此外,systemd-cryptenroll 支持使用令牌的内置用户验证方法
--fido2-with-user-presence
定义是否在解锁前验证用户存在(即通过点击令牌),默认为 yes--fido2-with-user-verification
定义是否在解锁前需要用户验证,默认为 no
- 如果令牌不支持这些功能,则这些选项将无效。
- 有关两者之间差异的更多信息,请参阅 用户存在与用户验证。
默认情况下,生成 FIDO2 凭据时使用的加密算法是 es256,它表示使用 SHA-256 的 NIST P-256 上的椭圆曲线数字签名算法 (ECDSA)。如果需要并且 FIDO2 令牌提供,则可以在注册期间指定不同的加密算法。
假设先前的 FIDO2 令牌已注册,并且用户希望注册另一个令牌,则以下命令生成一个 eddsa 凭据,它表示使用 SHA-512 的 Curve25519 上的 EdDSA,并使用先前注册的令牌而不是密码对设备进行身份验证。
# systemd-cryptenroll /dev/disk --fido2-device=device --fido2-credential-algorithm=eddsa --unlock-fido2-device=auto
可信平台模块
systemd-cryptenroll 原生支持在 TPM 中注册 LUKS 密钥。它需要以下条件
- tpm2-tss 必须已安装,
- LUKS2 设备(当前 cryptsetup 使用的默认类型),
- 如果您打算在根分区上使用此方法,则需要对 initramfs 进行一些调整(有关高级配置,请参阅 dm-crypt/系统配置#使用 systemd-cryptsetup-generator)
- mkinitcpio 用户:启用
systemd
和sd-encrypt
钩子。注意: 钩子中条目的顺序很重要。非标准顺序 可能会导致系统无法启动(您将需要从 arch-chroot 中重建 initrd 以进行恢复)。有关正确顺序的示例,请参阅 dm-crypt/系统配置#示例。 - dracut 用户:启用
tpm2-tss
模块。
- mkinitcpio 用户:启用
首先,运行以下命令以列出已安装的 TPM 和正在使用的驱动程序
$ systemd-cryptenroll --tpm2-device=list
--tpm2-device=/path/to/tpm2_device
指定您希望使用的 TPM。可以使用一个命令将密钥注册到 TPM 和 LUKS 卷中。以下示例生成一个新的随机密钥,将其添加到卷中,以便除了现有密钥外,它也可以用于解锁卷,并将这个新密钥绑定到 PCR 7(安全启动 状态)
# systemd-cryptenroll --tpm2-device=auto /dev/sdX
其中 /dev/sdX
是加密的 LUKS 卷的完整路径。如果 LUKS 卷由密钥文件而不是密码解锁,请使用 --unlock-key-file=/path/to/keyfile
。
有关 Linux 中常见的 PCR 测量,请参阅 systemd-cryptenroll(1) 和 可信平台模块#访问 PCR 寄存器。根据需要调整 --tpm2-pcrs=7
默认值(参数用 +
符号分隔)。
- 绑定到 PCR 7 时,请确保 安全启动 处于活动状态并且处于用户模式,否则,未经授权的启动设备可能会解锁加密卷。
- 如果固件证书更改,PCR 7 的状态可能会更改,这可能会导致用户被锁定。这可以通过 fwupd[1] 隐式完成,或者通过轮换安全启动密钥显式完成。
- 仅绑定到启动前测量的 PCR(PCR 0-7)会打开来自恶意操作系统的漏洞。具有从真实根文件系统复制的元数据(例如分区 UUID)的恶意分区可以模拟原始分区。然后,initramfs 将尝试将恶意分区挂载为根文件系统(解密失败将回退到密码输入),从而使启动前 PCR 保持不变。具有攻击者控制的文件的恶意根文件系统仍然能够接收真实根分区的解密密钥。有关更多信息,请参阅 勇敢的新可信启动世界 和 BitLocker 文档。
- 根卷的解决方案是使用
--tpm2-pcrs=other_pcrs+15:sha256=0000000000000000000000000000000000000000000000000000000000000000
绑定到空的 PCR 15。如果您设置任何rd.luks
内核参数或使用/etc/crypttab.initramfs
,则另外将tpm2-measure-pcr=yes
选项添加到rd.luks.options=
或/etc/crypttab.initramfs
中的第四个字段;当依赖 GPT 分区自动挂载 时,这不是必需的。在早期用户空间中解锁根卷后,PCR 15 将更改,并且注册的密钥将不再可检索。
要绑定的 PCR 组合取决于个别情况,以平衡可用性和锁定。例如,您可能需要 UEFI 固件更新,而无需手动干预 安全启动 状态,或者需要不同的启动设备。再举一个例子,Microsoft 的 Bitlocker 偏好 PCR 7+11
,但也可能使用其他 PCR 组合。
- 除了 TPM 状态正确之外,还可以要求输入 PIN 码。只需在上面的命令中添加选项
--tpm2-with-pin=yes
,并在提示时输入 PIN 码。 - systemd-cryptenroll 在询问 PIN 码之前不会检查 TPM 测量,因此请考虑使用唯一的 PIN 码,因为环境可能不可信。
要检查是否已注册新密钥,请转储 LUKS 配置并查找 systemd-tpm2
令牌条目,以及 Keyslots 部分中的其他条目
# cryptsetup luksDump /dev/sdX
要测试密钥是否有效,请在 LUKS 卷关闭时运行以下命令
# systemd-cryptsetup attach mapping_name /dev/sdX none tpm2-device=auto
其中 mapping_name
是您为卷打开后选择的名称。
请参阅 dm-crypt/系统配置#crypttab 和 dm-crypt/系统配置#可信平台模块和 FIDO2 密钥,以便在启动时解锁卷。
/etc/crypttab
中指定 LUKS 卷的 UUID 而不是路径名,但 systemd-cryptenroll 命令本身目前仅支持路径名。有关更多信息和示例,请参阅 systemd-cryptenroll(1) 和 crypttab(5)。