systemd-cryptenroll

出自 ArchWiki

出自systemd-cryptenroll(1)

systemd-cryptenroll 是一个用于将硬件安全令牌和设备注册到 LUKS2 加密卷的工具,这些令牌和设备随后可在启动期间用于解锁卷。

systemd-cryptenroll 允许将智能卡FIDO2 令牌和可信平台模块安全芯片以及普通密码注册到 LUKS 设备中。这些设备稍后由 systemd-cryptsetup@.service(8) 使用注册的令牌解锁。

安装

systemd-cryptenrollsystemd 的一部分并随其打包。但是,使用硬件设备作为密钥需要额外的软件包

列出密钥槽位

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 可以是

  • 单个密钥槽位索引,如 #列出密钥槽位 中所示
  • 密钥槽位的类型,这将擦除该类型的所有密钥槽位。有效类型为 emptypasswordrecoverypkcs11fido2tpm2
  • 以上所有类型的组合,以逗号分隔
  • 字符串 all,它会擦除设备上的所有密钥槽位。仅当同时注册另一个设备或密码时才能使用此选项。

--wipe-slot 操作可以与所有注册选项结合使用,这对于更新现有设备注册非常有用

# systemd-cryptenroll /dev/disk --wipe-slot=fido2 --fido2-device=auto

注册密码

普通密码

这等效于 cryptsetup luksAddKey

# systemd-cryptenroll /dev/disk --password

恢复密钥

出自systemd-cryptenroll(1)

恢复密钥与密码基本相同,但它是计算机生成的,而不是由人选择的,因此具有保证的高熵。该密钥使用易于输入的字符集,并且可以通过 QR 码从屏幕上扫描。

恢复密钥旨在用作硬件令牌不可用时的后备方案,并且可以在需要普通密码时代替使用。

# systemd-cryptenroll /dev/disk --recovery-key

注册硬件设备

--type-device 选项必须指向其各自类型的有效设备路径。可以通过将 list 参数传递给此选项来获取可用设备列表。或者,如果您只有一个所需类型的设备连接,则可以使用 auto 选项自动选择它。

注意: 将硬件令牌注册到 LUKS2 卷后,您必须配置您的系统以在适当的时候使用它们。有关应在早期用户空间(如根文件系统)中解锁的卷,请参阅 dm-crypt/系统配置#可信平台模块和 FIDO2 密钥,有关其他分区的卷,请参阅 dm-crypt/系统配置#在后期用户空间中解锁

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 令牌提供,则可以在注册期间指定不同的加密算法。

注意: 对于那些关注 ECDSA 的人来说,这也可能是可取的。有关详细信息,请参阅 SSH 密钥#ECDSA

假设先前的 FIDO2 令牌已注册,并且用户希望注册另一个令牌,则以下命令生成一个 eddsa 凭据,它表示使用 SHA-512 的 Curve25519 上的 EdDSA,并使用先前注册的令牌而不是密码对设备进行身份验证。

# systemd-cryptenroll /dev/disk --fido2-device=device --fido2-credential-algorithm=eddsa --unlock-fido2-device=auto
注意: 两个令牌都必须插入到系统中才能成功注册。

可信平台模块

本文或章节需要扩充。

原因: 文档 --tpm2-public-key --tpm2-seal-key-handle --tpm2-device-key --tpm2-pcrlock (在 Talk:Systemd-cryptenroll 中讨论)

systemd-cryptenroll 原生支持在 TPM 中注册 LUKS 密钥。它需要以下条件

首先,运行以下命令以列出已安装的 TPM 和正在使用的驱动程序

$ systemd-cryptenroll --tpm2-device=list
提示: 如果您的计算机安装了多个 TPM,请在以下步骤中使用 --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/系统配置#crypttabdm-crypt/系统配置#可信平台模块和 FIDO2 密钥,以便在启动时解锁卷。

注意: 虽然您可以在 /etc/crypttab 中指定 LUKS 卷的 UUID 而不是路径名,但 systemd-cryptenroll 命令本身目前仅支持路径名。

有关更多信息和示例,请参阅 systemd-cryptenroll(1)crypttab(5)

参见