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


30

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

我希望能够重新启动此服务器,但是那当然需要该密码。由于驱动器显然处于解密状态,是否可以在不知道旧密码的情况下更改密码?

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

我当然可以rsync关闭所有内容并进行重建,但是我想避免这种情况。我翻阅了内存(#cat /dev/mem | less),但找不到它(这是一件好事!)。


2
嗯。。。如果没有密码就可以很容易地访问它,那么拥有加密文件系统的意义何在?
mdpc

7
@mdpc:你的玩笑没有道理。他有权访问文件系统,因为他上次引导服务器时具有密码。
G-Man说'Resstate Monica'

2
仅因为您拥有密码(密码已损坏)并不会使我的评论无效。通常,如果您忘记了任何类型的加密材料的密码,则应该永远丢失该密码,否则首先进行加密的目的是什么?
mdpc

3
@mdpc现在时态,他当前可以访问文件系统。
帕特里克

有关超级用户的相同问题:丢失了LUKS密码,打开了加密分区(未回答)。
G-Man说'Resstate Monica''Oct

Answers:


40

是的,您可以通过在解密卷时访问主密钥来执行此操作。

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

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

devicevolume_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经常告诉它要使用主密钥。
<(...)是外壳命令替换&重定向。它基本上执行内部的所有内容,将输出发送到管道,然后将替换<(...)为该管道的路径。

 

因此,整个命令只是压缩多个操作的一线代码。


我不确定我是否做错了什么,但是我的LUKS根本不显示字符串,就像您在示例中显示的那样。这是一个简短的9位数字。我的也显示为“线性8:3”。
slm

@slm如果显示linear,则不是打开的LUKS卷(volume_name提供的命令中的值错误)。打开的LUKS卷将crypt在第三个字段中。在中cryptsetup luksOpen /dev/foo barvolume_name值为bar
帕特里克(Patrick)

现在明白了。有一个/dev/mapper名为的卷luks-.....。那就是您需要使用的卷,而不是LVM映射的逻辑卷。
slm

1
似乎在dmsetup的最新版本中,的格式dmsetup table已更改。至少对我而言,主密钥显示在栏中$6
Karol Babioch

@KarolBabioch您可能未指定卷名?
frostschutz 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.