Installieren Sie Archlinux mit vollständiger Systemverschlüsselung und LVM auf LUKS

In diesem Beitrag lesen Sie ein wenig über meine seltsamen Forschungen während des erzwungenen Krankenstands. Es geht um mehrere Dinge gleichzeitig, die nicht „Best Practice“ sind, sondern auch möglich! Hier ist ein Tutorial, wie man Archlinux (mein Lieblingsdistrikt) installiert, damit:

  • ohne separates / boot (nur in / root)
  • / auf lvm
  • lvm in luks behälter
  • mit UEFI
  • in einer virtuellen Maschine.
  • mit sicherem Start ("schwierig" in der virtuellen Maschine ist unwahrscheinlich, erfolgreich zu sein)

Es ist bemerkenswert, dass bis auf die EFI-Systempartition alles mit einer einzigen grubx64.efi-Datei verschlüsselt wird - einer EFI-Anwendung zum Ausführen von grub.

Wenn Sie interessiert sind, willkommen bei cat!

Zuerst habe ich alles auf meinem Lenovo X240-Laptop eingerichtet, dann habe ich zum Schreiben eines Artikels eine virtuelle Maschine mit OVMF in Proxmox verwendet.

Testbed-Setup:


Alles wird ganz normal erstellt. Das Bild verwendet meinen Lieblingsbogen, der immer von Yandex heruntergeladen werden kann.

Als nächstes einige Punkte zum virtuellen in Proxmox bezüglich UEFI. Um den Betrieb des Standes mit UEFI zu testen (sonst ist es nicht so interessant), müssen Sie in den Eigenschaften der virtuellen Maschine OVMF anstelle von SeaBIOS festlegen:



Fügen Sie als Nächstes die UEFI-Festplatte entsprechend hinzu, um Folgendes zu erhalten:



Jetzt können wir die virtuelle Maschine starten und den Installationsprozess starten. Starten Sie in der Konsole der virtuellen Maschine sofort den sshd-Dienst, legen Sie das Root-Passwort fest und ermitteln Sie die DHCP-Adresse der virtuellen Maschine:



Als nächstes können wir weiter an ssh arbeiten, um es bequemer zu machen.

Festplattenlayout


Nachdem wir bereits eine Verbindung über ssh hergestellt haben, stellen wir zunächst die Zeit so ein, dass sich später nicht herausstellt, dass die Dateisysteme in Zukunft erstellt werden:

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

Überprüfen Sie, ob alles korrekt ist:

 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 

Jetzt können wir mit der Partitionierung der Festplatte beginnen. Zu diesem Zeitpunkt habe ich ein / dev / vda-Laufwerk als Virtio-Controller und dies ist nur eine leere Festplatte ohne Partitionstabelle:

 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 

Wir werden es in 2 Partitionen aufteilen:

  • fat32-Festplatte für UEFI-Anwendungen (EFI_system_partition)
  • LUKS Container mit allem anderen

Verwenden Sie gdisk, um die GPT zu erstellen:

 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 

Erstellen Sie als Nächstes die erste Partition für EFI vom Typ EF00 (EFI System Partition):

 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' 

Erstellen Sie jetzt eine Partition für LUKS, in der wir uns nicht einmal mit dem Typ beschäftigen, und lassen Sie ihn unverändert:

 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> 

Wir werden die Änderungen aufschreiben und mit dem Partitions-Markup abschließen:

 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. 

Erstellen eines LUKS-Containers und von Dateisystemen


Mit dem ersten Abschnitt (vda1) ist alles ganz einfach. Wir müssen es nur formatieren und jetzt ist es soweit:

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

Die zweite Partition ist der Container, den Sie zuerst vorbereiten müssen. Wir formatieren die Partition durch cryptsetup und setzen die Passphrase:

 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. 

*** Ich habe mich nicht um die Auswahl der Chiffren gekümmert, sondern die Randomisierung mit urandom und anderen überschrieben, sondern nur einen Standardcontainer erstellt.

Öffnen Sie als Nächstes den Container, indem Sie dieselbe Passphrase angeben:

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

Jetzt haben wir einen offenen Container, auf den über den Geräte-Mapper zugegriffen werden kann:

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

Jetzt können wir mit lvm fortfahren (ich werde schnell schreiben, da dies kein Thema ist):

 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 

Als nächstes erstellen Sie die Dateisysteme auf unserer Ebene:

 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 

Jetzt kann alles montiert werden, um das Basissystem zu installieren. Der Installationspunkt ist / mnt, wo die Wurzel unseres zukünftigen Systems beginnt:

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

*** / boot / efi Ich erstelle, damit / boot selbst auf / dev / mapper / rootvg-root bleibt und der efi-Ordner bereits auf / dev / vda1 (fat32 efi-Partition) gemountet ist:

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

