引导时解码LUKS容器

晚上好,晚上好! 对于使用LUKS数据加密并希望在解密 根分区阶段在Linux(Debian,Ubuntu)下解密解密磁盘的人来说,这篇文章将很有用。 而且我在互联网上找不到此类信息。

最近,随着架子上磁盘数量的增加,我遇到了使用/ etc / crypttab而不是众所周知的方法解密磁盘的问题。 就个人而言,我重点介绍了使用此方法的几个问题,即, 仅在安装了根分区(挂载)之后才读取文件,这会对ZFS导入产生负面影响,尤其是如果它们是从* _crypt设备或mdadm raid上的分区中收集的也从各部分收集。 我们都知道您可以在LUKS容器上使用parted吗? 还有没有阵列但需要使用某些服务时其他服务提早启动的问题(我在iSCSI上使用群集的Proxmox VE 5.x和ZFS)。

关于ZFSoverISCSI的一些知识
iSCSI通过LIO为我工作,实际上,当iscsi目标启动且看不到ZVOL设备时,它只是将它们从配置中删除,这不允许来宾系统启动。 因此,要么恢复json文件备份,要么手动添加带有每个VM标识符的设备,当有数十台这样的机器并且每台机器的配置中有多个磁盘时,这简直太糟糕了。

我将考虑的第二个问题是如何解密(这是本文的重点)。 我们将在下面讨论这一点,削减开支!

最常见的是,在Internet上,他们使用密钥文件(将cryptsetup luksAddKey命令添加到其自身之前的插槽中),或者使用极少数例外情况(俄语是非常稀缺的信息)-crypto_derived脚本,该脚本位于/ lib / cryptsetup / script /中。 (当然,还有很多方法,但是我恰好使用了这两种方法,它们构成了本文的基础)。 我还努力在重新引导后争取完全自主包含,而在控制台中没有任何其他命令,以使所有内容立即“起飞”。 那为什么要等? --

让我们开始吧!

我们假设在加密分区sda3_crypt上安装了一个系统(例如Debian)和许多磁盘,这些磁盘已准备好加密和创建您喜欢的任何东西。 我们有一个用于解锁sda3_crypt的密码,正是在本节中,我们将从正在运行(已解密)的系统上的密码中删除“哈希”,并将其添加到其他驱动器中。 一切都是基本的,在控制台中我们执行:

/lib/cryptsetup/scripts/decrypt_derived sda3_crypt | cryptsetup luksFormat /dev/sdX 

X是我们的磁盘,分区等。

用我们的密码中的“哈希”对驱动器进行加密后,您需要找出UUID或ID(取决于您习惯于谁和做什么)。 我们分别从/ dev / disk / by-uuid和by-id获取数据。

下一阶段是准备工作所需的功能的文件和小型脚本,我们继续进行:

 cp -p /usr/share/initramfs-tools/hooks/cryptroot /etc/initramfs-tools/hooks/ cp -p /usr/share/initramfs-tools/scripts/local-top/cryptroot /etc/initramfs-tools/scripts/local-top/ 

进一步

 touch /etc/initramfs-tools/hooks/decrypt && chmod +x /etc/initramfs-tools/hooks/decrypt 

内容../解密
 #!/bin/sh cp -p /lib/cryptsetup/scripts/decrypt_derived "$DESTDIR/bin/decrypt_derived" 


进一步

 touch /etc/initramfs-tools/hooks/partcopy && chmod +x /etc/initramfs-tools/hooks/partcopy 

内容../partcopy
 #!/bin/sh cp -p /sbin/partprobe "$DESTDIR/bin/partprobe" cp -p /lib/x86_64-linux-gnu/libparted.so.2 "$DESTDIR/lib/x86_64-linux-gnu/libparted.so.2" cp -p /lib/x86_64-linux-gnu/libreadline.so.7 "$DESTDIR/lib/x86_64-linux-gnu/libreadline.so.7" 


还有一些

 touch /etc/initramfs-tools/scripts/local-bottom/partprobe && chmod +x /etc/initramfs-tools/scripts/local-bottom/partprobe 

内容../partprobe
 #!/bin/sh $DESTDIR/bin/partprobe 


最后,在update-initramfs之前,您需要编辑文件/ etc / initramfs-tools / scripts / local-top / cryptroot,从〜360行开始,下面是一段代码

原来的
 # decrease $count by 1, apparently last try was successful. count=$(( $count - 1 )) message "cryptsetup ($crypttarget): set up successfully" break 


并带到这个表格

已编辑
 # decrease $count by 1, apparently last try was successful. count=$(( $count - 1 )) /bin/decrypt_derived $crypttarget | cryptsetup luksOpen /dev/disk/by-uuid/ *CRYPT_MAP* /bin/decrypt_derived $crypttarget | cryptsetup luksOpen /dev/disk/by-id/ *CRYPT_MAP* message "cryptsetup ($crypttarget): set up successfully" break 


请注意,此处可以使用UUID或ID。 最主要的是,将HDD / SSD设备的必要驱动程序添加到了/ etc / initramfs-tools / modules中。 您可以通过udevadm info -a -n / dev / sdX查找要使用的驱动程序 egrep'外观|驾驶员'

既然我们已经完成了所有文件,就可以运行update-initramfs -u -k all -v了 ,在日志中执行脚本应该没有错误。 我们重新启动,输入密码,然后稍等,具体取决于磁盘数量。 接下来,系统将启动,并在启动的最后阶段,即“挂载”根分区之后,将执行partprobe命令-它会在LUKS设备上找到并拾取所有已创建的分区,并且任何阵列(无论是ZFS还是mdadm)都可以毫无问题地组装! 而这一切在加载基本服务和需要这些磁盘/阵列的服务之前

update1 :如AEP 所述 ,此方法仅适用于LUKS1。

Source: https://habr.com/ru/post/zh-CN457260/


All Articles