Instale Archlinux con cifrado de sistema completo y LVM en LUKS

En esta publicación leerás un poco sobre mi extraña investigación durante la baja por enfermedad forzada. Se tratará de varias cosas a la vez, que no son "mejores prácticas", ¡sino que también son posibles! Así que aquí hay un tutorial sobre cómo instalar Archlinux (mi distribuidor favorito) para que:

  • sin un / boot separado (solo en / root)
  • / en lvm
  • lvm dentro del contenedor luks
  • con UEFI
  • en una maquina virtual
  • con arranque seguro ("difícil" en la máquina virtual es poco probable que tenga éxito)

Cabe señalar que todo se cifrará, excepto la partición del sistema EFI con un solo archivo grubx64.efi, una aplicación EFI para ejecutar grub.

Si estás interesado, ¡bienvenido a cat!

Primero, configuré todo en mi laptop Lenovo X240, luego para escribir un artículo usé una máquina virtual con OVMF en Proxmox.

Configuración del banco de pruebas:


Todo se crea de manera bastante estándar. La imagen usa mi arco favorito, que siempre se puede descargar desde Yandex .

A continuación, algunos puntos en lo virtual en Proxmox con respecto a UEFI. Para probar el funcionamiento del soporte con UEFI (de lo contrario, no será tan interesante), debe configurar OVMF en lugar de SeaBIOS en las propiedades de la máquina virtual:



A continuación, agregue el disco UEFI en consecuencia, para obtener algo como esto:



Ahora podemos iniciar la máquina virtual y comenzar el proceso de instalación. En la consola de la máquina virtual, inicie inmediatamente el servicio sshd, establezca la contraseña de root y descubra la dirección dhcp de la máquina virtual:



A continuación, podemos seguir trabajando en ssh para que sea más conveniente.

Diseño del disco


Entonces, después de habernos conectado a través de ssh, primero establecemos el tiempo para que luego no resulte que los sistemas de archivos se creen en el futuro:

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

Comprueba que todo está correcto:

 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 

Ahora podemos comenzar a particionar el disco. En esta etapa, tengo una unidad / dev / vda, como Controlador Virtio y esto es solo un disco vacío sin una tabla de particiones:

 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 

Lo dividiremos en 2 particiones:

  • disco fat32 para aplicaciones UEFI (EFI_system_partition)
  • Contenedor LUKS con todo lo demás

Use gdisk para crear el 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 

