Clevis

来自 ArchWiki

Clevis 允许通过创建密钥并使用 TPM 对其进行加密,以及使用 PCR 值(代表创建 Clevis pin 时的系统状态)密封密钥,从而将 LUKS 卷绑定到系统。

用户手动输入的密码是解锁加密 LUKS 分区的传统且广泛使用的方法。 但是它有一些缺点

  • 它需要手动干预,因此不适用于需要自动启动的设置(例如大型服务器集群)。
  • 普通人的大脑能够记住相对简单的密码(约 20-30 位的熵),这些密码比现代块密码(128/256 位)使用的密钥弱得多。

解决这个问题的方法是用一个强大的密钥加密数据,并将其安全地存储在其他地方,例如您的 TPM 芯片或 YubiKey 或某些网络服务。 Clevis 是一个实现此想法的框架。 它允许使用可插拔的pin来加密数据(在 clevis bind 方面)。 目前 clevis 实现了 3 个 pin

警告: 如果您在根卷上使用此方法,则意味着,只要满足先前所述的某些条件,您的计算机将在启动时自动解锁,而无需输入加密密码。
  • 这意味着如果硬件被盗,则无法保护对数据的访问。
  • 请注意,此方法会使您更容易受到 冷启动攻击,因为即使您的计算机已关机很长时间(确保内存已完全清除),攻击者也可以简单地将其打开并等待 TPM 自动加载密钥。 这对于高价值目标可能是一个问题。

安装

要使用 clevis 安装 clevis 软件包。

绑定一些数据

这是一个使用 TPM2 进行数据绑定的示例

$ clevis encrypt tpm2 '{}' <<< 'hello, world'
eyJhbGciOiJkaXIiLCJjbGV2aXMiOnsicGluIjoidHBtMiIsInRwbTIiOnsiaGFzaCI6InNoYTI1NiIsImp3a19wcml2IjoiQU80QUlJQkxxT3FVenVDU1FmWkprNmdDN2wzMW43V3M2Y2FZd0VZS1BSR3Q0OHJEQUJBV2Z4M3pTUUNUTmtHZE9BM2FZd2RTZk9GcXZWdnVlQ3lPamFsWldCT2R4RlJKSzl5ZVRCM0pkNFktcF9HalhhNmlnLWxxNmtmMHZTWWkzOWMxVEpES1RYRVZTdnlXSlpEbGdxQ0JPMVNxeGJBd2tfSnIyRlRNY3hvNGtpSmNtMEVjbWd5dFdyME00QmcySlg4aVo3MEt1MTVjNzFORU5Ra3RjdGMtREhBVGFQcHJ2VzI2Z3d1YmUxckRfX19aV2tHaG9mX053M0M1OHlOcXF2RUpPZUwzNTZHNXJHNVVtYmUtWWV4Ujl2SEppZWlua3ZaNTJoMFVRYWVNSm9LYjJuNjlVTGZHb2J1NElTN20iLCJqd2tfcHViIjoiQUM0QUNBQUxBQUFFMGdBQUFCQUFJQ2poWDBVeTJKZVpSNU9pRU0ySktSeEtnUElYQ3dGNnRNR09NTDZ0ZnE5aiIsImtleSI6ImVjYyJ9fSwiZW5jIjoiQTI1NkdDTSJ9..1P2Emag_4k-GlhyY.MuQQYPa8QHrysZ74uA.0ddDxfZA3R-cCmaKu5yUZA

这个长长的 base64 编码的消息是我们的文本,它使用内部 TPM 密钥加密。 它只能在当前计算机上解密。 尝试从另一台计算机(或者使用另一个 TPM 芯片)解密将返回错误。

$ clevis decrypt tpm2 '{}' <<< 'eyJhbGciOiJkaXIiLCJjbGV2aXMiOnsicGluIjoidHBtMiIsInRwbTIiOnsiaGFzaCI6InNoYTI1NiIsImp3a19wcml2IjoiQU80QUlJQkxxT3FVenVDU1FmWkprNmdDN2wzMW43V3M2Y2FZd0VZS1BSR3Q0OHJEQUJBV2Z4M3pTUUNUTmtHZE9BM2FZd2RTZk9GcXZWdnVlQ3lPamFsWldCT2R4RlJKSzl5ZVRCM0pkNFktcF9HalhhNmlnLWxxNmtmMHZTWWkzOWMxVEpES1RYRVZTdnlXSlpEbGdxQ0JPMVNxeGJBd2tfSnIyRlRNY3hvNGtpSmNtMEVjbWd5dFdyME00QmcySlg4aVo3MEt1MTVjNzFORU5Ra3RjdGMtREhBVGFQcHJ2VzI2Z3d1YmUxckRfX19aV2tHaG9mX053M0M1OHlOcXF2RUpPZUwzNTZHNXJHNVVtYmUtWWV4Ujl2SEppZWlua3ZaNTJoMFVRYWVNSm9LYjJuNjlVTGZHb2J1NElTN20iLCJqd2tfcHViIjoiQUM0QUNBQUxBQUFFMGdBQUFCQUFJQ2poWDBVeTJKZVpSNU9pRU0ySktSeEtnUElYQ3dGNnRNR09NTDZ0ZnE5aiIsImtleSI6ImVjYyJ9fSwiZW5jIjoiQTI1NkdDTSJ9..1P2Emag_4k-GlhyY.MuQQYPa8QHrysZ74uA.0ddDxfZA3R-cCmaKu5yUZA'
hello, world

