在LUKS上安装具有完整系统加密和LVM的Archlinux

在这篇文章中,您将了解有关我在请病假期间的奇怪研究的一些信息。 一次将涉及几件事,这不是“最佳实践”,但也是可能的! 因此,这是有关如何安装Archlinux(我最喜欢的distr)的教程,以便:

  • 没有单独的/启动(仅在/根目录下)
  • /在lvm上
  • 在luks容器内的lvm
  • 使用UEFI
  • 在虚拟机中。
  • 安全启动 (虚拟机中的“困难”不太可能成功)

值得注意的是,除了带有单个grubx64.efi文件的EFI系统分区以外,所有内容都将被加密-一个运行grub的EFI应用程序。

如果您有兴趣,欢迎来猫!

首先,我将它们全部设置在Lenovo X240笔记本电脑上,然后写这篇文章,在Proxmox中将虚拟机与OVMF一起使用。

测试平台设置:


一切都是相当标准地创建的。 该图像使用了我最喜欢的拱门,可以随时从Yandex下载。

接下来,在Proxmox中关于UEFI的虚拟中的几点。 要使用UEFI测试支架的操作(否则就不会那么有趣),您需要在虚拟机的属性中设置OVMF而不是SeaBIOS:



接下来,相应地添加UEFI磁盘,以得到如下内容:



现在我们可以启动虚拟机并开始安装过程。 在虚拟机控制台中,立即启动sshd服务,设置root密码并找出虚拟机的dhcp地址:



接下来,我们可以继续使用ssh使其更加方便。

磁盘布局


因此,已经通过ssh连接后,我们首先设置时间,以免以后再证明将来会创建文件系统:

timedatectl set-ntp true && timedatectl set-timezone Europe/Moscow 

检查一切正确:

 root@archiso ~ # timedatectl Local time: Tue 2018-08-14 13:42:03 MSK Universal time: Tue 2018-08-14 10:42:03 UTC RTC time: Tue 2018-08-14 10:42:04 Time zone: Europe/Moscow (MSK, +0300) System clock synchronized: yes NTP service: active RTC in local TZ: no 

现在我们可以开始对磁盘进行分区了。 在这个阶段,我有一个/ dev / vda驱动器, Virtio控制器,这只是一个没有分区表的空磁盘:

 root@archiso ~ # fdisk -l /dev/vda Disk /dev/vda: 15 GiB, 16106127360 bytes, 31457280 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes 

我们将其分为2个分区:

  • UEFI应用程序的fat32磁盘(EFI_system_partition)
  • LUKS容器及其他所有内容

使用gdisk创建GPT:

 root@archiso ~ # gdisk /dev/vda GPT fdisk (gdisk) version 1.0.4 Command (? for help): o This option deletes all partitions and creates a new protective MBR. Proceed? (Y/N): y 

接下来,为EFI创建第一个分区,类型为EF00(EFI系统分区):

 Command (? for help): n Partition number (1-128, default 1): First sector (34-31457246, default = 2048) or {+-}size{KMGTP}: Last sector (2048-31457246, default = 31457246) or {+-}size{KMGTP}: +512M Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): <b>EF00</b> Changed type of partition to 'EFI System' 

现在为LUKS创建一个分区,在这里我们甚至不用理会该类型,并保持原样:

 Command (? for help): n Partition number (2-128, default 2): First sector (34-31457246, default = 1050624) or {+-}size{KMGTP}: Last sector (1050624-31457246, default = 31457246) or {+-}size{KMGTP}: <b>Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): Changed type of partition to 'Linux filesystem'</b> 

我们将写下更改并完成分区标记:

 Command (? for help): w Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!! Do you want to proceed? (Y/N): y OK; writing new GUID partition table (GPT) to /dev/vda. The operation has completed successfully. 

创建一个LUKS容器和文件系统


在第一部分(vda1)中,一切都非常简单。 我们只需要格式化它,就这样:

 root@archiso ~ # mkfs.vfat /dev/vda1 mkfs.fat 4.1 (2017-01-24) 

第二个分区是您必须首先准备的容器。 我们通过cryptsetup格式化分区并设置密码:

 root@archiso ~ # cryptsetup -v luksFormat /dev/vda2 WARNING! ======== This will overwrite data on /dev/vda2 irrevocably. Are you sure? (Type uppercase yes): YES Enter passphrase for /dev/vda2: Verify passphrase: Command successful. 

***我不必担心密码的选择,而是用urandom和其他字体覆盖了随机化,只是创建了一个默认容器。

接下来,通过指定相同的密码短语来打开容器:

 root@archiso ~ # cryptsetup luksOpen /dev/vda2 container Enter passphrase for /dev/vda2: 

现在我们有了一个可以通过设备映射器访问的开放容器:

 root@archiso ~ # ls -l /dev/mapper | grep container lrwxrwxrwx 1 root root 7 Aug 14 14:01 container -> ../dm-0 

