以非交互方式更改 LUKS 密码?

以非交互方式更改 LUKS 密码?

我正在启动主机以使用 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

但无法以非交互方式更改密码不使用密钥文件,因为:

  1. cryptsetup不接受命令行中的密码;它仅从文件中以交互方式接受它们;可能是为了防止将密码泄露到您的 shell 历史记录中。
  2. 尽管您可以使用标准输入作为密钥文件,但要添加或更改密码,您需要提供现有密码以及新密码;这是两个输入,而只有一个标准输入。

选项 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”的原因。

相关内容