绑定 LUKS 卷

本文或本节需要改进语言、wiki 语法或风格。 请参阅 请使用模板的第一个参数来提供简要说明。 (在 Talk:Clevis 中讨论)

警告: 如果 TPM 解封失败,请设置一个强备份密码,使用
# cryptsetup luksAddKey /dev/sdX

要将 LUKS 卷绑定到 TPM,请使用

# clevis luks bind -d /dev/sdX tpm2 '{}'

其中 '{}' 包含配置:即使没有参数,也无法从另一台计算机解密驱动器,除非攻击者知道备份密码。

注意: 要根据 UEFI 设置和 安全启动 策略密封 LUKS 密钥,请使用
'{"pcr_ids":"1,7"}'

如果 UEFI 或安全启动设置被修改,TPM 将计算不同的 PCR 值,并且解密将失败。 这提供了针对 邪恶女仆攻击 的保护。

有关参数列表,请参阅 clevis-encrypt-tpm2(1) § CONFIG

有关 PCR 含义的简化说明,请参阅 Trusted Platform Module#Accessing PCR registers

有关 PCR 含义的完整说明,请参阅 TCG 规范(§ 2.3.4)。

如果这失败并显示 ERROR: pcr-input-file filesize does not match pcr set-list,您应该指定不同的 pcr 库

'{"pcr_bank":"sha256","pcr_ids":"1,7"}'

截至 2022 年 8 月,Clevis 仅支持 sha1(默认)和 sha256 库,因此自然而然地,唯一不同的选项是 sha256 - 您可以使用 # tpm2_pcrread 查找可用和已使用的库。

要在系统配置更改导致不同的 PCR 值后生成新的 Clevis pin,例如在使用 PCR 0 时更新 UEFI,请运行

# cryptsetup luksDump /dev/sdX
Tokens:
  token slot: clevis
        Keyslot:  keyslot

找到用于 Clevis pin 的插槽,然后

# clevis luks regen -d /dev/sdX -s keyslot

要删除 Clevis 绑定,请运行

# clevis luks unbind -d /dev/sdX -s keyslot 
警告: 仔细检查您是否选择了正确的插槽,否则您可能会失去对卷的访问权限。

您可以使用以下命令解锁 TPM 绑定的卷

# clevis luks unlock -d /dev/sdX

为了自动解密 /etc/crypttab 中的卷,启用 clevis-luks-askpass.path

为了自动解密根卷,我们应该对我们的 Initramfs 生成器进行一些更改

Mkinitcpio 钩子

安装 mkinitcpio-clevis-hookAUR 软件包。 然后启用 clevis 钩子编辑 mkinitcpio.conf

/etc/mkinitcpio.conf
# Edit the hooks and add clevis before the 'encrypt' hook. Eg:
HOOKS=(.. clevis encrypt ..)
注意: 如果您正在使用 plymouth,请将 plymouth-encrypt 钩子替换为 encrypt。 据报告,当设备已经解锁时,plymouth-encrypt 会出现错误。 更多信息。

最后 重新生成 initramfs

Booster

幸运的是,Booster 可以开箱即用地自动解密使用 Clevis 绑定的 LUKS 卷!

Booster 还能够读取 LUKS 令牌、解码 clevis 信息、重建密码并自动解锁分区。

Tang (网络绑定)pin 需要启用网络。 有关使用 booster 进行网络配置的更多信息,请参阅 Booster#Configuration 部分。

Dracut

Dracut 需要以下额外的软件包

之后进行 initramfs 重建

# dracut -f
注意: 如果您打算使用 Clevis 的 tang PIN 来解锁您的驱动器,则 curl 必须包含在内核映像中。 将一个文件添加到 /etc/dracut.conf.d,告诉 dracut 在运行 dracut -f 之前包含它。
/etc/dracut.conf.d/curl.conf
install_items+=" /usr/bin/curl "

技巧与窍门

YubiKey 绑定

Clevis 允许使用 YubiKey 的挑战-响应模式绑定 LUKS 分区。 要绑定 LUKS 分区,请运行

# clevis luks bind -d /dev/sdX yubikey '{"slot":1}'

安装 yubikey-personalization。 编辑配置文件并添加以下选项

/etc/booster.yaml
extra_files: ykchalresp

重新生成 booster 镜像。 Booster 将在启动期间检测到此配置,并使用当前的 YubiKey 解锁驱动器。

参见