Sokszor előfordult már, hogy a munkaállomásom leállt a szünetmentesítés ellenére is, mert az áramkiesés annyi időt vett igénybe. Normál esetben a megfelelő beállításokkal a gép elindul, amint visszajön az áram. De mi a helyzet akkor, ha egy teljes titkosítással rendelkező gépünk van?

Tartalomjegyzék

Jelszóbevitel soros porton keresztül

Alapértelmezetten a GRUB amikor elindul, abban a korai állapotban csak egy jelszót vár, hogy kiolvassa az induláshoz szükésges információkat. Van lehetőség soros konzol kimenet létrehozására, de az nem a korai szakaszban aktiválódik, hanem már a titkosító jelszó megadása után. Amennyiben szükségünk van már a korai szakaszban is arra, hogy maga a jelszó bekérés is látszódjon a soros kimeneten, akkor az alábbi leírással beállíthatjuk.

Jelenlegi környezetem egy Archlinux, RAID1, LUKS, LVM.

A fent leírt feladat elvégzéséhez szükségünk lesz egy a soros konzol igényünket kiszolgáló egyedi GRUB képállományra, hogy megnézzük hogyan is készül az eredeti, adjuk ki a grub-install parancsot -v paraméterrel.

grub-install -v --target=x86_64-efi --efi-directory=esp --bootloader-id=GRUB

A parancs terminál ablakban, vagy ha fájlba irányítottuk a fenti parancs kimenetét láthatunk két

grub-mkimage

parancsot, számunkra a második lesz érdekes.

Ebben látható, hogy milyen modulokat használva jön létre az eredeti GRUB képállomány és látszódik egy load.cfg konfigurációs állomány is.

Nálam csak a cryptomount parancs látszódik benne:

/boot/grub/x86_64-efi/load.cfg

cryptomount -u 07eb4c51df2b4f22962273b331140683

Elkészítjük a saját konfigurációs állományunkat a fenti tartalom figyelembe vételével, de kiegészítve a soros konzol kimenettel.

/boot/grub/x86_64-efi/early-grub.cfg

serial --unit=0 --speed=115200
terminal_input console serial
terminal_output console serial
cryptomount -u 07eb4c51df2b4f22962273b331140683
set root='lvmid/1dux17-JVdW-2sfZ-xA34-1Rzi-86M5-RWGabw/nf7NH4-0d8F-m9d3-f2Wd-IcQt-T3SR-VIjjpO'
set prefix=($root)/boot/grub
configfile grub.cfg

Értelem szerűen cseréljük le a root és LUKS partíció azonosítókat a sajátunkra.

A root azonosító megtalálható a /boot/grub/grub.cfg állományban.

A GRUB képállomány generáláshoz az alábbi parancsot adtam ki:

grub-mkimage -p /boot \
-c early-grub.cfg \
-o /efi/EFI/GRUB/grubx64.efi \
-O x86_64-efi gzio part_gpt part_msdos diskfilter mdraid09 mdraid1x \
cryptodisk luks gcry_rijndael gcry_sha256 lvm ext2 configfile serial

Amennyiben a teljes rendszerindulást figyelemmel kísérnénk soros konzolon, akkor az Archlinux wikiben1 megtalálható leírást javaslom a beállításhoz.

Jelszóbevitel távoli SSH kapcsolaton keresztül2

Létrehozunk egy ISO képállományt a grub-mkrescue paranccsal, amit majd kiírunk egy külső USB meghajtóra. A képállományban elhelyezzük az aktuálisan használt Linux Kernelt és az aktuálisan tárgyalt problémára létrehozott kezdeti ramdisk környezetet (initrd).

initrd generálás

Telepítés

A lentebb használt hook-ok igénylik az alábbi csomagok meglétét:

  • mkinitcpio-netconf
  • mkinitcpio-tinyssh
  • mkinitcpio-utils
pacman -S mkinitcpio-{netconf,tinyssh,utils}

Beállítások

Az én esetemben az LTS kernelt veszem alapul. Ennek megfelelően létrehozom az USB eszközre szánt initrd állományt legeneráló mkinitcpio konfigurációs állományt.

