0.1.24 |
|
---|---|
0.1.23 |
|
0.1.22 |
|
0.1.21 |
|
0.1.2 |
|
#18 in #pam
18KB
245 行
zauthrs
zauthrs 是一个简单的程序,使用 Rust 编写,在登录时使用 Yubikey HMAC 或简单 USB 驱动器作为双因素认证来解密和挂载加密的 ZFS 用户主目录。
支持的方法
此程序目前支持两种双因素认证方法
1. Yubikey
在此模式下,程序在登录时寻找 Yubikey,并在插槽 2 上使用其 HMAC 模式,结合您的密码来生成最终的加密密钥。
使用 -f
标志设置 Yubikey 模式。
注意 目前它仅读取 Yubikey 的插槽 2 进行 HMAC。
2. 文件/USB
在此模式下,程序寻找一个文件(可以是任何文件),并将其与您的密码一起使用来生成最终的加密。
使用 -f <文件路径>
选项设置文件模式。
此方法的想法是将文件保存在 USB 存储设备上,并在登录时出示它来生成加密密钥。
您可以使用任何现有的文件。
注意:由于文件成为您加密密钥的一部分,其安全性无法保证,就像 Yubikey 一样,您负责保持其安全。
构建和安装
- 安装 Rust
- 使用以下命令克隆存储库
git clone https://github.com/ashuio/zauthrs.git
- 使用以下命令构建
cargo build --release
- 使用以下命令将二进制文件放置在您的 bin 目录中
sudo cp target/release/zauthrs /usr/bin
用法
此命令以以下形式接受参数
zauthrs <模式> <标志/选项>
模式
- pam : 与 pam_exec.so 模块一起使用(使用
-p
标志)
标志/选项
- -y : 使用 Yubikey 进行双因素认证
- -f : 使用任何文件作为双因素认证,需要文件路径作为参数。
- -z : 如果与上述任何选项一起使用,它将尝试使用生成的密钥解锁和挂载给定的数据集,而不是打印它。需要 zfs 数据集路径作为参数。(在 PAM 模式下将自动附加用户名)
注意:标志 -y
(Yubikey 模式)和选项 -f <文件路径>
(文件模式)可以互换。
测试
在尝试使用此程序之前,请先使用zauthrs config -y
运行此程序进行测试。
配置 ZFS 数据集
注意:如果更新了密码,请记得更新您的加密密钥。
您可以通过运行以下命令来更改/更新现有 ZFS 数据集的密钥:
zauthrs -y | zfs change-key <zfs dataset path>
示例
zauthrs -y | zfs change-key zroot/data/home/hunter
创建新的数据集
要使用我们的密钥创建数据集,我们首先会像平常一样创建数据集:
zfs create -o encryption-on -o keylocation=prompt -o keyformat=passphrase <Desired dataset>
示例
zfs create -o encryption-on -o keylocation=prompt -o keyformat=passphrase zroot/data/home/hunter
然后使用第一种方法将该密钥更改为该数据集。
使用 zauthrs 解锁和挂载任何 ZFS 分区
只需将选项 -z
添加到解锁任何 ZFS 数据集
示例
zauthrs -y -z zroot/data/home/hunter/secrets
在脚本中使用
您还可以直接将密码传递给脚本使用
示例
echo "hunter2" | zauthrs -y -z zroot/data/home/hunter/secrets
在这里,“hunter2”将被视为密码
使用 U 盘而不是 Yubikey
您可以使用 -f
选项而不是 -y
标志来用任何 USB 驱动器替换 Yubikey。
自动挂载 U 盘以便 zauthrs 在登录时可以找到所需的关键文件
我们可以使用 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
确保新规则被加载。
使用 zauthrs 与 PAM 自动解锁主目录
此程序使用 pam_exec.so 模块在登录过程中执行。
只需将以下行添加到您想要的 pam 登录方法文件中。
在我们的示例中,我们将将其添加到 /etc/pam.d/sddm 以处理图形登录,以及 /etc/pam.d/login 以处理 CLI 登录。
将以下行添加到您的 pam 配置文件中
auth optional pam_exec.so expose_authtok <full path to program> -p -y -z <base home dir>
示例
auth optional pam_exec.so expose_authtok /usr/bin/zauthrs -p -y -z zroot/data/home
其中 zroot/data/home
挂载到 /home
ZFS 中的双重主目录
由于 ZFS 在现有目录上挂载数据集,并且我们在 PAM 中将模块定义为可选的,所以我们即使数据集未解密(例如,因为未插入 Yubikey)也会仅通过密码进行身份验证。
我们可以利用这一点,实际上拥有两个主目录。
第一个是您正常的加密主目录,当登录时您的 Yubikey 存在时,该目录会被解锁和挂载。
第二个是已经存在的目录,当登录时未插入 Yubikey 时,该目录会被加载。
如果您感兴趣,请告诉我,也许我可以写一个更详细的指南。
依赖项
~3.5–5MB
~81K SLoC