如何在Linux中使用LUKS加密根分区和整个文件系统

时间:2020-01-09 10:38:16  来源:igfitidea点击:

在Red Hat或者CentOS的从头开始安装期间,我们可以选中该复选框以加密所有可用磁盘,但是一旦安装了OS,也可以对根分区和其他卷进行加密。
我们将使用cryptsetup在线使用LUKS对卷组以及基础物理卷和根分区进行加密。

说明:

无法直接在线在线加密物理卷而不会丢失任何数据。
因此,还有其他方法可以将另一个物理卷添加到现有的卷组并使用LUKS对其进行加密。
然后将现有未加密物理卷的内容移动到加密物理卷。

环境

我有一台运行CentOS 8 Linux的虚拟机,该虚拟机在安装在Linux服务器上的Oracle VirtualBox上运行。

有两个磁盘连接到该VM。

"第一个磁盘"→大小:15GB→/dev/sda3→节点安装在未加密的磁盘上。
第二个磁盘→大小:20GB→/dev/sdb1

说明:

确保计划将文件系统迁移到的第二个磁盘的大小等于或者大于包含未加密数据的第一个磁盘的大小。

这些是在根卷的运行/活动系统中用加密的物理卷(/dev/sdb1)替换现有的未加密PV(/dev/sda3)的步骤:

重要的提示:

为了安全起见,请先备份,然后再执行以下步骤。

在Linux中安装Cryptsetup

要在Linux中对根分区和物理卷进行加密,我们需要cryptsetuprpm

说明:

在RHEL Linux系统上,我们必须具有RHN的有效订阅,或者我们可以配置本地脱机存储库,通过该本地脱机存储库,yum软件包管理器可以安装提供的rpm及其依赖项。

[root@centos-8 ~]# yum install cryptsetup -y

用LUKS加密备用分区/dev/sdb1

使用luksFormat将新的磁盘/分区初始化为LUKS设备。

提示:

我已经在/dev/sdb磁盘上创建了分区/dev/sdb1. 我们可以使用fdisk/dev/sdb创建一个新分区。

[root@centos-8 ~]# cryptsetup luksFormat /dev/sdb1
WARNING!
========
This will overwrite data on /dev/sdb1 irrevocably.
Are you sure? (Type uppercase yes): YES
Enter passphrase for /dev/sdb1:
Verify passphrase:

使用映射打开加密的LUKS设备。
其中我将我的LUKS设备映射到/dev/mapper/secret
完成此步骤后,我们应该在LInux系统上看到/dev/mapper/secret加密文件系统

[root@centos-8 ~]# cryptsetup luksOpen /dev/sdb1 secret
Enter passphrase for /dev/sdb1:

创建加密的物理卷

现在,我们将从加密根分区的步骤开始。
第一步将是使用我们的LUKS Mapping/dev/mapper/secret创建物理卷。

[root@centos-8 ~]# pvcreate /dev/mapper/secret
  Physical volume "/dev/mapper/secret" successfully created.

列出可用的物理设备。
如我们所见,当前,我们在/dev/sdb1上有一个加密的物理卷/dev/mapper/secret,还有一个未加密的物理卷/dev/sda3

[root@centos-8 ~]# pvs
  PV                 VG   Fmt  Attr PSize   PFree
  /dev/mapper/secret      lvm2 ---   19.99g 19.99g
  /dev/sda2          rhel lvm2 a--  <14.50g     0

加密卷组

接下来,通过添加新创建的物理卷来扩展卷组。
这样,我们就可以更进一步地在Linux系统中对卷组进行加密。

[root@centos-8 ~]# vgextend rhel /dev/mapper/secret
  Volume group "rhel" successfully extended

列出可用的卷组。
如我们所见,我们的VG具有两个物理卷,其中PV/dev/mapper/secret之一是LUKS加密的。

[root@centos-8 ~]# vgs
  VG   #PV #LV #SN Attr   VSize  VFree
  rhel   2   2   0 wz--n- 34.48g <19.99g

列出可用的物理卷。
正如我们在加密的物理卷中看到的那样,我们有19GB的可用空间,而未加密的PV(/dev/sda3)的内容为14.5GB,因此我们可以轻松地将内容迁移到加密的物理卷中。