Überprüfen Sie die aktuellen Einhängepunkte (immer nützlich):

 [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 

Wie wir sehen, ist alles ehrlich und jetzt ist es Zeit, den Bogen selbst zu setzen.

Installation des Basissystems


Installieren Sie die Basispakete aus den Basis- und Basisentwicklungssätzen mit dem Pacstrap-Paket (Sie können ihnen alles hinzufügen, was Sie wollen, und außerdem):

 pacstrap /mnt base base-devel 

Alles perfekt gebootet, das Basissystem ist fertig. Natürlich habe ich die Schlussfolgerung entfernt. Jetzt können wir genau dieses System so konfigurieren, dass es bootet und funktioniert.

Aus den grundlegenden Dingen generieren wir sofort fstab:

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

Machen Sie als nächstes Arch-Chroot zu diesem neuen System:

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

*** arch-chroot ist ein sehr nützliches Dienstprogramm, da es alles selbst erledigt. Obwohl Sie immer die Standard-Chroot verwenden können, befolgen Sie vorher die Anweisungen im Gentoo-Handbuch wiki.gentoo.org/wiki/Handbook : AMD64 / Installation / Base-Abschnitt „Mounten der erforderlichen Dateisysteme“.

Konfigurieren Sie sofort die Systemzeit und den Hostnamen:

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

Legen Sie das Root-Passwort fest:

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

Kommentieren Sie die erforderlichen Gebietsschemas in /etc/locale.gen aus:

 [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 

Wir werden sie generieren:

 [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 

Konfigurieren Sie sie sofort für das System und die Konsole:

 [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 

Konfigurieren Sie nun die Datei /etc/mkinitcpio.conf, die beim Generieren von initramfs für Optionen, Hooks usw. verantwortlich ist:

 vi /etc/mkinitcpio.conf 

Das Wichtigste sind die Haken und ihre Reihenfolge:

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

*** Setzen Sie den Hook fort, um das System nach dem Ruhezustand vom Swap zu starten. Auf einer virtuellen Maschine wird es nicht benötigt. Ich habe es aus Buche kopiert.

Jetzt können wir initramfs generieren:

 [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 

Nachdem wir das System haben, müssen wir den Bootloader selbst installieren. Meine Wahl fiel auf grub (2), weil es irgendwie vertrauter ist und den Kernel leicht von einer verschlüsselten Partition laden kann (na ja, oder ich habe nicht wirklich nach anderen gesucht).

Installieren Sie das Madenpaket:

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

Bearbeiten Sie vor dem Generieren der Konfiguration die Standard-Grub-Optionen:

 vim /etc/default/grub 

Hier müssen Sie eine wichtige Zeile auskommentieren (natürlich kein Kommentar):

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

und zu GRUB_CMDLINE_LINUX hinzufügen (standardmäßig leer):

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

UUID habe ich von blkid genommen:

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

Wir generieren eine Konfiguration für 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 

Installieren Sie als Nächstes grub selbst auf der Festplatte:

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

*** Sie können --recheck --debug hinzufügen, die Architektur angeben ... aber ... es funktioniert wirklich von selbst)

Jetzt bearbeiten wir / etc / crypttab, damit das System selbst weiß, dass beim Laden der Abschnitt LUKS entschlüsselt werden muss. Fügen Sie die Zeile hinzu:

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

Dies bedeutet, dass Sie ein Kennwort (keines) für die Partition / dev / vda2 anfordern und es bereits über den Geräte-Mapper als Container präsentieren müssen.

Jetzt können wir chroot beenden und das System neu starten:

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

Wenden wir uns nun der Konsole der virtuellen Maschine zu, um das Ergebnis zu sehen:



Zu diesem Zeitpunkt haben wir die EFI-Anwendung /boot/efi/EFI/arch/grubx64.efi mit / dev / vda1 gestartet, die uns nach einem Kennwort zum Entschlüsseln unseres Containers fragt.

Als nächstes nach Eingabe des Passworts:



Hier ist das bekannte Grub-Fenster mit unseren Boot-Optionen von /boot/grub/grub.cfg.
Zu diesem Zeitpunkt entschlüsselte grub unseren Container und erhielt Zugriff auf diese Datei selbst (/boot/grub/grub.cfg), den Kernel und initramfs. Nach Auswahl der Option startet der Kernel standardmäßig initramfs:



Aktiv hat der Kernel den Verschlüsselungs-Hook entwickelt, der uns erneut nach dem Passwort zum Entschlüsseln des Containers fragt (im Allgemeinen müssen Sie das Passwort zweimal eingeben, aber es kann sein, dass Sie aus übermäßiger Paranoia 2 Container für Boot und Root erstellen :)

Und dann, nachdem das System vollständig geladen ist:



PS: Um das Ausmaß der Schizophrenie zu erhöhen, reicht nur der sichere Start nicht aus, um unseren Bootloader grubx64.efi zu signieren.

Ich fand es uninteressant, nur den Kernel und initramfs auf / dev / vda1 zu setzen, wie ich es bereits 100 Mal getan habe. Andere Bootloader wie SHIM, bootctl usw. wissen nicht, wie das geht (wenn ich es nicht weiß, teilen Sie es uns in den Kommentaren mit).

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


All Articles