我正在启动主机以使用 LUKS - 作为其中的一部分,我在 kickstart 文件中有一个相当基本的“默认”密码。
我们通过 ansible“完成”新构建,因此作为其中的一部分 - 我想将默认的 luks 密码更改为更强大的密码(并通过 Ansible 管理)。
但我不明白的是,我如何以非交互方式使用 cryptsetup (或其他东西?)来更新密码。
我确实想要保持使用密码(而不是密钥文件) - 我们开始部署 Clevis/Tang 在根驱动器上进行网络绑定磁盘加密,并希望保留密码启动选项。
它似乎
echo "oldpassphrase
newpassphrase" | cryptsetup luksAddKey /dev/sda2
也许可以解决这个问题,但感觉像是一个混乱的选择?
答案1
有可能创造使用标准输入作为密钥文件以非交互方式创建 LUKS 容器:echo -n "mypassword" cryptsetup luksFormat --key-file - dev/sda2
但无法以非交互方式更改密码和不使用密钥文件,因为:
cryptsetup
不接受命令行中的密码;它仅从文件中以交互方式接受它们;可能是为了防止将密码泄露到您的 shell 历史记录中。- 尽管您可以使用标准输入作为密钥文件,但要添加或更改密码,您需要提供现有密码以及新密码;这是两个输入,而只有一个标准输入。
选项 1 - 使用命名管道
从技术上讲,这需要一个文件,但该文件是命名管道,而不是密钥文件:
mkpipe fifo
echo -n "oldpass" | cryptsetup luksAddKey --key-file - test.img fifo &
echo -m "newpass" > fifo
第一个命令创建命名管道,第二个命令使用 stdin 提供原始密码并从管道读取新密码。第二个命令会阻塞,因此&
将其置于后台。第三个命令将新密码写入管道,这允许 cryptsetup 解锁并继续。
选项 2 - 使用 cryptsetup API
Cryptsetup 不仅是一个实用程序,而且还是一个库 (libcryptsetup)。您可以使用类似的函数crypt_keyslot_add_by_passphrase()在您自己的代码中添加新密码。此特定函数接受现有密码和新密码char *
(字符串)。
答案2
ct=$(cat /etc/crypttab)
[[ $ct =~ ((sda[0-9])_crypt[[:blank:]]) ]] || _fail Could not find crypted partition
part="/dev/${BASH_REMATCH[2]}"
echo Partition is $part
(echo "$existingPW"; echo "$newPW"; echo "$newPW") | cryptsetup luksAddKey $part
...需要几秒钟才能完成。
答案3
假设您创建一个新卷,如下所示:
echo -n pass0 | cryptsetup luksFormat /dev/sda2 -
所以键槽 #0 中的密码是“pass0”。
接下来,您要将键槽 #1 中的密码设置为“pass1”:
echo -n "pass0pass1" | cryptsetup luksAddKey --key-file /dev/stdin --keyfile-size 5 --key-slot 1 /dev/sda2 /dev/stdin
第一个密码“pass0”的长度是 5 个字符,这就是您指定“--keyfile-size 5”的原因。