[root@centos-8 ~]# pvs
  PV                 VG   Fmt  Attr PSize   PFree
  /dev/mapper/secret rhel lvm2 a--  <19.99g <19.99g
  /dev/sda2          rhel lvm2 a--  <14.50g      0

用LUKS加密根分区

我们的root和swap分区是rhel卷组中的逻辑卷。
现在,由于我们已将加密的物理卷添加到我们现有的卷组中。
我们将使用pvmove将PV1(/dev/sda3)的内容移动到PV2(/dev/mapper/secret)。

[root@centos-8 ~]# pvmove /dev/sda2 /dev/mapper/secret
  /dev/sda2: Moved: 0.05%
  /dev/sda2: Moved: 6.44%
  /dev/sda2: Moved: 32.93%
  /dev/sda2: Moved: 58.18%
  /dev/sda2: Moved: 78.15%
  /dev/sda2: Moved: 100.00%

如我们所见,我们的加密物理卷具有PV1/dev/sda3中的所有内容,PV1为空。

[root@centos-8 ~]# pvs
  PV                 VG   Fmt  Attr PSize   PFree
  /dev/mapper/secret rhel lvm2 a--  <19.99g   5.49g
  /dev/sda2          rhel lvm2 a--  <14.50g <14.50g

使用vgs类似,我们看到我们的VG有2个物理卷

[root@centos-8 ~]# vgs
  VG   #PV #LV #SN Attr   VSize  VFree
  rhel   2   2   0 wz--n- 34.48g <19.99g

为了加密卷组,因为我们已经将数据迁移到加密的物理卷,所以我们可以从`rhel'VG中删除未加密的物理卷。

[root@centos-8 ~]# vgreduce rhel /dev/sda2
  Removed "/dev/sda2" from volume group "rhel"

一旦完成,还应删除未加密的物理卷以完全加密卷组,因为我们没有更多未加密的物理卷。

[root@centos-8 ~]# pvremove /dev/sda2
  Labels on physical volume "/dev/sda2" successfully wiped.

更新GRUB2和/etc/crypttab中的加密LUKS设备详细信息

现在,由于我们已将所有数据迁移到加密的LUKS设备以加密根分区,因此我们还必须配置GRUB2来处理重启。
更新/etc/crypttabgrub.cfg中的LUKS设备详细信息

我们将使用LUKS设备的关键详细信息更新/etc/crypttab

该命令将生成我们的LUKS设备的UUID并将其添加到/etc/crypttab

[root@centos-8 ~]# echo "luks-$(cryptsetup luksUUID /dev/sdb1) UUID=$(cryptsetup luksUUID /dev/sdb1) none" >> /etc/crypttab

提示:

另外,我们也可以生成LUKS设备的UUID并将其手动添加到/etc/crypttab

[root@centos-8 ~]# echo "luks-$(cryptsetup luksUUID /dev/sdb1)"
luks-4c9b0973-407f-44e4-a91b-446014832ce6

以下是我的" crypttab"文件内容

[root@centos-8 ~]# cat /etc/crypttab
luks-4c9b0973-407f-44e4-a91b-446014832ce6 UUID=4c9b0973-407f-44e4-a91b-446014832ce6 none

下一步通过添加LUKS设备的rd.luks.uuid = <UUID>来更新/etc/sysconfig/grub。
这个UUID应该和我们在/etc/crypttab中添加的相同

[root@centos-8 ~]# cat /etc/sysconfig/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet biosdevname=0 net.ifnames=0 rd.luks.uuid=4c9b0973-407f-44e4-a91b-446014832ce6"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true

提示:

我们还使用rd.lvm.lv = <vol_group_name>/<root_logical_volume_name>和再次添加rd.lvm.lv = <vol_group_name>/<swap_logical_volume_name>添加了加密的根目录和交换卷名称。

接下来,使用grub2-mkconfig重建GRUB2配置。

[root@centos-8 ~]# grub2-mkconfig -o /etc/grub2.cfg
Generating grub configuration file ...
done

重建initramfs:

[root@centos-8 ~]# dracut -f

现在,我们可以重新启动Linux节点。
由于我们对根分区进行了加密,因此启动屏幕会在启动前提示我们输入LUKS密码。

在我们的下一篇文章中,我将解释有关基于网络的光盘加密(NBDE)的所有内容,我们可以配置tang服务器来获取密钥,以便具有加密根分区的系统将自动从tang服务器获取密钥并继续引导。