#yubi-key #zfs #encryption #home-dir #security #encryption-key

app shavee

shavee 是一个程序,用于使用 Yubikey HMAC 作为双因素认证或任何支持 PAM 的 USB 驱动器来自动解密和挂载 ZFS 数据集

8 个版本 (2 个稳定版)

1.0.1 2024年1月7日
1.0.0 2023年12月21日
0.7.5 2023年11月23日
0.1.36 2021年8月4日
0.1.0 2021年6月9日

命令行工具 中排名第 62

Download history

每月下载量 108

MIT 许可证 MIT

185KB
2K SLoC

shavee

GitHub license

shavee 是一个简单的程序和一个 pam 模块,用于使用 Yubikey HMAC 或简单 USB 驱动器作为双因素认证,自动解密和挂载加密的 ZFS 用户主目录(用 Rust 编写)。

注意:Shavee v1.0.0 及更高版本与使用早期版本创建的数据集不兼容。请参阅 迁移指南。

支持的方法

此程序目前支持两种双因素认证方法

1. Yubikey

Yubikeys 是我们用于强大第二因素的安全认证 USB 设备。

Yubikey 在槽位 2 预先编程了一个 HMAC 密钥,可以用来推导我们的最终加密密钥以及我们的密码。

在 Yubikey 中编程的 HMAC 密钥一旦编程就无法提取。

如果您要在同一数据集(例如备份密钥)上使用多个密钥,您需要在所有这些密钥上编程相同的新的 HMAC 密钥。

注意:如果您想使用不同的密钥(自动模式会按序列号查找密钥),则必须使用手动解锁选项。

使用 -y 标志设置 Yubikey 模式。

如果您需要为不同的数据集使用不同的密钥,可以将所有这些密钥一起插入。

在此模式下,程序在登录时查找 Yubikey,并使用其 HMAC 模式以及您的密码来推导最终加密密钥。

可以使用 -s 标志设置 Yubikey HMAC 槽位,默认为 SLOT 2。

2. 文件/HTTP(S)/SFTP

在此模式下,程序查找一个文件(可以是任何文件),并使用该文件以及您的密码来推导最终加密。

使用 -f <文件路径> 选项设置文件模式。

文件可以是本地文件、http(s) 或 sftp 位置。

示例 HTTPS

shavee -f https://foo.org/secret.png

示例 SFTP

shavee -f sftp://[email protected]/mnt/secretfile -P 4242

-P 选项设置HTTP和SFTP的端口。

示例本地文件

shavee -f /mnt/usb/secret.png

这种方法的想法是保持文件在USB存储设备或您控制的网络位置,并在登录期间提供该文件以派生最终加密密钥。

您可以使用您选择的任何现有文件。

或者使用以下方法创建一个:

dd if=/dev/uranson of=./secretfile bs=4096 count=4096

注意:由于文件成为您加密密钥的一部分,其安全性无法保证,如同Yubikey一样,您有责任保持其安全。

3. 仅密码

如果没有指定第二个因素,程序将仅使用密码作为单一因素。

构建和安装

  1. 安装 Rust
  2. 使用以下方法克隆仓库
git clone https://github.com/ashuio/shavee.git
  • [可选] 通过修改 shavee-bin Cargo.toml 来启用或禁用 yubikeyfile 功能,以便将这些功能包含或从编译的二进制文件中删除。
  • [可选] 通过修改 shavee-core Cargo.toml 来启用或禁用详细调试 trace 日志,以便将这些功能包含或从编译的二进制文件中删除。
    • 如果启用了 trace 日志功能,则必须设置环境变量 RUST_LOG=trace 以生成日志。否则将不会生成任何日志。注意:启用跟踪日志会增加二进制文件大小,并可能将密码暴露在输出日志中。仅用于调试目的,并在最终二进制文件中禁用!
  1. 使用二进制文件构建
cargo build --release
  1. 使用以下命令将二进制文件放置在您的bin目录中
sudo cp target/release/shavee /usr/bin
  1. 使用以下命令将Pam模块放置在您的模块目录中
 sudo cp target/release/libshavee_pam.so /usr/lib/security/

模式

  • Shavee PAM模块:Shavee PAM模块在登录时解锁主目录
  • Shavee二进制文件:Shavee的行政功能,用于使用Shavee进行数据集管理

标志/选项

  • -y:使用Yubikey进行二次验证。可选地接受Yubikey序列号或使用第一个密钥
  • -f:使用任何文件作为二次验证,以文件路径或HTTP(S)位置作为参数
  • -p:打印出密钥
  • -d:将数据集名称添加到打印输出
  • -P:设置HTTP和SFTP请求的端口(大写P)
  • -s:设置Yubikey HMAC插槽(可以是1或2)
  • -c:使用派生的加密密钥创建/更改ZFS数据集的密钥
  • -m:解锁并挂载ZFS数据集
  • -r:递归地对所有子数据集执行操作
  • -a:自动检测数据集解锁属性(只能与 PrintMount 一起使用)
  • -z:要操作ZFS数据集(可以接受多个选项)

