Ich setze meinen Ausflug in das Setup eines Opensuse Laptops mit Voll-Verschlüsselung fort:
Laptop – SSD mit dm-crypt/Luks -Verschlüsselung und Opensuse Leap 15 – I – Vorüberlegungen
Laptop – SSD mit dm-crypt/Luks -Verschlüsselung und Opensuse Leap 15 – II – Vorüberlegungen zur Virtualisierung
Laptop – SSD mit dm-crypt/Luks -Verschlüsselung und Opensuse Leap 15 – III – Zugriffs-Layer
Laptop – SSD mit dm-crypt/Luks -Verschlüsselung und Opensuse Leap 15 – IV – Disk-Layout
Laptop – SSD mit dm-crypt/Luks -Verschlüsselung und Opensuse Leap 15 – V – kryptierte Partitionen und Alignment
Laptop – SSD mit dm-crypt/Luks -Verschlüsselung und Opensuse Leap 15 – VI – Key-Slots, PBKDF2- und MK-Iterationen
Laptop – SSD mit dm-crypt/Luks -Verschlüsselung und Opensuse Leap 15 – VII – Grundinstallation für LUKS on LVM
Laptop – SSD mit dm-crypt/Luks -Verschlüsselung und Opensuse Leap 15 – VIII – Systemd-Fehler nach Neustart
Die Leser der bisherigen Artikel erinnern sich sicher daran, dass ich während der Installation von Leap 15 auf einem verschlüsselten LUKS-Volume vermieden hatte, ein ebenfalls verschlüsseltes SWAP-Volume einzubinden. Der SWAP wird weder in der Grub2-Konfiguration, noch in der “/etc/fstab” oder der “/etc/crypttab” des Root-Filesystems der Installation referenziert. Wir werden dies nun nachträglich ändern.
Wir schließen unseren Laptop ans LAN an und booten die Leap 15-Installation von unserem verschlüsselten LUKS-Volume “/dev/vga/lva1” (LUKS on LVM) auf der externen SSD. Da wir während der Installation bereits den SSH-Service aktivieren ließen und die lokale Firewall deaktivierten, können wir uns nun bequemerweise von einem externen System einloggen. Wem das nicht möglich ist, muss halt an einem Konsolen-Terminal des Laptops arbeiten. Uns steht im Moment noch kein grafischer Desktop zur Verfügung; Arbeiten auf der Kommandozeile ist notwendig. FS steht nachfolgend wie immer für “Filesystem”.
Check der Datei “/boot/grub2/grub.cfg”
Ich zeige nachfolgend die komplette Datei “/boot/grub2/grub.cfg”, wie sie als Ergebnis unserer Installation angelegt wurde.
Hinweis: Ich erinnere dabei daran, dass wir keine separate Partition oder separates Volume für den Verzeichnis-Ast “/boot” angelegt hatten. “/boot” und seine Inhalte stellen vielmehr echte Inodes im “/”-FS dar.
# # DO NOT EDIT THIS FILE # # It is automatically generated by grub2-mkconfig using templates # from /etc/grub.d and settings from /etc/default/grub # ### BEGIN /etc/grub.d/00_header ### if [ -f ${config_directory}/grubenv ]; then load_env -f ${config_directory}/grubenv elif [ -s $prefix/grubenv ]; then load_env fi if [ "${env_block}" ] ; then load_env -f "${env_block}" fi if [ "${next_entry}" ] ; then set default="${next_entry}" set next_entry= save_env next_entry if [ "${env_block}" ] ; then save_env -f "${env_block}" next_entry fi set boot_once=true else set default="${saved_entry}" fi if [ x"${feature_menuentry_id}" = xy ]; then menuentry_id_option="--id" else menuentry_id_option="" fi export menuentry_id_option if [ "${prev_saved_entry}" ]; then set saved_entry="${prev_saved_entry}" save_env saved_entry set prev_saved_entry= save_env prev_saved_entry set boot_once=true fi function savedefault { if [ -z "${boot_once}" ]; then saved_entry="${chosen}" save_env saved_entry if [ "${env_block}" ] ; then save_env -f "${env_block}" saved_entry fi fi } function load_video { if [ x$feature_all_video_module = xy ]; then insmod all_video else insmod efi_gop insmod efi_uga insmod ieee1275_fb insmod vbe insmod vga insmod video_bochs insmod video_cirrus fi } if [ x$feature_default_font_path = xy ] ; then font=unicode else insmod part_gpt insmod lvm insmod cryptodisk insmod luks insmod gcry_rijndael insmod gcry_rijndael insmod gcry_sha512 insmod ext2 cryptomount -u db43615a23e2512549c1ccbc2041e76c set root='cryptouuid/db43615a23e2512549c1ccbc2041e76c' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint='cryptouuid/db43615a23e2512549c1ccbc2041e76c' a3202dac-a44e-4344-b551-dd123ce893b2 else search --no-floppy --fs-uuid --set=root a3202dac-a44e-4344-b551-dd123ce893b2 fi font="/usr/share/grub2/unicode.pf2" fi if loadfont $font ; then set gfxmode=auto load_video insmod gfxterm fi terminal_output gfxterm insmod part_gpt insmod lvm insmod cryptodisk insmod luks insmod gcry_rijndael insmod gcry_rijndael insmod gcry_sha512 insmod ext2 cryptomount -u db43615a23e2512549c1ccbc2041e76c set root='cryptouuid/d4f0ba2b904b4a73ba2927474433c740' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint='cryptouuid/db43615a23e2512549c1ccbc2041e76c' a3202dac-a44e-4344-b551-dd123ce893b2 else search --no-floppy --fs-uuid --set=root a3202dac-a44e-4344-b551-dd123ce893b2 fi insmod gfxmenu loadfont ($root)/boot/grub2/themes/openSUSE/DejaVuSans-Bold14.pf2 loadfont ($root)/boot/grub2/themes/openSUSE/DejaVuSans10.pf2 loadfont ($root)/boot/grub2/themes/openSUSE/DejaVuSans12.pf2 loadfont ($root)/boot/grub2/themes/openSUSE/ascii.pf2 insmod png set theme=($root)/boot/grub2/themes/openSUSE/theme.txt export theme if [ x${boot_once} = xtrue ]; then set timeout=0 elif [ x$feature_timeout_style = xy ] ; then set timeout_style=menu set timeout=8 # Fallback normal timeout code in case the timeout_style feature is # unavailable. else set timeout=8 fi ### END /etc/grub.d/00_header ### ### BEGIN /etc/grub.d/00_tuned ### set tuned_params="" set tuned_initrd="" ### END /etc/grub.d/00_tuned ### ### BEGIN /etc/grub.d/10_linux ### menuentry 'openSUSE Leap 15.0' --class opensuse --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-a3202dac-a44e-4344-b551-dd123ce893b2' { load_video set gfxpayload=keep insmod gzio insmod part_gpt insmod lvm insmod cryptodisk insmod luks insmod gcry_rijndael insmod gcry_rijndael insmod gcry_sha512 insmod ext2 cryptomount -u db43615a23e2512549c1ccbc2041e76c set root='cryptouuid/db43615a23e2512549c1ccbc2041e76c' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint='cryptouuid/db43615a23e2512549c1ccbc2041e76c' a3202dac-a44e-4344-b551-dd123ce893b2 else search --no-floppy --fs-uuid --set=root a3202dac-a44e-4344-b551-dd123ce893b2 fi echo 'Loading Linux 4.12.14-lp150.11-default ...' linux /boot/vmlinuz-4.12.14-lp150.11-default root=/dev/mapper/cr-root nomodeset splash=silent quiet showopts echo 'Loading initial ramdisk ...' initrd /boot/initrd-4.12.14-lp150.11-default } submenu 'Advanced options for openSUSE Leap 15.0' --hotkey=1 $menuentry_id_option 'gnulinux-advanced-a3202dac-a44e-4344-b551-dd123ce893b2' { menuentry 'openSUSE Leap 15.0, with Linux 4.12.14-lp150.11-default' --hotkey=2 --class opensuse --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.12.14-lp150.11-default-advanced-a3202dac-a44e-4344-b551-dd123ce893b2' { load_video set gfxpayload=keep insmod gzio insmod part_gpt insmod lvm insmod cryptodisk insmod luks insmod gcry_rijndael insmod gcry_rijndael insmod gcry_sha512 insmod ext2 cryptomount -u db43615a23e2512549c1ccbc2041e76c set root='cryptouuid/db43615a23e2512549c1ccbc2041e76c' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint='cryptouuid/db43615a23e2512549c1ccbc2041e76c' a3202dac-a44e-4344-b551-dd123ce893b2 else search --no-floppy --fs-uuid --set=root a3202dac-a44e-4344-b551-dd123ce893b2 fi echo 'Loading Linux 4.12.14-lp150.11-default ...' linux /boot/vmlinuz-4.12.14-lp150.11-default root=/dev/mapper/cr-root nomodeset splash=silent quiet showopts echo 'Loading initial ramdisk ...' initrd /boot/initrd-4.12.14-lp150.11-default } menuentry 'openSUSE Leap 15.0, with Linux 4.12.14-lp150.11-default (recovery mode)' --hotkey=3 --class opensuse --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.12.14-lp150.11-default-recovery-a3202dac-a44e-4344-b551-dd123ce893b2' { load_video set gfxpayload=keep insmod gzio insmod part_gpt insmod lvm insmod cryptodisk insmod luks insmod gcry_rijndael insmod gcry_rijndael insmod gcry_sha512 insmod ext2 cryptomount -u db43615a23e2512549c1ccbc2041e76c set root='cryptouuid/db43615a23e2512549c1ccbc2041e76c' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint='cryptouuid/db43615a23e2512549c1ccbc2041e76c' a3202dac-a44e-4344-b551-dd123ce893b2 else search --no-floppy --fs-uuid --set=root a3202dac-a44e-4344-b551-dd123ce893b2 fi echo 'Loading Linux 4.12.14-lp150.11-default ...' linux /boot/vmlinuz-4.12.14-lp150.11-default root=/dev/mapper/cr-root echo 'Loading initial ramdisk ...' initrd /boot/initrd-4.12.14-lp150.11-default } } ### END /etc/grub.d/10_linux ### ### BEGIN /etc/grub.d/20_linux_xen ### ### END /etc/grub.d/20_linux_xen ### ### BEGIN /etc/grub.d/20_memtest86+ ### ### END /etc/grub.d/20_memtest86+ ### ### BEGIN /etc/grub.d/30_os- prober ### ### END /etc/grub.d/30_os-prober ### ### BEGIN /etc/grub.d/40_custom ### # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the 'exec tail' line above. ### END /etc/grub.d/40_custom ### ### BEGIN /etc/grub.d/41_custom ### if [ -f ${config_directory}/custom.cfg ]; then source ${config_directory}/custom.cfg elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then source $prefix/custom.cfg; fi ### END /etc/grub.d/41_custom ### ### BEGIN /etc/grub.d/80_suse_btrfs_snapshot ### ### END /etc/grub.d/80_suse_btrfs_snapshot ### ### BEGIN /etc/grub.d/90_persistent ### ### END /etc/grub.d/90_persistent ### ### BEGIN /etc/grub.d/95_textmode ### ### END /etc/grub.d/95_textmode ###
Wir sehen, wie die Konfigurationen der einzelnen Boot-Einträge zunächst dafür sorgen, dass notwendige Module geladen werden. Wir betrachten nachfolgend nurmehr den Haupteintrag des grafischen Boot-Menüs von Grub2 genauer; dafür durchgeführte Modifikationen sind analog auf andere Einträge zu übertragen:
menuentry 'openSUSE Leap 15.0' --class opensuse --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-a3202dac-a44e-4344-b551-dd123ce893b2' { load_video set gfxpayload=keep insmod gzio insmod part_gpt insmod lvm insmod cryptodisk insmod luks insmod gcry_rijndael insmod gcry_rijndael insmod gcry_sha512 insmod ext2 cryptomount -u db43615a23e2512549c1ccbc2041e76c set root='cryptouuid/db43615a23e2512549c1ccbc2041e76c' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint='cryptouuid/db43615a23e2512549c1ccbc2041e76c' a3202dac-a44e-4344-b551-dd123ce893b2 else search --no-floppy --fs-uuid --set=root a3202dac-a44e-4344-b551-dd123ce893b2 fi echo 'Loading Linux 4.12.14-lp150.11-default ...' linux /boot/vmlinuz-4.12.14-lp150.11-default root=/dev/mapper/cr-root nomodeset splash=silent quiet showopts echo 'Loading initial ramdisk ...' initrd /boot/initrd-4.12.14-lp150.11-default }
Für die Adressierung des Krypto-Volumes (= Raw-LVM-Volume) werden hier offenbar UUIDs verwendet. Die Krypto-UUID ist in unserem Fall “db43615a23e2512549c1ccbc2041e76c” (=db43615a-23e2-5125-49c1-ccbc2041e76c), die UUID des root-Filesystems dagegen “a3202dac-a44e-4344-b551-dd123ce893b2”. Wir erkennen, dass das Krypto-Device von Grub2 angesprochen wird. Im Boot-Vorgang wird die entsprechende Passphrase abgefragt. Auf dem entschlüsselten Device wird dann das “/”-FS anhand seiner UUID identifiziert.
Später erkennen wir an der Zeile
linux /boot/vmlinuz-4.12.14-lp150.11-default root=/dev/mapper/cr-root nomodeset splash=silent quiet showopts
welcher Kernel aus dem Verzeichnis “boot” gestartet wird. (Die Option “nomodeset” resultierte übrigens aus der Grafik-Einstellung (Keine KMS), die wir zu Beginn der Installation getroffen hatten.)
Interessant ist hier, dass dem Kernel das “root”-Filesystem über seine Mapper-Kennung “dev/mapper/cr-root” übergeben wird. Das geht nur, wenn der Kernel über die Datei “etc/crypttab” herausfinden kann, welches Device da eigentlich gemappt wurde. Ich erinnere daran, dass diese Datei bislang den alleinigen Eintrag
cr-root /dev/vga/lva1 none
beinhaltet. Das reicht jedoch, da ein (ggf. aus dem initramfs) geladenes LVM-Kernel-Modul auf dieser Basis das zugehörige Device eindeutig identifizieren kann.
Modifikation der Dateien “/boot/grub2/grub.cfg” und “/
etc/default/grub”
Damit ist unsere Strategie klar, wie Grub2 dem Kernel das SWAP-Device (für Reboots aus einem Hibernation-Zustand) bekannt geben kann. Wir versehen die Zeilen für den Kernel in allen Menü-Optionen (bis auf den Recovery-Eintrag) mit einem “resume“-Parameter der folgenden Form:
linux /boot/vmlinuz-4.12.14-lp150.11-default root=/dev/mapper/cr-root nomodeset splash=silent quiet showopts resume=/dev/mapper/cr-swap
Die Editier-Arbeit führen wir direkt und vorsichtig mit dem vi-Editor durch. Nur Mut!
Hinweis: Wem das zu unsicher ist, führt statt dessen die nachfolgenden Schritte durch und führt am Ende
grub2-mkconfig -o /boot/grub2/grub.cfg
durch.
Wir passen in diesem Sinne nun auch die folgende Zeile in der Datei “/etc/default/grub” an:
GRUB_CMDLINE_LINUX_DEFAULT=’nomodeset splash=silent quiet showopts resume=/dev/mapper/cr-swap’
Also:
linux-5l8q:~ # cat /etc/default/grub # If you change this file, run 'grub2-mkconfig -o /boot/grub2/grub.cfg' afterwards to update # /boot/grub2/grub.cfg. # Uncomment to set your own custom distributor. If you leave it unset or empty, the default # policy is to determine the value from /etc/os-release GRUB_DISTRIBUTOR= GRUB_DEFAULT=saved GRUB_HIDDEN_TIMEOUT=0 GRUB_HIDDEN_TIMEOUT_QUIET=true GRUB_TIMEOUT=8 GRUB_CMDLINE_LINUX_DEFAULT='nomodeset splash=silent quiet showopts resume=/dev/mapper/cr-swap' GRUB_CMDLINE_LINUX="" # Uncomment to automatically save last booted menu entry in GRUB2 environment # variable `saved_entry' # GRUB_SAVEDEFAULT="true" #Uncomment to enable BadRAM filtering, modify to suit your needs # This works with Linux (no patch required) and with any kernel that obtains # the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...) # GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef" #Uncomment to disable graphical terminal (grub-pc only) GRUB_TERMINAL="gfxterm" # The resolution used on graphical terminal #note that you can use only modes which your graphic card supports via VBE # you can see them in real GRUB with the command `vbeinfo' GRUB_GFXMODE="auto" # Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux # GRUB_DISABLE_LINUX_UUID=true #Uncomment to disable generation of recovery mode menu entries # GRUB_DISABLE_LINUX_RECOVERY="true" #Uncomment to get a beep at grub start # GRUB_INIT_TUNE="480 440 1" GRUB_BACKGROUND= GRUB_THEME=/boot/grub2/themes/openSUSE/theme.txt SUSE_BTRFS_SNAPSHOT_BOOTING="true" GRUB_DISABLE_OS_PROBER="false" GRUB_ENABLE_CRYPTODISK="y" GRUB_CMDLINE_XEN_DEFAULT="vga=gfx-1024x768x16"
Abänderung der Dateien “/etc/crypttab” und “/etc/fstab” // Mounten des SWAPs
Damit das alles funktioniert benötigen wir aber auch entsprechende konsistente Einträge in der “/etc/crypttab” und in der “/etc/fstab”. Wir erweitern zunächst die “/etc/crypttab” mittels des vi-Editors:
cr-root /dev/vga/lva1 none
cr-swap /dev/vgs/lvs1 none
Wir hatten den SWAP ja auf einem separaten RAW-Volume “/dev/vgs/lvs1” angelegt. Nun müssen wir dafür sorgen, dass der SWAP nach dem Booten auch gemountet wird. Ein Blick in die “/etc/fstab” zeigt, dass SuSE dort UUIDs verwendet.
UUID=a3202dac-a44e-4344-b551-dd123ce893b2 / ext4 acl,user_xattr 0 1
Achtung: das sind die UUIDs der Filesysteme. Wie finden wir die UUID für das Swap-Device heraus? Wir öffnen des kryptierte SWAP-Volume mittels
linux-5l8q:~ # cryptsetup open /dev/vgs/lvs1 cr_swap Enter passphrase for /dev/vgs/lvs1: linux-5l8q:~ # lsblk -o name,UUID | grep "swap\|lvs" │ └─vgs-lvs1 d6bcf6fb-641c-4238-4f55-bc677d22d245 │ └─cr-swap 663e1134-ab5d-3aac-bb6f-d45b7b1f34dc linux-5l8q:~ # vi /etc/fstab
Das sollten wir sowieso tun, weil wir später nochmal mkinitrd laufen lassen wollen.
Entsprechend erweitern wir die “/etc/fstab”:
UUID=a3202dac-a44e-4344-b551-dd123ce893b2 / ext4 acl,user_xattr 0 1
UUID=663e1134-ab5d-3aac-bb6f-d45b7b1f34dc swap swap defaults 0 0
Danach können wir das Swap-Device auch mal mounten:
linux-5l8q:~ # swapon linux-5l8q:~ # swapon -av swapon: /dev/mapper/cr-swap: found signature [pagesize=4096, signature=swap] swapon: /dev/mapper/cr-swap: pagesize=4096, swapsize=18247319552, devsize=18247319552 swapon /dev/mapper/cr-swap linux-5l8q:~ #
Ausführen von “mkinitrd”
Nach all diesen Vorbereitungen (Modifikation der Dateien /etc/default/grub, /boot/grub2/grub.cfg, /etc/crypttab, “/etc/fstab”) können wir schließlich auch “mkinitrd” ausführen. Dieses Wrapper-Skript führt unter Opensuse einerseits “dracut” zur Konfiguration des “initramfs” und von “systemd” aus, startet aber andererseits am Schluss auch noch ein “Refresh” der Bootloader-Installation.
linux-5l8q:~ # mkinitrd .... DRACUT_MELDUNGEN .....
(Im Gegensatz zum letzten Beitrag müssen wir hier natürlich kein chroot ausführen.)
Hinweis: Gerne würde ich hier sagen können, dass man YaST’s Bootloader-Programm ausführen kann. In der ncurses-Version für die Kommandozeile kommt es dabei aber leider zu Fehlern beim Wechsel zwischen den verschiedenen Konfigurationsseiten.
(Opensuse wird in der letzten Zeit nicht gerade besser …. ; die grafische Version des “Bootloader”-Moduls unter “yast2” funktioniert, ist auf unserer Server-Installation aber natürlich nicht im Konsolen-Terminal verfügbar).
Checks und Reboot
Es lohnt sich, nochmal die Datei “/boot/grub2/grub.cfg” und die anderen manipulierten Dateien zu prüfen. Danach führen wir einen Reboot durch. An dieser Stelle sei daran erinnert, dass wir die Passphrase für SWAP und “/”-FS gleich gewählt haben. Wir müssen daher die Passphrase insgesamt nur zweimal eingeben. Der Boot-Vorgang sollte fehlerfrei funktionieren. je nachdem, welcher Eintrag (für cr-root oder cr-swap) zuerst in der “/etc/crypttab” steht, wird beim Laden des Kernels das Passwort für das erste Device abgefragt; die Abfrage für das 2-te Device unterbleibt.
Der SWAP sollte anschließend auch gemountet sein:
linux-5l8q:~ # swapon -s Filename Type Size Used Priority /dev/dm-3 partition 17819644 0 -1 linux-5l8q:~ #
Fazit und Ausblick
Wenn die Einträge zwischen den verschiedenen Konfigurationsdateien (/etc/crypttab, /boot/grub2/grub.cfg, /etc/default/grub, /etc/fstab) konsistent gehalten werden, ist es einfach ein separat kryptiertes LVM-Volume für den SWAP einzubinden und im Boot-Vorgang mounten zu lassen.
Im nächsten Beitrag
Laptop – SSD mit dm-crypt/Luks -Verschlüsselung und Opensuse Leap 15 – X – Hibernation
werfen wir einen Blick auf einen ersten Hibernation-Test.