RHEL8上自动为LUKS加密硬盘填充密码(1/2)

发布时间 2023-06-14 18:17:43作者: **smartheye**

RHEL8上硬盘加密采用的是LUKS方式。默认的话需要在开机时候手动输入硬盘密码。在这里我们为了自动化操作,可以设置密码储存在磁盘上让Linux自动读取硬盘解密。

注意密码储存在硬盘有不安全的风险。

1. 首先查看硬盘情况

执行命令lsblk

可以看到/sda/sda1这块硬盘未加密。这里先不处理,在下一篇讲如何为这块硬盘加密。

我们这次要处理的硬盘是/dev/nvme0n1p3下面的luks-556b55d3-fbec-4b07-8b15-b0470b5f7c4a这块被加密的分区。这个分区是根分区,被mount到/

2. 获取luks-556b55d3-fbec-4b07-8b15-b0470b5f7c4a分区的UUID

其实UUID就是luks后面的556b55d3-fbec-4b07-8b15-b0470b5f7c4a。

如果我们要用命令来获取的话,可以执行

sudo cryptsetup luksUUID /dev/nvme0n1p3

输出

556b55d3-fbec-4b07-8b15-b0470b5f7c4a

如果是一般的机械硬盘,命令是sudo cryptsetup luksUUID /dev/sda1等等

3. 新建一个luks加密key,并且把这个key添加到luks-556b55d3-fbec-4b07-8b15-b0470b5f7c4a分区

我们在硬盘加密工具上新建分区的时候,已经输入了一个人类比较好记忆的密钥来解密硬盘。这里不把这个密钥直接写进硬盘,而是另外新建一个非常长的密钥来加解密硬盘。当然原来的密钥也一样可以解密硬盘。

命令如下

sudo openssl genrsa -out /root/lukskey 2048
sudo chmod 400 /root/lukskey
sudo cryptsetup luksAddKey /dev/mapper/vg_li4869957701-lv_root /root/lukskey

这里我们生成一个rsa2048位密钥,保存到/root目录下,然后设置权限为400,然后再把这个key加到分区/dev/mapper/vg_li4869957701-lv_root上。vg_li4869957701-lv_root这个名字可以从lsblk命令输出中获取。

4. 修改/etc/crypttab

执行命令

sudo vim /etc/crypttab

如果/etc/crypttab这个文件不存在的话,就新建一个文本文件。权限似乎不讲究。

在这个crypttab文件里,加入(如果有的话就修改)下面这段话

luks-556b55d3-fbec-4b07-8b15-b0470b5f7c4a UUID=556b55d3-fbec-4b07-8b15-b0470b5f7c4a /root/lukskey luks

一共有四项,分别以空格分割

第一项:luks-556b55d3-fbec-4b07-8b15-b0470b5f7c4a 来自于/dev/mapper对应的文件名

第二项:UUID=后面跟着前面取到的分区UUID

第三项:/root/lukskey,这是一个文本文件,存放着加密密钥的明文

第四项:可以固定写luks。如果要有其他选项,可以参考man crypttab

crypttab的参考手册:链接

5. 修改fstab

fstab一般是下面的样子。fstab里没有关于加解密的配置,一般不需要修改

/dev/mapper/vg_li4869957701-lv_root    /    xfs    defaults,x-systemd.device-timeout=0 0 0

6. 重建initramfs

RHEL是用dracut工具管理initramfs的,和debian系不一样。注意不要一个劲的去敲update-initramfs。

执行命令

sudo dracut --include /root/lukskey /root/lukskey --regenerate-all --force

关于dracut有一篇不错的教程:How to build an initramfs using Dracut on Linux

这里我们要确定文件/root/lukskey被打包到initramfs里去了。如果文件没有被打包到initramfs,那再启动的时候luks还是要求输入密钥。

这里找到了RHEL专用的命令lsinitrd。lsinitrd的详细教程可以看这里:

How to build an initramfs using Dracut on Linux (下半部分)

man lsinitrd

​查看/etc/crypttab是不是被更新

sudo lsinitrd /boot/initramfs-4.18.0-477.13.1.el8_8.x86_64.img etc/crypttab

从输出可以看到已经被更新了

查看/root/lukskey是不是已经在initramfs里

sudo lsinitrd /boot/initramfs-4.18.0-477.13.1.el8_8.x86_64.img root/lukskey

从输出可以看到已经在里面了

7. 重启Linux

此时无需再输入磁盘加密密码