/etc/mkinitcpio.d/linux-lts-usb.preset

# mkinitcpio preset file for the 'linux-lts' package

ALL_config="/etc/mkinitcpio-usb.conf"
ALL_kver="/boot/vmlinuz-linux-lts"

PRESETS=('default' 'fallback')

#default_config="/etc/mkinitcpio.conf"
default_image="/boot/initramfs-linux-lts-usb.img"
#default_options=""

#fallback_config="/etc/mkinitcpio.conf"
fallback_image="/boot/initramfs-linux-lts-usb-fallback.img"
fallback_options="-S autodetect"

A meglévő mkinitcpio.conf állományt alapul véve létrehozzuk a fenti USB meghajtóra szánt hook bejegyzéseket tartalmazó konfigurációs állományt, kiegészítve a netconf, tinyssh, encryptssh hook-okkal.

/etc/mkinitcpio-usb.conf

...
HOOKS=(base udev autodetect keyboard keymap consolefont modconf block mdadm_udev netconf tinyssh encryptssh lvm2 filesystems fsck)
...

Megjegyzés

Ha kulcsfájlt is használunk és ennek “nyoma” is van az aktuális mkinitcpio.conf állományunkban, akkor az USB részére létrehozott konfigurációs állományból ezt a bejegyzést vegyük ki, mert ellenkező esetben a kulcsfájl bekerül az initrd képállományba, ami kompromittálható lesz.

tinyssh konfigurálása

Telepítés

pacman -S tinyssh

Beállítások

A távoli SSH elérés miatt a tinyssh-t be kell állítani a következő képpen.

A bejelentkezéshez használt publikus kulcsot el kell helyezni az /etc/tinyssh/root_key fájlba.

A meglévő SSH host kulcs konvertálásához az alábbi parancsot használtam:

rm -rf /etc/tinyssh/sshkeydir
tinyssh-convert /etc/tinyssh/sshkeydir/ < /etc/ssh/ssh_host_ed25519_key

A kapcsolat teszteléséhez adjuk ki az alábbi parancsot, majd próbáljuk meg az SSH kliens csatlakozást:

systemctl start tinyssh@9999.socket
ssh -p 9999 ssh.pelda.hu

netconf/grub konfigurálása

A távoli eléréshez szükségünk lesz hálózati beállításokra, van lehetőség dinamikus és statikus címbeállításra is, az utóbbira mutatom a példát.

/etc/default/grub

...
GRUB_CMDLINE_LINUX="... ip=192.168.0.1::192.168.0.254:255.255.255.0::eth0:none"
...

GRUB konfigurációs állomány újragenerálása:

grub-mkconfig -o /boot/grub/grub.cfg

initrd újragenerálás:

mkinitcpio -p linux-lts-usb

Grub cd képállomány generálása

Grub konfigurációs állomány létrehozása

A fentebb újragenerált grub.cfg fájlt használva nekem az alábbi lecsupaszított GRUB állomány maradt meg, a szükséges modulokkal, kernel és paraméterei, initrd környezet, valamint a legvégén a boot parancs, hogy el is induljon a kívánt kernel.

/root/grub.cfg

insmod all_video
echo    'Loading Linux linux-lts ...'
linux   /boot/vmlinuz-linux-lts root=/dev/mapper/cryptr1ssdVG-rootLV rw cryptdevice=/dev/md/r1ssd:cryptr1ssd ip=172.21.1.16::172.21.1.254:255.255.255.0::eth0:none loglevel=3
echo    'Loading initial ramdisk ...'
initrd  /boot/intel-ucode.img /boot/initramfs-linux-lts.img
boot

ISO generálás

grub-mkrescue -o grub-$(date +%Y-%m-%d).iso \
"boot/initramfs-linux-lts.img=/boot/initramfs-linux-lts-usb.img" \
"boot/vmlinuz-linux-lts=/boot/vmlinuz-linux-lts" \
"boot/intel-ucode.img=/boot/intel-ucode.img" \
"boot/grub/grub.cfg=/root/grub.cfg"

ISO kiírása USB meghajtóra

dd bs=4M if=path/to/grub.iso of=/dev/sdx conv=fsync oflag=direct status=progress