#yubi-key #mount #zfs #dataset #pam #home #usb

已删除 zauthrs

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

0.1.24 2021 年 7 月 3 日
0.1.23 2021 年 7 月 2 日
0.1.22 2021 年 6 月 23 日
0.1.21 2021 年 6 月 21 日
0.1.2 2021 年 6 月 9 日

#18 in #pam

MIT 许可证

18KB
245

zauthrs

rust workflow GitHub license Keybase PGP Crates.io

zauthrs 是一个简单的程序,使用 Rust 编写,在登录时使用 Yubikey HMAC 或简单 USB 驱动器作为双因素认证来解密和挂载加密的 ZFS 用户主目录。

支持的方法

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

1. Yubikey

在此模式下,程序在登录时寻找 Yubikey,并在插槽 2 上使用其 HMAC 模式,结合您的密码来生成最终的加密密钥。

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

注意 目前它仅读取 Yubikey 的插槽 2 进行 HMAC。

2. 文件/USB

在此模式下,程序寻找一个文件(可以是任何文件),并将其与您的密码一起使用来生成最终的加密。

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

此方法的想法是将文件保存在 USB 存储设备上,并在登录时出示它来生成加密密钥。

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

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

构建和安装

  1. 安装 Rust
  2. 使用以下命令克隆存储库
git clone https://github.com/ashuio/zauthrs.git 
  1. 使用以下命令构建
cargo build --release 
  1. 使用以下命令将二进制文件放置在您的 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