如何在Linux中使用LUKS加密根分区和整个文件系统
在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中对根分区和物理卷进行加密,我们需要cryptsetup
rpm
说明:
在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/crypttab
和grub.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服务器获取密钥并继续引导。