Installez Archlinux avec le chiffrement complet du système et LVM sur LUKS

Dans cet article, vous lirez un peu sur mes étranges recherches pendant le congé de maladie forcé. Il s'agira de plusieurs choses à la fois, qui ne sont pas des «bonnes pratiques», mais aussi possibles! Voici donc un tutoriel sur la façon d'installer Archlinux (ma distr préférée) afin que:

  • sans / boot séparé (juste dans / root)
  • / sur lvm
  • lvm à l'intérieur du conteneur luks
  • avec UEFI
  • dans une machine virtuelle.
  • avec démarrage sécurisé ("difficile" dans la machine virtuelle a peu de chances de réussir)

Il est à noter que tout sera crypté à l'exception de la partition système EFI avec un seul fichier grubx64.efi - une application EFI pour exécuter grub.

Si vous êtes intéressé, bienvenue au chat!

Tout d'abord, j'ai tout installé sur mon ordinateur portable Lenovo X240, puis pour écrire un article, j'ai utilisé une machine virtuelle avec OVMF dans Proxmox.

Configuration du banc d'essai:


Tout est créé de façon assez standard. L'image utilise mon arc préféré, qui peut toujours être téléchargé depuis Yandex .

Ensuite, quelques points sur le virtuel dans Proxmox concernant UEFI. Pour tester le fonctionnement du stand avec UEFI (sinon ce ne sera pas si intéressant), vous devez définir OVMF au lieu de SeaBIOS dans les propriétés de la machine virtuelle:



Ensuite, ajoutez le disque UEFI en conséquence, pour obtenir quelque chose comme ceci:



Nous pouvons maintenant démarrer la machine virtuelle et commencer le processus d'installation. Dans la console de la machine virtuelle, démarrez immédiatement le service sshd, définissez le mot de passe root et recherchez l'adresse DHCP de la machine virtuelle:



Ensuite, nous pouvons continuer à travailler sur ssh pour le rendre plus pratique.

Disposition du disque


Donc, après avoir déjà connecté via ssh, nous avons d'abord réglé l'heure pour que plus tard il ne s'avère pas que les systèmes de fichiers seront créés à l'avenir:

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

Vérifiez que tout est correct:

 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 

Nous pouvons maintenant commencer à partitionner le disque. À ce stade, j'ai un lecteur / dev / vda, comme Contrôleur Virtio et ceci est juste un disque vide sans table de partition:

 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 

Nous le diviserons en 2 partitions:

  • disque fat32 pour les applications UEFI (EFI_system_partition)
  • Conteneur LUKS avec tout le reste

Utilisez gdisk pour créer le 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 

