LUKS:添加备份密钥,备份,还原和删除LUKS卷标题

时间:2020-03-21 11:46:13  来源:igfitidea点击:

继LUKS安装之后,我们将进一步探讨如何添加备份密码短语,以及在发生灾难时如何备份和还原LUKS卷标头。

LUKS格式使用元数据标题和位于磁盘开头的8个键槽区域。
密码短语用于解密存储在反取证条带中的单个主密钥。

对于需要多个用户具有对同一设备的不同访问密钥的应用程序,多个密钥槽特别方便。
多个密钥槽还使我们可以添加备份密码短语。

转储LUKS标头

我们可以转储现有卷的LUKS标头,以获取有关正在使用的键槽的信息:

# cryptsetup luksDump /dev/sdb2
LUKS header information for /dev/sdb2
Version:

1
Cipher name:    aes
Cipher mode:    cbc-essiv:sha256
Hash spec:

sha1
Payload offset: 4096
MK bits:

256
MK digest:

AA 88 07 f2 4b ce 79 21 85 34 f7 a6 e3 0b 6b b2 a7 b8 d5 a1
MK salt:

BB dd 95 3d 1e 30 1f 66 d4 5e 31 03 12 a0 61 29

CC ef 34 8e 13 5d 80 76 8b 4a 0a c3 55 02 22 d3
MK iterations:  5750
UUID:

e4971160-047b-49ce-8246-b63f1fb67db9
Key Slot 0: ENABLED

Iterations:

23233

Salt:

ff bc fc 78 98 5d 35 50 97 76 37 b4 70 99 38 44

9f bd a1 b9 02 2d 4d 1d 18 b5 dc f6 4c a0 37 fc

Key material offset:    8

AF stripes:

4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

就像我们在上面看到的,只有键槽0被使用,因为我们在创建卷时只添加了一个密码短语。

添加备份密钥

我们想在密钥槽1中添加一个备份密码短语。
这可以通过使用luksAddKey参数来实现:

# cryptsetup luksAddKey --key-slot 1 /dev/sdb2
Enter any passphrase:
Enter new passphrase for key slot:
Verify passphrase:

请注意,必须提供现有键槽0的密码,以便添加新的密码。
让我们再次转储标头,以确保启用了键槽1:

# cryptsetup luksDump /dev/sdb2
LUKS header information for /dev/sdb2
Version:

1
Cipher name:    aes
Cipher mode:    cbc-essiv:sha256
Hash spec:

sha1
Payload offset: 4096
MK bits:

256
MK digest:

AA 88 07 f2 4b ce 79 21 85 34 f7 a6 e3 0b 6b b2 a7 b8 d5 a1
MK salt:

BB dd 95 3d 1e 30 1f 66 d4 5e 31 03 12 a0 61 29

CC ef 34 8e 13 5d 80 76 8b 4a 0a c3 55 02 22 d3
MK iterations:  5750
UUID:

e4971160-047b-49ce-8246-b63f1fb67db9
Key Slot 0: ENABLED

Iterations:

23233

Salt:

ff bc fc 78 98 5d 35 50 97 76 37 b4 70 99 38 44

9f bd a1 b9 02 2d 4d 1d 18 b5 dc f6 4c a0 37 fc

Key material offset:    8

AF stripes:

4000
Key Slot 1: ENABLED

Iterations:

23956

Salt:

3a a0 06 83 d3 e0 ba da b0 5c e2 56 cb ed 72 69

76 9a 8a b8 e1 eb e6 90 44 b3 71 7a 2f 96 80 39

Key material offset:    264

AF stripes:

4000
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

好的,我们现在已经设置了两个密码短语。
万一忘记了最初的那张,我们可以使用备用的那张。

更改或者删除密钥

我们可以通过发出以下命令从LUKS设备中删除提供的密码短语:

# cryptsetup luksRemoveKey /dev/sdb2

请注意,删除最后一个密码短语将使LUKS容器永久不可访问。

如果要更改现有密码,我们可以简单地删除不再需要的密码,然后添加一个新密码。

备份和还原LUKS标头

以下是cryptsetup手册页的摘录。

“如果LUKS卷的标头损坏,除非有标头备份,否则所有数据将永久丢失。
如果密钥槽损坏,则只能从标头备份中恢复,或者如果另一个具有已知密码的活动密钥槽未损坏。
人们设法以惊人的频率破坏LUKS标头。
这种风险是在安全性和安全性之间进行权衡的结果,因为LUKS旨在通过仅覆盖标头和密钥槽区域来快速安全地擦除。

参考LUKS FAQ,有两个关键的解密组件:标头本身和键槽中的盐值。
如果盐值被覆盖或者更改,除非有LUKS标头的备份,否则什么也不能做(在密码学上很强)来访问数据。
如果某个键槽已损坏,则仍然可以使用其他键槽读取数据,如果还有剩余的未损坏和已使用的键槽。

我们将创建一个LUKS标头备份。
可以通过发出以下命令来完成此操作:

# cryptsetup luksHeaderBackup <device> --header-backup-file <file>

这里的设备是LUKS卷磁盘,文件是要创建的头备份文件的名称。
在我们的情况下:

# cryptsetup luksHeaderBackup /dev/sdb2 --header-backup-file /root/sdb2-header.backup

确保没有人有权访问头备份文件。
将标头备份文件存储在某些加密的云存储中并不是一个坏主意。

万一发生灾难,我们的LUKS标头损坏了,我们可以通过发出以下命令来恢复它:

# cryptsetup luksHeaderRestore <device> --header-backup-file <file>

请注意,LUKS标头恢复过程将替换所有密钥槽,因此,只有备份中的密码短语才能使用。

安全擦除LUKS标头

LUKS的缺点之一是很明显,我们的磁盘上存在加密的数据。
尽管实际上并不重要,但在某些情况下,我们使用LUKS的事实可以使代理机构获得绿灯,迫使我们交出钥匙。
可以通过检查其卷标头来识别LUKS文件系统:

# cryptsetup -v isLuks /dev/sdb2
Command successful.

对分区'/dev/sdb1'发出相同的命令将给我们一个无效的LUKS设备消息:

# cryptsetup -v isLuks /dev/sdb1
Device /dev/sdb1 is not a valid LUKS device.
Command failed with code 22: Device /dev/sdb1 is not a valid LUKS device.

LUKS标头的存在标识了磁盘上LUKS文件系统的存在,尽管这不足以证明我们有任何密钥。
删除LUKS标头使得除非有标头备份可用,否则无法从LUKS卷中恢复任何数据。

默认的LUKS标头(仅启用一个键槽)占用1052672个字节,略大于1 MiB。
启用2个键槽,这将使标头几乎扩展两次(键槽条带键大小+偏移字节)。
因此,覆盖前3个MiB将为我们完成这项工作:

# head -c 3145728 /dev/zero > /dev/sdb2; sync

这仍然会在磁盘上保留加密的数据,但是请考虑一下,它可能是对'/dev/random'的实验。