#fido2 #luks #u2f #加密解密

app fido2luks

使用兼容 FIDO2 的验证器解密 LUKS 分区

18 个版本

0.2.19 2021年7月26日
0.2.16 2021年2月8日
0.2.14 2020年9月6日
0.2.9 2020年6月23日
0.2.1 2019年10月10日

#339身份验证

每月32次下载

MPL-2.0 许可证

105KB
1.5K SLoC

Rust 1.5K SLoC // 0.0% comments Shell 283 SLoC // 0.1% comments Bitbake 14 SLoC // 0.3% comments

fido2luks Crates.io 版本

这将允许您使用兼容 FIDO2 的密钥解锁您的 LUKS 加密磁盘。

注意:此程序已在 Fedora 31、Ubuntu 20.04NixOS 下使用 Solo Key、Trezor Model T、YubiKey (fw >= 5.2.3) 进行测试。

设置

先决条件

dnf install clang cargo cryptsetup-devel -y

设备

git clone https://github.com/shimunn/fido2luks.git && cd fido2luks

# Alternativly cargo build --release && sudo cp target/release/fido2luks /usr/bin/
sudo -E cargo install -f --path . --root /usr

# Copy template
cp dracut/96luks-2fa/fido2luks.conf /etc/
# Name is optional but useful if your authenticator has a display
echo FIDO2LUKS_CREDENTIAL_ID=$(fido2luks credential [NAME]) >> /etc/fido2luks.conf

# Load config into env
set -a
. /etc/fido2luks.conf

# Repeat for each luks volume
# You can also use the `--token` flag when using LUKS2 which will then store the credential in the LUKS header,
# enabling you to use `fido2luks open-token` without passing a credential as parameter
sudo -E fido2luks -i add-key /dev/disk/by-uuid/<DISK_UUID>

# Test(only works if the luks container isn't active)
sudo -E fido2luks -i open /dev/disk/by-uuid/<DISK_UUID> luks-<DISK_UUID>

Dracut

cd dracut

sudo make install

Grub

rd.luks.2fa=<CREDENTIAL_ID>:<DISK_UUID> 添加到 /etc/default/grub 中的 GRUB_CMDLINE_LINUX

注意:这仅适用于您的根磁盘,如果使用 fido2luks add-key 添加了密钥,systemd 将尝试使用相同的密钥解锁所有其他 LUKS 分区。

grub2-mkconfig > /boot/grub2/grub.cfg

我还建议将可执行文件复制到 /boot,以便在您需要从救援系统访问磁盘时能够访问它。

mkdir /boot/fido2luks/
cp /usr/bin/fido2luks /boot/fido2luks/
cp /etc/fido2luks.conf /boot/fido2luks/

测试

重新启动并查看是否正常工作,如果是这样,您应该从您的 LUKS 标头中删除旧的不太安全的密码。

# Recommend in case you lose your authenticator, store this backupfile somewhere safe
cryptsetup luksHeaderBackup /dev/disk/by-uuid/<DISK_UUID> --header-backup-file luks_backup_<DISK_UUID>
# There is no turning back if you mess this up, make sure you made a backup
# You can also pass `--token` if you're using LUKS2 which will then store the credential in the LUKS header,
# which will enable you to use `fido2luks open-token` without passing a credential as parameter
fido2luks -i add-key --exclusive /dev/disk/by-uuid/<DISK_UUID>

附加设置

无密码

如下一节所述,删除您之前添加的密钥,如果已经添加过。

打开 /etc/fido2luks.conf 并将 FIDO2LUKS_SALT=Ask 替换为 FIDO2LUKS_SALT=string:<YOUR_RANDOM_STRING>,但请注意,此密码将被包含在 initramfs 中。

将新配置导入到 env

set -a
. /etc/fido2luks.conf

然后将新的密钥添加到每个设备,之后更新 dracut dracut -f

多个密钥

支持附加/备份密钥,可以将多个 fido2luks 凭证添加到 /etc/fido2luks.conf 文件中。凭据令牌用逗号分隔。

FIDO2LUKS_CREDENTIAL_ID=<CREDENTIAL1>,<CREDENTIAL2>,<CREDENTIAL3>

移除

从 /etc/default/grub 中的 GRUB_CMDLINE_LINUX 移除 rd.luks.2fa

set -a
. fido2luks.conf
sudo -E fido2luks -i replace-key /dev/disk/by-uuid/<DISK_UUID>

sudo rm -rf /usr/lib/dracut/modules.d/96luks-2fa /etc/dracut.conf.d/luks-2fa.conf /etc/fido2luks.conf

工作原理

fido2luks 基于 LUKS(Linux 磁盘加密的抽象)和 FIDO2 扩展(hmac-secret)两个基本构建块。该 hmac-secret 扩展允许从两个输入中推导出密钥,即用户提供的盐/密码/密钥文件以及 FID2 设备内部包含的另一个密钥。然后,hmac-secret 函数的输出将用于解密 LUKS 头,进而用于解密磁盘。


        +-------------------------------------------------------------------------------+
        |                                                                               |
        |                       +-----------------------------------------+             |
        |                       |               FIDO2 device              |             |
        |                       |                                         |             |
        |                       |                                         |             |
+-------+--------+   +------+   |                      +---------------+  |             |             +------------------------+
| Salt/Password  +-> |sha256+------------------------> |               |  |             v             |      LUKS header       |
+----------------+   +------+   |                      |               |  |                           |                        |           +---------------+   
                                |                      |               |  |        +--------+         +------------------------+-------->  |Disk master key| 
                                |                      |  sha256_hmac  +---------> | sha256 +-------> | Keyslot 1              |           +---------------+ 
+----------------+              |  +----------+        |               |  |        +--------+         +------------------------+
| FIDO credential+---------------> |Credential| +----> |               |  |                           | Keyslot 2              |
+----------------+              |  |secret    |        |               |  |                           +------------------------+
                                |  +----------+        +---------------+  |
                                |                                         |
                                |                                         |
                                +-----------------------------------------+

由于所有这些组件都相互依赖,丢失或损坏其中任何一个都会使磁盘无法解密,因此备份 LUKS 头至关重要,理想情况下设置备份密码或利用多个 FIDO2 设备。每个附加的凭据和密码组合都需要自己的 LUKS 密钥槽,因为凭据密钥对于每个新的凭据都是随机生成的,这将导致完全不同的密钥。

许可证

许可下

贡献

除非你明确声明,否则你提交的任何旨在包含在作品中的贡献,如 MPL 2.0 许可证中定义的,将按照上述方式许可,不附加任何额外条款或条件。

依赖

~17MB
~390K SLoC