Titkosított partíció kinyitása soros porton keresztül, vagy távoli eléréssel
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