将密码传递给 zfs mount 命令

将密码传递给 zfs mount 命令

我有四个加密的 zfs 数据集,需要使用命令在开发机器启动时手动挂载zfs mount -l -a。这些数据集都有相同的密码,我必须输入四次。

有没有办法以安全的方式简化这一过程,这样我只需输入一次密码?也许有一种安全的方法可以自动输入密码?

答案1

如果数据集具有相同的密码,但您需要多次输入,这应该意味着所述数据集使用不同的加密根/密钥位置; 的输出zfs get encryptionroot,keylocation <pool>/<dataset1> <pool>/<dataset2> [...]应该可以证实这一点。您可以使用zfs change-key(参见man zfs-change-key)来统一这一点。

要在启动时自动输入密码,你可以使用网络绑定磁盘加密 (NBDE). Ubuntu 提供了以下软件包U 形夹,但您需要提供自己的辅助脚本(例如,在 中/usr/share/initramfs-tools/scripts/local-premount/)以确保加载所需的密钥。(当然,Clevis(一种用于自动解密的可插入框架)也可以在没有 Tang 的情况下工作。)

答案2

对于密码加密数据集的自动录入,可以/etc/rc.local通过添加以下模板脚本来实现自动化使用:

_ZKY_=$(echo <base64_enc_pass> | base64 --decode)
echo $_ZKY_ | zfs mount -l <ds_1>
echo $_ZKY_ | zfs mount -l <ds_2>
...

在哪里:

  • base64_enc_pass:您的密码以 base64 加密。如果您的毒药是明文密码,您可以输入明文密码。
  • ds_n:要解密和挂载的数据集名称

注意:要在已启用的系统rc.local上启用,请执行以下操作:systemd一些说明

或者,如果您想按需执行此操作,请使用此 Python 脚本简化一次密码输入:

zmount.py 的来源:

import getpass
import sys
from subprocess import Popen, PIPE, STDOUT
_p=getpass.getpass('ZFS Dataset Password:')
for _ds in sys.argv[1:]:
    p = Popen(['zfs', 'mount', '-l', _ds], stdout=PIPE, stdin=PIPE, stderr=PIPE)
    _ = p.communicate(input=_p.encode())[0]

要使用 zmount.py:

% python3 zmount.py <ds_1> <ds_2>[ ...]

相关内容