Clevis
Clevis 允许通过创建密钥并使用 TPM 对其进行加密,以及使用 PCR 值(代表创建 Clevis pin 时的系统状态)密封密钥,从而将 LUKS 卷绑定到系统。
用户手动输入的密码是解锁加密 LUKS 分区的传统且广泛使用的方法。 但是它有一些缺点
- 它需要手动干预,因此不适用于需要自动启动的设置(例如大型服务器集群)。
- 普通人的大脑能够记住相对简单的密码(约 20-30 位的熵),这些密码比现代块密码(128/256 位)使用的密钥弱得多。
解决这个问题的方法是用一个强大的密钥加密数据,并将其安全地存储在其他地方,例如您的 TPM 芯片或 YubiKey 或某些网络服务。 Clevis 是一个实现此想法的框架。 它允许使用可插拔的pin来加密数据(在 clevis bind 方面)。 目前 clevis 实现了 3 个 pin
- TPM2 数据绑定(仅当您的计算机上有 Trusted Platform Module 芯片时才有效)
- 网络服务(称为 Tang)数据绑定
- Shamir's Secret Sharing,允许您组合其他 pin。
- 使用 外部插件 的 YubiKey 绑定。
- 这意味着如果硬件被盗,则无法保护对数据的访问。
- 请注意,此方法会使您更容易受到 冷启动攻击,因为即使您的计算机已关机很长时间(确保内存已完全清除),攻击者也可以简单地将其打开并等待 TPM 自动加载密钥。 这对于高价值目标可能是一个问题。
安装
绑定一些数据
这是一个使用 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 卷
# cryptsetup luksAddKey /dev/sdX
要将 LUKS 卷绑定到 TPM,请使用
# clevis luks bind -d /dev/sdX tpm2 '{}'
其中 '{}'
包含配置:即使没有参数,也无法从另一台计算机解密驱动器,除非攻击者知道备份密码。
'{"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 ..)
最后 重新生成 initramfs。
Booster
幸运的是,Booster 可以开箱即用地自动解密使用 Clevis 绑定的 LUKS 卷!
Booster 还能够读取 LUKS 令牌、解码 clevis 信息、重建密码并自动解锁分区。
Tang (网络绑定)pin 需要启用网络。 有关使用 booster 进行网络配置的更多信息,请参阅 Booster#Configuration 部分。
Dracut
Dracut 需要以下额外的软件包
之后进行 initramfs 重建
# dracut -f
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 解锁驱动器。