LUKS 密钥管理的 10 个 Linux cryptsetup 示例

举报
Tiamo_T 发表于 2022/10/10 08:24:58 2022/10/10
【摘要】 LUKS 是 Linux 的磁盘加密。 首次使用 LUKS 加密分区时(或在操作系统安装期间选择加密磁盘选项时),您必须指定打开 LUKS 分区时使用的密码。

LUKS 是 Linux 的磁盘加密。

首次使用 LUKS 加密分区时(或在操作系统安装期间选择加密磁盘选项时),您必须指定打开 LUKS 分区时使用的密码。

但是,在那之后,您可以根据需要多次挂载和卸载分区,而无需输入密码,直到您重新启动系统。

想象以下两种情况:

  1. 您忘记了 LUKS 密码。或者,您从某个安装了带有 LUKS 加密的分区的人那里继承了一个系统。您没有 LUKS 密码。当您重新启动系统时,您将遇到麻烦,因为您没有 LUKS 密钥。
  2. 出于安全合规目的,您需要经常更改 LUKS 加密密码。在这种情况下,您必须在不中断已安装分区的情况下轮换 LUKS 密钥。

在本教程中,我们将讨论您需要了解的有关 LUKS 密钥管理的所有信息。

1. 八个 LUKS 键槽

在 LUKS 中,对于单个加密分区,您可以拥有八个不同的密钥。

八个不同的密钥中的任何一个都可以用来打开加密分区。

您可以选择在一个分区上只有一个键,或者您可以分配所有八个不同的键。

这些密钥存储在分区的 LUKS 密钥槽中。因此,一个分区将有 8 个键槽。

要查看所有密钥槽,请使用 cryptsetup luksDump,如下所示。在此示例中,它仅使用两个插槽。

# cryptsetup luksDump /dev/sdb1 | grep Slot
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

在上面:

  • /dev/sdb1 是 LUKS 加密分区。
  • Key Slot 编号从 0 开始。由于我们有 8 个 slot,因此 key slot 编号从 0 到 7 开始。
  • ENABLED 表示这个特定的插槽有一个分配给它的键。
  • 这里我们有两个带有 LUKS 键的插槽。因此,/dev/sdb1 LUKS 加密分区分配了两个密钥。

2.添加新的LUKS密钥

要将新的 LUKS 密码(LUKS 密钥)添加到 /dev/sdb1 LUKS 加密分区,请使用 cryptsetup luksAddKey 命令,如下所示。

# cryptsetup luksAddKey /dev/sdb1
Enter any passphrase: 
Enter new passphrase for key slot: 
Verify passphrase: 

在上面:

  • 当它显示“输入任何密码:”时,您应该输入 /dev/sdb1 的任何现有密码。正如我们在上面看到的,这已经有来自 Slot 0 和 Slot 1 的两个密码。您应该先输入其中任何一个密码。
  • 输入现有密码后,您可以分配新的 LUKS 密钥。

每当您添加新的 LUKS 密钥时,它将被添加到下一个可用插槽中。由于我们已经有两个现有的密钥,新密钥被添加到插槽#2,这是下一个可用的插槽。

因此,插槽#0 到 2 将显示“已启用”。我们在 /dev/sdba1 上有三个 LUKS 键。

# cryptsetup luksDump /dev/sdb1 | grep Slot
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

3. 将新的 LUKS 密钥添加到特定插槽

除了 LUKS 将新密钥添加到下一个可用插槽之外,您还可以将新密钥添加到特定插槽。

为此,请在 cryptsetup luksAddKey 中使用 -S 选项,如下所示。

在本例中,我们将新的 LUKS 键添加到 Slot#5。我将新密码分配为:PasswordforSlot5

# cryptsetup luksAddKey /dev/sdb1 -S 5

正如我们在下面看到的,现在 Slot#5 显示“ENABLED”,而 slot#3 和 #4 仍处于 DISABLED 状态。

# cryptsetup luksDump /dev/sdb1 | grep Slot
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: ENABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

在这个阶段,我们有 4 个 LUKS 密钥分配给 /dev/sdb1 加密分区。

4. 删除现有的 LUKS 密钥

要从 LUKS 分区中删除现有密钥,请使用 cryptsetup luksRemoveKey,如下所示。

在此示例中,您只需输入要删除的密码(密钥)。

从插槽中移除/擦除/删除 LUKS 密钥。您不必指定插槽号。而是指定要删除的密钥!。

在这个例子中,当它提示“Enter LUKS passphrase to be deleted:”时,我输入了上一个例子中创建的密钥:PasswordforSlot5

# cryptsetup luksRemoveKey /dev/sdb1
Enter LUKS passphrase to be deleted: 

从以下 luksDump 输出中可以看到,Slot#5 中的密钥现在已被擦除。

# cryptsetup luksDump /dev/sdb1 | grep Slot
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

5. 使用 luksKillSlot 删除一个 LUKS Key

如果您没有特定插槽的密钥,但只想删除它,您可以使用 cryptsetup luksKillSlot 命令执行此操作,如下所示。

在本例中,我们从 LUKS slot#2 中删除密钥。

为此,您必须为任何一个插槽输入 LUKS 密钥。这仅作为从插槽#2 中删除密钥之前的验证。

