4 个版本 (2 个稳定版)
1.0.1 | 2024 年 1 月 7 日 |
---|---|
1.0.0 | 2023 年 12 月 21 日 |
0.7.5 | 2023 年 11 月 23 日 |
0.7.3 | 2023 年 11 月 23 日 |
在 文件系统 中排名 469
每月下载次数 33
120KB
1.5K SLoC
shavee
shavee 是一个简单的程序和一个 pam 模块,使用 Rust 编写,用于自动解密和挂载使用 Yubikey HMAC 或简单 USB 驱动器作为双因素认证的加密 ZFS 用户家目录。
注意:Shavee v1.0.0 及更高版本与使用早期版本创建的数据集不兼容。请参阅迁移指南。
支持的方法
此程序目前支持两种双因素认证方法
1. Yubikey
Yubikeys 是安全的身份验证 USB 设备,我们可以用它作为强大的第二因素。
Yubikey 在槽位 2 预先编程了一个 HMAC 密钥,可以与我们的密码一起用于推导最终的加密密钥。
一旦编程,Yubikey 中的 HMAC 秘密无法提取。
如果您想在同一数据集(例如备份密钥)上使用多个密钥,则需要在所有这些密钥上编程相同的全新 HMAC 密钥。
注意:如果您想使用不同的密钥,则需要使用手动解锁选项,因为自动模式通过序列号查找密钥。
使用 -y
标志设置 Yubikey 模式。
如果不同的数据集需要不同的密钥,可以将它们全部连接起来。
在此模式下,程序在登录时查找 Yubikey,并使用其 HMAC 模式以及您的密码来推导最终的加密密钥。
可以使用 -s
标志设置 Yubikey HMAC 槽位,默认为槽位 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. 仅密码
如果没有指定第二个因素,程序将仅使用密码作为单一因素。
构建和安装
- 安装 Rust
- 使用以下命令克隆仓库
git clone https://github.com/ashuio/shavee.git
- [可选] 通过修改
shavee-bin
Cargo.toml
来启用或禁用yubikey
和file
功能,以将它们添加或从编译的二进制文件中删除这些功能。 - [可选] 通过修改
shavee-core
Cargo.toml
来启用或禁用详细调试trace
日志,以将此功能添加或从编译的二进制文件中删除。- 如果启用了
trace
日志功能,则必须设置RUST_LOG=trace
环境变量以生成日志。否则,将不会生成日志。注意:启用跟踪日志将增加二进制文件的大小,并可能将密码暴露在输出日志中。仅用于调试目的,最终二进制文件中请禁用!
- 如果启用了
- 使用二进制文件进行构建
cargo build --release
- 使用以下命令将二进制文件放置在您的 bin 目录中
sudo cp target/release/shavee /usr/bin
- 使用以下命令将 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
:自动检测数据集解锁属性(只能与Print
和Mount
一起使用)-z
:要操作 ZFS 数据集(可以接受多个选项)
注意:标志 -y
(Yubikey 模式)和选项 -f <文件路径>
(文件模式)是可以互换的。
建议在版本更新后运行命令再次更改数据集的密钥。
配置 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”将被视为密码
使用U盘代替Yubikey
您可以使用选项-f
而不是标志-y
来用任何USB驱动器替换Yubikey。
自动挂载U盘,以便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自动解锁主目录
此程序附带一个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
,如示例中所示,这不应阻止您登录。
要强制在数据集挂载失败时失败认证,请将其从optional
更改为required
ZFS中的双重主目录
由于ZFS在现有目录上挂载数据集,并且我们在PAM中将模块定义为可选的,因此即使我们的数据集未解密(例如,因为未插入Yubikey),我们仍然可以使用密码进行认证。
我们可以利用这一点,实际上拥有两个主目录。
第一个是您正常的加密主目录,当您在登录时插入Yubikey时,它会解锁和挂载。
第二个是已经存在的目录,当在登录时未插入Yubikey时,它会被加载。
依赖关系
~13–24MB
~342K SLoC