在不知道密码的情况下更改 LUKS 文件系统上的密码

Eth*_*han 31 linux luks

我有一个使用加密驱动器运行了一段时间的 Debian Wheezy 服务器。/dev/sda5当我的加密密码文件损坏时,加密驱动器 ( ) 的密码丢失。

我希望能够重新启动此服务器,但这当然需要该密码。既然驱动器显然处于解密状态,那么有没有办法在不知道旧密码的情况下更改密码?

cryptsetup luksChangeKey /dev/sda5 需要卷的密码。

我当然可以rsync关闭并重建一切,但我想避免这种情况。我查看了内存 ( #cat /dev/mem | less),但找不到它(这是一件非常好的事情!)。

phe*_*mer 43

是的,您可以通过在解密卷时访问主密钥来做到这一点。

添加新密码的快速而肮脏:

device=/dev/sda5
volume_name=foo
cryptsetup luksAddKey $device --master-key-file <(dmsetup table --showkeys $volume_name | awk '{ print $5 }' | xxd -r -p)
Run Code Online (Sandbox Code Playgroud)

devicevolume_name应适当设置。
volume_name是解密卷的名称,您在/dev/mapper.


解释:

LUKS 卷使用主密钥加密其数据。您添加的每个密码仅存储使用该密码加密的此主密钥的副本。因此,如果您拥有主密钥,您只需在新的密钥槽中使用它。

让我们拆开上面的命令。

$ dmsetup table --showkeys $volume_name
Run Code Online (Sandbox Code Playgroud)

这会转储有关主动解密的卷的一堆信息。输出如下所示:

0 200704 crypt aes-xts-plain64 53bb7da1f26e2a032cc9e70d6162980440bd69bb31cb64d2a4012362eeaad0ac 0 7:2 4096
Run Code Online (Sandbox Code Playgroud)

字段#5 是主密钥。

 

$ dmsetup table --showkeys $volume_name | awk '{ print $5 }' | xxd -r -p
Run Code Online (Sandbox Code Playgroud)

不会显示它的输出,因为它是二进制数据,但它的作用是获取卷的主密钥,然后将其转换为稍后需要的原始二进制数据。

 

$ cryptsetup luksAddKey $device --master-key-file <(...)
Run Code Online (Sandbox Code Playgroud)

这告诉 cryptsetup 向卷添加新密钥。通常这个操作需要一个现有的密钥,但是我们--master-key-file用来告诉它我们想要使用主密钥。
<(...)是外壳命令替换&重定向。它基本上执行内部的所有内容,将输出发送到管道,然后用<(...)指向该管道的路径替换。

 

所以整个命令只是一行代码来浓缩几个操作。