# cryptsetup luksKillSlot /dev/sdb1 2
Enter any remaining LUKS passphrase: 

正如您从以下 luksDump 输出中看到的,现在 Slot#2 中的密钥已被擦除。

# cryptsetup luksDump /dev/sdb1 | grep Slot
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

6. 从文件中添加新的 LUKS 密钥

您还可以根据已有的密钥文件添加新的 LUKS 密钥,如下所示。

# cryptsetup luksAddKey  /dev/sdb1 masterkeyfile
Enter any passphrase: 

在上面:

  • masterkeyfile 包含您要添加的新 LUKS 密钥。这应该是一个二进制文件。
  • 当它提示“输入任何密码:”时,为 /dev/sdb1 分区输入任何一个现有的 LUKS keyu。
  • 正如您在上面看到的,它没有提示输入新的 LUKS 密钥,因为它是从主密钥文件中获取的。

正如您从以下 luksDump 输出中看到的那样,主密钥文件中的这个新密钥被添加到 slot#2

# cryptsetup luksDump /dev/sdb1 | grep Slot
Key Slot 0: ENABLED
Key Slot 1: ENABLED
Key Slot 2: ENABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

7. 重置忘记的 LUKS 密钥 - 获取现有密钥

如果您重新启动服务器,并且无法挂载加密的 LUKS 分区,因为您忘记了您的 LUKS 密码,那么您运气不好,您可以重置它。

但是,如果已经打开了一个加密的 LUKS 分区,并且您还没有重新启动系统,并且您忘记了已经挂载的分区的 LUKS 密码(自上次重新启动以来至少打开了一次 LUKS),那么您可以分配一个新的 LUKS 键。

在这种“忘记了我的 LUKS 密码”的场景中,您可以执行以下两个步骤:

  1. 从 LUKS 分区中提取当前的加密密钥
  2. 使用上面提取的加密密钥创建一个新的 LUKS 密钥

在这个例子中,我安装了 /home1 分区,这是一个 LUKS 加密分区,但我没有密码。

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             127G   44G   76G  37% /
/dev/mapper/home1      93G  188M   88G   1% /home1

卷名是上述 df 命令输出的第一列中“/dev/mapper/”之后的任何内容。因此,在我们的示例中,卷名是“home1”

以下 dmsetup 表 –showkeys 将显示安装在系统上的所有分区的加密密钥。

# dmsetup table --showkeys 
home1: 0 197259264 crypt aes-cbc-essiv:sha256 607f482870c795a9b1e307ffbfc6643eaa219e9ef8c6773de02cd298c8fcda3c 0 8:17 4096

“aes-cbc-essiv:sha256”后面的字段是加密密码。获取加密的 LUKS 密钥并将其存储在文件中。

# vi existinglukskey.txt
607f482870c795a9b1e307ffbfc6643eaa219e9ef8c6773de02cd298c8fcda3c

8. 重置忘记的 LUKS 密钥 – 创建二进制密钥文件

现在,我们必须将这个现有的密钥从文本文件转换为二进制文件。使用 xxd 命令,如下所示。

# xxd -r -p existinglukskey.txt existinglukskey.bin

在上面:

  • -r 选项用于反向。这会将十六进制转储转换为二进制。
  • -p 选项用于后记。这表明 postscript 连续 hexdump 样式。
  • 现有lukskey.txt 输入文件
  • 现有的lukskey.bin 输出文件。这现在将在二进制文件中包含现有的加密 LUKS 密码。

9. 重置忘记的 LUKS 密钥 - 添加新密钥

最后,使用我们提取到二进制文件中的现有 LUKS 密钥添加一个新的 LUKS 密钥。

# cryptsetup luksAddKey /dev/sdb1 --master-key-file <(cat existinglukskey.bin)
Enter new passphrase for key slot: 
Verify passphrase: 

在上面:

  • --master-key-file 在此指定二进制文件。不要使用现有的lukskey.txt。而是使用我们在上面创建的现有lukskey.bin。
  • 正如您在上面看到的,luksAddKey 没有要求提供现有的 LUKS 密码,因为它是从二进制文件中获取的。
  • 当提示“Enter new passphrase for key slot:”时,输入新的 LUKS 密码。但是,这一次,不要忘记这一点。

再次记住这一点:如果您在重新启动系统后忘记了 LUKS 密码,那么您就失去了 Luks(运气不好),因为您无法重置它。

10. 转储 LUKS MasterKey

您还可以转储 MasterKey 并将其保存在某个地方。将 –dump-master-key 选项与 luksDump 一起使用,如下所示。

# cryptsetup luksDump --dump-master-key /dev/sdb1
Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase: 
LUKS header information for /dev/sdb1
Cipher name:    aes
Cipher mode:    cbc-essiv:sha256
Payload offset: 4096
UUID:           146d639a-757c-4bcb-aee6-8fe815345104
MK bits:        256
MK dump:        60 7f 48 28 70 c7 95 a9 b1 e3 07 ff bf c6 64 3e 
                aa 21 9e 9e f8 c6 77 3d e0 2c d2 98 c8 fc da 3c 

请记住,您必须将 LUKS 标头转储存储在安全的地方。使用主密钥转储,有人可以访问 LUKS 加密分区。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。