A continuación, cree la primera partición para EFI con el tipo EF00 (Partición del sistema 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' 

Ahora cree una partición para LUKS, donde ni siquiera nos molestemos con el tipo y lo dejamos como está:

 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> 

Anotaremos los cambios y terminaremos con el marcado de partición:

 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. 

Crear un contenedor LUKS y sistemas de archivos


Con la primera sección (vda1), todo es bastante simple. Solo necesitamos formatearlo y por ahora eso es todo:

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

La segunda partición es el contenedor que primero debe preparar. Formateamos la partición a través de cryptsetup y establecemos la frase de contraseña:

 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. 

*** No me molesté con la elección de los cifrados, con la aleatorización sobrescrita con urandom y otros, sino que simplemente creé un contenedor predeterminado.

A continuación, abra el contenedor especificando la misma frase de contraseña:

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

Ahora tenemos un contenedor abierto accesible a través del mapeador de dispositivos:

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

Ahora podemos continuar con lvm (escribiré de manera rápida, ya que este no es un tema):

 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 

A continuación, cree los sistemas de archivos en nuestro 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 

Ahora todo esto se puede montar para instalar el sistema base. El punto de instalación será / mnt, donde comenzará la raíz de nuestro sistema futuro:

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

*** / boot / efi creo para que / boot permanezca en / dev / mapper / rootvg-root, y la carpeta efi ya esté montada en / dev / vda1 (partición 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 

Verifique los puntos de montaje actuales (siempre útiles):

 [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 

Como vemos, todo es honesto y ahora es el momento de poner el arco en sí.

Instalación del sistema base


Instale los paquetes base de los conjuntos base y base-devel usando el paquete pacstrap (puede poner todo lo que quiera y además de esto):

 pacstrap /mnt base base-devel 

Todo arrancó perfectamente, el sistema base está listo. Naturalmente, eliminé la conclusión. Ahora podemos configurar este mismo sistema para arrancar y trabajar.

De las cosas básicas, generamos inmediatamente fstab:

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

A continuación, haga arch-chroot en este nuevo sistema:

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

*** arch-chroot es una utilidad muy útil, porque hace todo por sí mismo. Aunque siempre puede usar el chroot estándar, antes de hacer esto, siga las instrucciones en el manual de gentoo wiki.gentoo.org/wiki/Handbook : AMD64 / Installation / Base sección "Montaje de los sistemas de archivos necesarios"

Configure inmediatamente la hora del sistema y el nombre de host:

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

Establezca la contraseña de root:

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

Descomente las configuraciones regionales requeridas en /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 

Los generaremos:

 [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 

Inmediatamente configúrelos para el sistema y la consola:

 [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 

Ahora configure el archivo /etc/mkinitcpio.conf, que es responsable de las opciones, enlaces, etc. al generar initramfs:

 vi /etc/mkinitcpio.conf 

Lo más importante son los ganchos y su orden:

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

*** reanudar el enlace para iniciar el sistema después de hibernar desde el intercambio. En una máquina virtual no es necesaria. Lo copié de haya.

Ahora podemos generar 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 

Ahora que tenemos el sistema, necesitamos instalar el gestor de arranque. Mi elección recayó en grub (2), porque es de alguna manera más familiar y bastante fácil de cargar el núcleo desde una partición cifrada (bueno, o realmente no busqué otros).

Instale el paquete grub:

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

Antes de generar la configuración, edite las opciones predeterminadas de grub:

 vim /etc/default/grub 

aquí necesita descomentar una línea importante (sin comentarios, por supuesto):

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

y agregue (está vacío por defecto) a GRUB_CMDLINE_LINUX:

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

UUID que tomé de blkid:

 [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" 

Generamos una configuración para 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 

A continuación, instale grub en el disco:

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

*** puede agregar --recheck --debug, especificar la arquitectura ... pero ... realmente funciona por sí solo)

Ahora editaremos / etc / crypttab para que el propio sistema sepa que al cargar es necesario descifrar la sección LUKS. Agrega la línea:

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

Lo que significa que debe solicitar una contraseña (ninguna) para la partición / dev / vda2 y presentarla ya como contenedor a través del mapeador de dispositivos.

Ahora estamos listos para salir de chroot y reiniciar el sistema:

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

Ahora pasemos a la consola de la máquina virtual para ver el resultado:



En esta etapa, comenzamos la aplicación EFI /boot/efi/EFI/arch/grubx64.efi con / dev / vda1, que nos pide una contraseña para descifrar nuestro contenedor.

Luego, después de ingresar la contraseña:



Aquí está la ventana grub familiar con nuestras opciones de arranque desde /boot/grub/grub.cfg.
En este punto, grub descifró nuestro contenedor y obtuvo acceso a este archivo en sí (/boot/grub/grub.cfg), el kernel e initramfs. Después de seleccionar la opción, el núcleo se iniciará por defecto, initramfs:



Activamente, el kernel apareció con el gancho de cifrado, que nuevamente nos pide la contraseña para descifrar el contenedor (en general, debe ingresar la contraseña 2 veces, pero puede suceder que cree 2 contenedores para el arranque y la raíz por exceso de paranoia :)

Y luego, después de que el sistema esté completamente cargado:



PD: para aumentar el nivel de esquizofrenia, solo el arranque seguro no es suficiente para firmar nuestro gestor de arranque grubx64.efi.

Me pareció poco interesante simplemente poner el kernel e initramfs en / dev / vda1, como ya lo hice 100 veces. Otros cargadores de arranque como SHIM, bootctl, etc. no saben cómo hacer esto (bueno, si no lo sé, díganos en los comentarios)

Source: https://habr.com/ru/post/es420081/


All Articles