现在我们可以继续使用lvm(我将以一种快速的方式编写,因为这不是主题):

 root@archiso ~ # pvcreate /dev/mapper/container Physical volume "/dev/mapper/container" successfully created. root@archiso ~ # vgcreate rootvg /dev/mapper/container Volume group "rootvg" successfully created root@archiso ~ # lvcreate -L1G -n swap rootvg Logical volume "swap" created. root@archiso ~ # lvcreate -L5G -n root rootvg Logical volume "root" created. root@archiso ~ # lvcreate -L2G -n home rootvg Logical volume "home" created. root@archiso ~ # lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert home rootvg -wi-a----- 2.00g root rootvg -wi-a----- 5.00g swap rootvg -wi-a----- 1.00g 

接下来,在我们的lv上创建文件系统:

 root@archiso ~ # mkfs.ext4 -L root /dev/mapper/rootvg-root mke2fs 1.44.3 (10-July-2018) ... Writing superblocks and filesystem accounting information: done [root@archiso ~]# mkfs.ext4 -L home /dev/mapper/rootvg-home mke2fs 1.44.3 (10-July-2018) Creating filesystem with 524288 4k blocks and 131072 inodes ... Writing superblocks and filesystem accounting information: done [root@archiso ~]# mkswap -L swap /dev/mapper/rootvg-swap ... LABEL=swap, UUID=98b0bc31-1c62-4fec-bb97-e1913d1e8cb4 

现在可以安装所有这些来安装基本系统。 安装点将是/ mnt,这是我们未来系统的根目录:

 [root@archiso ~]# mount /dev/mapper/rootvg-root /mnt/ [root@archiso ~]# mkdir -p /mnt/{home,boot/efi} 

*** / boot / efi我创建的目的是使/ boot本身保留在/ dev / mapper / rootvg-root上,并且efi文件夹已经挂载在/ dev / vda1(fat32 efi分区)上:

 [root@archiso ~]# mount /dev/vda1 /mnt/boot/efi/ [root@archiso ~]# mount /dev/mapper/rootvg-home /mnt/home/ [root@archiso ~]# swapon /dev/mapper/rootvg-swap 

