0%

【Linux技术分享】deepin实现boot分区加密

deepin实现boot分区加密

当前linux下的磁盘加密,为了保证系统的正常启动,一般不会将引导分区进行加密。luck2在grub2.06版本以后支持了boot分区加密,但是仍然无法支持mbr分区格式的引导加密,本文旨在解决此问题

问题起因

在原子更新开发时,发现引导项需要保存至/boot分区中,但是/boot分区的存储空间固定的,再多个版本迭代进行更新后会出现分区空间不足问题,此时需考虑将引导向的备份存储至其他分区。如果用户选择了全盘加密,在用户的grub内核选择阶段,必须将加密磁盘解密,否则找到当前备份的内核文件,此时问题则变为如何在grub阶段或者在grub阶段前将磁盘进行解密,等效于加密/boot分区后如何在grub阶段前将/boot分区进行解密。

boot分区解密

mbr启动流程

  1. mbr主要组成为core.img的结构,首先是diskboot.img,接下来是解压缩程序lzma_decompress.img,再往下是kernel.img,最后是各个模块module对应的映像,细节查看,http://www.pixelbeat.org/docs/disk/。
    图1

  2. 首先读取第一扇区的boot.img,该文件处的某处一定保存了整个core.img的起始扇区,然后从该起始扇区处首先读取一个扇区,即diskboot.img,该映像的结尾处保存了后续映像的长度,根据该长度读取这些数据,数据的头部即lzma_decompress.img映像又保存了加压缩的参数,例如压缩文件的大小,以及解压缩后文件的大小,根据这些参数对后续数据进行解压缩,得到kernel.img以及各个module模块的映像起始地址,最后进入kernel.img的入口函数继续执行,具体模块查看https://www.gnu.org/software/grub/manual/grub/html_node/Images.html。

uefi启动流程

grub2.06+luks2+mbr

根据mbr启动流程,我们可知,将我们的解密代码存放至core文件中,即可在grub加载前对磁盘进行解密。

  1. 创建脚本grub-pre.cfg内容如下
1
2
3
4
5
cryptomount -a
set root=crypto0
set prefix=($root)/grub
insmod normal
normal
  1. 生成img文件, grub-mkimage -p /boot/grub -O i386-pc -c grub-pre.cfg -o /boot/grub/i386-pc/core2.img luks2 part_gpt cryptodisk gcry_rijndael pbkdf2 gcry_sha256 ext2 part_msdos biosdisk

  2. 将img文件写入磁盘头,grub-bios-setup -b i386-pc/boot.img -c i386-pc/core2.img /dev/sda

  3. 效果如下
    图1

grub2.06+luks1

deepin的20.8需要将luks2降至luks1,但在efi与mbr下都能实现引导加密,具体的操作可以看debian的官方文档

grub2.06+luks2+efi

在grub2.06版本上对引导加密方案是部分支持,具体细节跟加密步骤查看arch的wiki