我有一个 Debian Wheezy 服务器,它已经使用加密驱动器运行了一段时间。/dev/sda5
当我的加密密码文件损坏时,加密驱动器 ( ) 的密码丢失。
我希望能够重新启动该服务器,但这当然需要该密码。由于驱动器显然处于解密状态,是否有一种方法可以在不知道旧密码的情况下更改密码?
cryptsetup luksChangeKey /dev/sda5
需要卷的密码。
我当然可以把rsync
所有东西都关掉然后重建,但我想避免这种情况。我翻遍了记忆(#cat /dev/mem | less
),但找不到它(这是一件非常好的事情!)。
答案1
是的,您可以通过在解密卷时访问主密钥来执行此操作。
添加新密码的快速而肮脏的方法:
device=/dev/sda5
volume_name=foo
cryptsetup luksAddKey $device --master-key-file <(dmsetup table --showkeys $volume_name | awk '{ print $5 }' | xxd -r -p)
device
并volume_name
应适当设置。
volume_name
是解密卷的名称,即您在 中看到的那个/dev/mapper
。
解释:
LUKS 卷使用主密钥加密其数据。您添加的每个密码仅存储使用该密码加密的主密钥的副本。因此,如果您有主钥匙,您只需在新的钥匙槽中使用它即可。
让我们分解上面的命令。
$ dmsetup table --showkeys $volume_name
这会转储有关主动解密卷的大量信息。输出如下所示:
0 200704 crypt aes-xts-plain64 53bb7da1f26e2a032cc9e70d6162980440bd69bb31cb64d2a4012362eeaad0ac 0 7:2 4096
字段 #5 是主密钥。
$ dmsetup table --showkeys $volume_name | awk '{ print $5 }' | xxd -r -p
不会显示其输出,因为它是二进制数据,但它的作用是获取卷的主密钥,然后将其转换为稍后需要的原始二进制数据。
$ cryptsetup luksAddKey $device --master-key-file <(...)
这告诉 cryptsetup 将新密钥添加到卷中。通常此操作需要现有密钥,但我们通常--master-key-file
告诉它我们要使用主密钥。
这<(...)
是 shell 命令替换和重定向。它基本上执行内部的所有内容,将输出发送到管道,然后用<(...)
该管道的路径替换 。
所以整个命令只是一句话,浓缩了几个操作。