注意:标志 -y(Yubikey模式)和选项 -f <path to file>(文件模式)可以互换。

建议在版本更新后再次运行命令更改数据集的密钥。

配置ZFS数据集

注意:如果与PAM一起使用,您的数据集密码应与您的用户帐户密码相同,以便自动工作

注意:如果您更改密码,请记住也要更新您的加密密钥。


您可以通过运行以下命令来更改/更新现有ZFS数据集的密钥

shavee -c -z <zfs dataset path>

示例

shavee -y -c -z zroot/data/home/hunter zroot/data/home/hunter2

或者要使用特定的密钥,输入它的序列号

shavee -y 12345678 -c -z zroot/data/home/hunter zroot/data/home/hunter2

在这里,我们使用Yubikey作为我们的第二个因素。(对于仅密码认证,可以省略)并同时对两个数据集进行操作。

注意:如果数据集不是使用shavee创建的,则必须已经启用加密并加载密钥,才能更改现有数据集的密钥。

创建新的数据集

要使用我们派生的加密密钥创建新的数据集,只需运行以下命令

sudo shavee -c -z <Desired dataset>

示例

sudo shavee -f /mnt/usb/secretfile -c -z zroot/data/home/hunter

在这里,我们使用一个文件作为我们的第二个因素(对于仅密码认证,可以省略)

使用shavee解锁和挂载任何zfs分区

只需使用选项-m解锁任何zfs数据集

示例

shavee -y -m -z zroot/data/home/hunter/secrets

备份密钥

要备份密钥,只需使用选项-p将密钥打印到stdout

示例

shavee -p -y -z zroot/data/home/hunter/secrets

注意:即使您为多个数据集使用相同的密码,密钥也是数据集独有的。

在脚本中使用

您也可以直接将密码管道输入到shavee中,以在脚本中使用

示例

echo "hunter2" | shavee -y -m -z zroot/data/home/hunter/secrets

在这里,“hunter2”将被视为密码

使用USB驱动器代替Yubikey

您可以使用选项-f而不是选项-y来用任何USB驱动器替换Yubikey。

自动挂载USB,以便shavee可以在登录时找到所需的关键文件

我们可以使用udev来完成此操作,只需在/etc/udev/rules.d/99-usb-automount.rules中创建并添加以下内容

ACTION=="add", SUBSYSTEMS=="usb", SUBSYSTEM=="block", ENV{ID_FS_UUID}=="<UUID of partition>", RUN{program}+="/usr/bin/systemd-mount --no-block --automount=yes --collect $devnode <Desired Mount point>"

示例

ACTION=="add", SUBSYSTEMS=="usb", SUBSYSTEM=="block", ENV{ID_FS_UUID}=="ADB0-DA9C", RUN{program}+="/usr/bin/systemd-mount --no-block --automount=yes --collect $devnode /media/usb"

在这里,我们将USB磁盘的第一个分区挂载到/media/usb

您可以通过运行以下命令获取UUID

udevadm info --query=all --name=<Target disk> | grep ID_FS_UUID=

示例

udevadm info --query=all --name=/dev/sdb1 | grep ID_FS_UUID=

运行udevadm control --reload-rules后,确保新规则已加载。

使用shavee与PAM自动解锁home目录

此程序包含一个PAM模块,在登录过程中执行。

只需将以下行添加到您选择的PAM登录方法文件中。

在我们的示例中,我们将将其添加到/etc/pam.d/sddm以处理图形登录,以及/etc/pam.d/login以处理CLI登录。

将以下行添加到您的PAM配置文件中

auth       optional    libshavee_pam.so <Base home Dataset>
session    optional    libshavee_pam.so <Base home Dataset>

示例

auth       optional    libshavee_pam.so zroot/data/home
session    optional    libshavee_pam.so zroot/data/home

其中zroot/data/home挂载到/home

注意:PAM模块递归地解锁和挂载数据集,任何数据集的失败都将导致认证失败。如果PAM模块设置为如示例中所示的可选,则不应阻止您登录。

要强制在数据集挂载失败时失败认证,将其从optional更改为required

ZFS中的双home目录

由于ZFS挂载数据集在现有目录之上,并且我们已将模块定义在PAM中为可选,因此即使数据集未解密(例如,因为未插入Yubikey),我们仍然可以通过密码进行认证。

我们可以利用这一点,实际上拥有两个home目录。

第一个是您正常的加密home目录,当登录时,如果Yubikey存在,则会解锁和挂载。

第二个是已经存在的目录,在解密失败时加载,即在登录时未插入Yubikey。

如果您感兴趣,请告诉我,也许我可以编写更详细的指南。

依赖关系

~15–29MB
~404K SLoC