检查当前安装点(总是有用):

 [root@archiso ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 462.5M 1 loop /run/archiso/sfs/airootfs sr0 11:0 1 573M 0 rom /run/archiso/bootmnt vda 254:0 0 15G 0 disk ├─vda1 254:1 0 512M 0 part /mnt/boot/efi └─vda2 254:2 0 14.5G 0 part └─container 253:0 0 14.5G 0 crypt ├─rootvg-swap 253:1 0 1G 0 lvm [SWAP] ├─rootvg-root 253:2 0 5G 0 lvm /mnt └─rootvg-home 253:3 0 2G 0 lvm /mnt/home 

如我们所见,一切都是诚实的,现在是时候摆放拱门了。

基本系统安装


使用pacstrap软件包从基础集和base-devel集安装基础包(您可以将所需的所有内容放到它们中,除此之外):

 pacstrap /mnt base base-devel 

一切顺利启动,基本系统已准备就绪。 自然,我删除了结论。 现在,我们可以配置该系统以启动并工作。

根据基本情况,我们立即生成fstab:

 genfstab -pU /mnt >> /mnt/etc/fstab 

接下来,使arch-chroot进入这个新系统:

 [root@archiso ~]# arch-chroot /mnt 

*** arch-chroot是一个非常有用的实用程序,因为它可以单独执行所有操作。 尽管您始终可以使用标准chroot,但在执行此操作之前,请遵循gentoo-handbook wiki.gentoo.org/wiki/Handbook中的说明 :AMD64 /安装/基础部分“安装必要的文件系统”

立即配置系统时间和主机名:

 ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime && \ hwclock --systohc && \ echo luks-test > /etc/hostname 

设置root密码:

 [root@archiso /]# passwd root New password: Retype new password: passwd: password updated successfully 

在/etc/locale.gen中取消注释所需的语言环境:

 [root@archiso /]# vi /etc/locale.gen [root@archiso /]# grep -v '^#' /etc/locale.gen en_US ISO-8859-1 en_US.UTF-8 UTF-8 ru_RU.UTF-8 UTF-8 ru_RU ISO-8859-5 

我们将生成它们:

 [root@archiso /]# locale-gen Generating locales... en_US.ISO-8859-1... done en_US.UTF-8... done ru_RU.UTF-8... done ru_RU.ISO-8859-5... done Generation complete 

立即为系统和控制台配置它们:

 [root@archiso /]# echo LANG=en_US.UTF-8 > /etc/locale.conf [root@archiso /]# echo KEYMAP=ru > /etc/vconsole.conf [root@archiso /]# echo FONT=cyr-sun16 >> /etc/vconsole.conf 

现在配置/etc/mkinitcpio.conf文件,该文件在生成initramfs时负责选项,钩子等:

 vi /etc/mkinitcpio.conf 

最重要的是钩子及其顺序:

 HOOKS=(base udev autodetect modconf block keymap encrypt lvm2 resume filesystems keyboard fsck) 

***从交换休眠状态后,恢复挂接以启动系统。 在虚拟机上不需要它。 我从山毛榉那里复制了它。

现在我们可以生成initramfs:

 [root@archiso /]# mkinitcpio -p linux ==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'default' -> -k /boot/vmlinuz-linux -c /etc/mkinitcpio.conf -g /boot/initramfs-linux.img ==> Starting build: 4.17.14-arch1-1-ARCH -> Running build hook: [base] -> Running build hook: [udev] -> Running build hook: [autodetect] -> Running build hook: [modconf] -> Running build hook: [block] -> Running build hook: [keymap] -> Running build hook: [encrypt] -> Running build hook: [lvm2] -> Running build hook: [resume] -> Running build hook: [filesystems] -> Running build hook: [keyboard] -> Running build hook: [fsck] ==> Generating module dependencies ==> Creating gzip-compressed initcpio image: /boot/initramfs-linux.img ==> Image generation successful 

现在我们有了系统,我们需要安装引导加载程序本身。 我的选择落在了grub(2)上,因为它在某种程度上更加熟悉并且可以很容易地从加密分区中加载内核(嗯,否则我并没有真正寻找其他人)。

安装grub包:

 [root@archiso /]# pacman -S grub dosfstools efibootmgr mtools 

在生成配置之前,请编辑默认的grub选项:

 vim /etc/default/grub 

在这里,您需要取消注释一条重要的行(当然,没有评论):

 # Uncomment to enable booting from LUKS encrypted devices GRUB_ENABLE_CRYPTODISK=y 

并将(默认情况下为空)添加到GRUB_CMDLINE_LINUX:

 GRUB_CMDLINE_LINUX="cryptdevice=UUID=5ad7c9ad-fb17-4839-925e-479432516c07:container" 

我从blkid获​​取的UUID:

 [root@archiso /]# blkid | grep vda2 /dev/vda2: UUID="5ad7c9ad-fb17-4839-925e-479432516c07" TYPE="crypto_LUKS" PARTLABEL="Linux filesystem" PARTUUID="667a1243-17ff-4f03-952c-5afd5e3415cc" 

我们为grub生成一个配置:

 [root@archiso /]# grub-mkconfig -o /boot/grub/grub.cfg Generating grub configuration file ... WARNING: Failed to connect to lvmetad. Falling back to device scanning. Found linux image: /boot/vmlinuz-linux Found initrd image: /boot/initramfs-linux.img Found fallback initrd image(s) in /boot: initramfs-linux-fallback.img WARNING: Failed to connect to lvmetad. Falling back to device scanning. done 

接下来,将grub本身安装在磁盘上:

 [root@archiso /]# grub-install /dev/vda Installing for x86_64-efi platform. ... Installation finished. No error reported. 

***您可以添加--recheck --debug,指定体系结构...但是...它确实可以单独工作)

现在,我们将编辑/ etc / crypttab,以便系统本身知道在加载时必须解密LUKS部分。 添加行:

 echo "container /dev/vda2 none" >> /etc/crypttab 

这意味着您需要为/ dev / vda2分区请求密码(无密码),并已通过设备映射器将该密码作为容器显示。

现在我们准备退出chroot并重新启动系统:

 [root@archiso /]# exit exit [root@archiso ~]# reboot Welcome back! 

现在,让我们转到虚拟机控制台以查看结果:



在此阶段,我们使用/ dev / vda1启动了EFI应用程序/boot/efi/EFI/arch/grubx64.efi,该应用程序要求我们提供密码以解密容器。

接下来,输入密码后:



这是熟悉的grub窗口,其中包含/boot/grub/grub.cfg中的启动选项。
此时,grub解密了我们的容器,并获得了对该文件本身(/boot/grub/grub.cfg),内核和initramfs的访问权限。 选择该选项后,内核将默认启动initramfs:



积极地,内核提出了加密钩子,该钩子再次要求我们提供解密容器的密码(通常,您需要输入两次密码,但可能是您为两个容器创建了两个容器,以防止多余的妄想引起的启动和root :)

然后在系统完全加载后:



PS:为了增加精神分裂症的水平,仅安全启动不足以对我们的grubx64.efi引导加载程序进行签名。

我发现只将内核和initramfs放在/ dev / vda1上是没有意思的,因为我已经做过100次了。 其他引导加载程序(例如SHIM,bootctl等)不知道如何执行此操作(嗯,如果我不知道,请在评论中告诉我们)

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


All Articles