Ensuite, créez la première partition pour EFI avec le type EF00 (partition système 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' 

Créez maintenant une partition pour LUKS, où nous ne nous préoccuperons même pas du type et la laisser telle quelle:

 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> 

Nous noterons les modifications et terminerons avec le balisage de partition:

 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. 

Création d'un conteneur LUKS et de systèmes de fichiers


Avec la première section (vda1), tout est assez simple. Nous avons juste besoin de le formater et pour l'instant c'est tout:

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

La deuxième partition est le conteneur que vous devez d'abord préparer. Nous formater la partition via cryptsetup et définir la phrase secrète:

 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. 

*** Je n'ai pas pris la peine de choisir des chiffres, avec une randomisation remplacée par urandom et autres, mais j'ai juste créé un conteneur par défaut.

Ensuite, ouvrez le conteneur en spécifiant la même phrase secrète:

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

Nous avons maintenant un conteneur ouvert accessible via le mappeur de périphériques:

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

Maintenant, nous pouvons continuer avec lvm (j'écrirai rapidement, car ce n'est pas un sujet):

 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 

Ensuite, créez les systèmes de fichiers sur notre 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 

Maintenant, tout cela peut être monté pour installer le système de base. Le point d'installation sera / mnt, où la racine de notre futur système commencera:

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

*** / boot / efi Je crée pour que / boot lui-même reste sur / dev / mapper / rootvg-root, et que le dossier efi soit déjà monté sur / dev / vda1 (partition 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 

Vérifiez les points de montage actuels (toujours utiles):

 [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 

Comme nous le voyons, tout est honnête et maintenant il est temps de mettre l'arc lui-même.

Installation du système de base


Installez les packages de base à partir des ensembles de base et de base-devel à l'aide du package pacstrap (vous pouvez y mettre tout ce que vous voulez et en plus de cela):

 pacstrap /mnt base base-devel 

Tout démarre parfaitement, le système de base est prêt. Naturellement, j'ai retiré la conclusion. Maintenant, nous pouvons configurer ce système pour démarrer et fonctionner.

À partir des choses de base, nous générons immédiatement fstab:

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

Ensuite, faites arch-chroot dans ce nouveau système:

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

*** arch-chroot est un utilitaire très utile, car il fait tout par lui-même. Bien que vous puissiez toujours utiliser le chroot standard, avant de le faire, suivez les instructions dans le gentoo-handbook wiki.gentoo.org/wiki/Handbook : AMD64 / Installation / Base section «Montage des systèmes de fichiers nécessaires»

Configurez immédiatement l'heure système et le nom d'hôte:

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

Définissez le mot de passe root:

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

Décommentez les paramètres régionaux requis dans /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 

Nous les générerons:

 [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 

Configurez-les immédiatement pour le système et la console:

 [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 

Configurez maintenant le fichier /etc/mkinitcpio.conf, qui est responsable des options, des hooks, etc. lors de la génération d'initramfs:

 vi /etc/mkinitcpio.conf 

La chose la plus importante est les crochets et leur ordre:

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

*** reprendre le crochet pour démarrer le système après avoir hiberné à partir du swap. Sur une machine virtuelle, ce n'est pas nécessaire. Je l'ai copié de hêtre.

Maintenant, nous pouvons générer des 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 

Maintenant que nous avons le système, nous devons installer le chargeur de démarrage lui-même. Mon choix est tombé sur grub (2), car il est en quelque sorte plus familier et assez facilement capable de charger le noyau à partir d'une partition chiffrée (enfin, ou je n'en ai pas vraiment cherché d'autres).

Installez le package grub:

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

Avant de générer la configuration, modifiez les options grub par défaut:

 vim /etc/default/grub 

ici, vous devez décommenter une ligne importante (pas de commentaire, bien sûr):

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

et ajoutez (il y a vide par défaut) à GRUB_CMDLINE_LINUX:

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

UUID que j'ai pris 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" 

Nous générons une configuration pour 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 

Ensuite, installez grub lui-même sur le disque:

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

*** vous pouvez ajouter --recheck --debug, spécifier l'architecture ... mais ... ça marche vraiment tout seul)

Nous allons maintenant éditer / etc / crypttab pour que le système lui-même sache que lors du chargement, il est nécessaire de déchiffrer la section LUKS. Ajoutez la ligne:

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

Ce qui signifie que vous devez demander un mot de passe (aucun) pour la partition / dev / vda2 et le présenter déjà comme conteneur via le mappeur de périphériques.

Nous sommes maintenant prêts à quitter chroot et à redémarrer le système:

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

Passons maintenant à la console de la machine virtuelle pour voir le résultat:



À ce stade, nous avons démarré l'application EFI /boot/efi/EFI/arch/grubx64.efi avec / dev / vda1, qui nous demande un mot de passe pour décrypter notre conteneur.

Ensuite, après avoir entré le mot de passe:



Voici la fenêtre grub familière avec nos options de démarrage depuis /boot/grub/grub.cfg.
À ce stade, grub a déchiffré notre conteneur et a eu accès à ce fichier lui-même (/boot/grub/grub.cfg), au noyau et à initramfs. Après avoir sélectionné l'option, le noyau démarrera par défaut, initramfs:



En fait, le noyau a créé le crochet de chiffrement, qui nous demande à nouveau le mot de passe pour déchiffrer le conteneur (en général, vous devez entrer le mot de passe 2 fois, mais il se peut que vous fabriquiez 2 conteneurs pour le démarrage et la racine à partir d'une paranoïa excessive :)

Et puis, une fois le système entièrement chargé:



PS: pour augmenter le niveau de schizophrénie, seul le démarrage sécurisé ne suffit pas pour signer notre chargeur de démarrage grubx64.efi.

J'ai trouvé peu intéressant de simplement mettre le noyau et les initramfs sur / dev / vda1, comme je l'ai déjà fait 100 fois. D'autres chargeurs de démarrage tels que SHIM, bootctl, etc. ne savent pas comment faire (enfin, si je ne sais pas, dites-le nous dans les commentaires)

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


All Articles