Před časem jsem v článku podrobně popisoval, jak mít kompletně šifrovaný disk se systémem i daty. V diskusi se pak někdo ptal, jak to zařídit na serveru, aby byla data při vypnutém stroji v bezpečí a pro zapnutí aby bylo nutné zadat vzdáleně heslo. Přesně takové uspořádání si předvedeme.
Čeho chceme dosáhnout
Použití šifrovaných svazků je v Linuxu jednoduché a přímočaré. Pokud máte takto zašifrovaný celý disk operačního systému, musíte při startu počítače zadat heslo. To je pak použito k dešifrování klíče umístěného na disku a s jeho pomocí pak umí jádro přistupovat k datům a třeba dokončit boot počitače.
Pokud jde o pracovní stroj na našem stole, je to jednoduché: prostě do klávesnice na výzvu heslo naťukáme. Horší je to v případě, že se jedná o server v jiné místnosti, ve vzdálené budově nebo třeba v datacentru v jiném státě. Pokud i tam chceme mít obsah disků zašifrovaný, musíme mít způsob, jak heslo zadat vzdáleně.
Moderní linuxový systém startuje tak, že zavaděč načte z disku jádro a inicializační ramdisk. Ten je po spuštění jádra použit jako úvodní systémový disk, který obsahuje vše potřebné ke zprovoznění skutečného operačního systému. Pokud používáme šifrované oddíly, jsou součástí tohoto ramdisku také utility, které se umí postarat o zprovoznění diskového subsystému. Přečtou konfiguraci a v případě potřeby se doptají uživatele na heslo a svazky připojí.
Našim cílem bude přidat do ramdisku podporu SSH, abychom se mohli k rozbootovanému systému připojit už v rané fázi a potřebné informace mu dodat po síti. Následující text se vztahuje k Debianu 11 Bullseye, kde je vše připraveno k jednoduchému použití.
Počáteční podmínky
Debian se při instalaci ptá na spoustu věcí a mimo jiné se můžeme rozhodnout pro různé způsoby organizace disku. Je možné vybrat také předvolenou variantu využití celého disku a jeho zašifrování. Přesně tuto možnost jsem využil a o dělení se dále nestaral. Samozřejmě máte možnost si vše manuálně přeorganizovat podle svého, přidat RAID nebo disk více rozčlenit pomocí LVM.
Výchozí stav automatické konfigurace po prvním startu nainstalovaného systému vypadá takto:
root@debian:~# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 8G 0 disk ├─sda1 8:1 0 487M 0 part /boot ├─sda2 8:2 0 1K 0 part └─sda5 8:5 0 7.5G 0 part └─sda5_crypt 254:0 0 7.5G 0 crypt ├─debian--vg-root 254:1 0 6.5G 0 lvm / └─debian--vg-swap_1 254:2 0 980M 0 lvm [SWAP]
Disk je pomocí oddílů rozdělen na dvě části: jedna obsahuje adresář /boot
s jádrem a ramdiskem a ta druhá je pak celá zašifrovaná. Uvnitř je pak pomocí LVM vytvořen kořenový svazek a také odkládací oddíl (swap). První část disku je nešifrovaná, aby z ní mohl Grub načíst svou konfiguraci a soubory potřebné pro boot.
Při startu se šifrovaná část připojí díky obsahu souboru /etc/crypttab
, jehož obsah je zkopírován do inicializačního ramdisku a vypadá takto:
root@debian:~# cat /etc/crypttab sda5_crypt UUID=68c11962-7a5c-4989-acd6-05c564eaf5a9 none luks,discard
Samozřejmě jsme při bootu velmi rychle dotázáni na heslo, bez kterého není možné ve startu pokračovat, protože by se jádro nedostalo k obsahu disku. Takhle to funguje, je čas přidat vzdálené připojení.
Dropbear v ramdisku
Pro doplnění SSH do ramdisku použijeme server Dropbear. Jedná se o malý multiplatformní SSH server, který se často používá v embedded prostředí, kde potřebujeme šetřit prostředky. Tady se nám hodí, protože kvůli němu ramdisk nenabobtná a poskytne nám vše, co budeme potřebovat.
Vývojáři Debianu už připravili potřebný balíček, který se postará o integraci Dropbearu do ramdisku a prakticky všechno udělá za nás. Stačí tedy v běžícím systému nainstalovat:
root@debian:~# apt install dropbear-initramfs Reading package lists... Done Building dependency tree... Done Reading state information... Done The following additional packages will be installed: dropbear-bin libtomcrypt1 libtommath1 Suggested packages: openssh-client The following NEW packages will be installed: dropbear-bin dropbear-initramfs libtomcrypt1 libtommath1 0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded. Need to get 663 kB of archives. After this operation, 1,789 kB of additional disk space will be used. Do you want to continue? [Y/n] Get:1 http://deb.debian.org/debian bullseye/main amd64 libtommath1 amd64 1.2.0-6 [66.1 kB] Get:2 http://deb.debian.org/debian bullseye/main amd64 libtomcrypt1 amd64 1.18.2-5 [400 kB] Get:3 http://deb.debian.org/debian bullseye/main amd64 dropbear-bin amd64 2020.81-3 [153 kB] Get:4 http://deb.debian.org/debian bullseye/main amd64 dropbear-initramfs all 2020.81-3 [43.8 kB] Fetched 663 kB in 0s (1,792 kB/s) Selecting previously unselected package libtommath1:amd64. (Reading database ... 18619 files and directories currently installed.) Preparing to unpack .../libtommath1_1.2.0-6_amd64.deb ... Unpacking libtommath1:amd64 (1.2.0-6) ... Selecting previously unselected package libtomcrypt1:amd64. Preparing to unpack .../libtomcrypt1_1.18.2-5_amd64.deb ... Unpacking libtomcrypt1:amd64 (1.18.2-5) ... Selecting previously unselected package dropbear-bin. Preparing to unpack .../dropbear-bin_2020.81-3_amd64.deb ... Unpacking dropbear-bin (2020.81-3) ... Selecting previously unselected package dropbear-initramfs. Preparing to unpack .../dropbear-initramfs_2020.81-3_all.deb ... Unpacking dropbear-initramfs (2020.81-3) ... Setting up libtommath1:amd64 (1.2.0-6) ... Setting up libtomcrypt1:amd64 (1.18.2-5) ... Setting up dropbear-bin (2020.81-3) ... Setting up dropbear-initramfs (2020.81-3) ... Generating Dropbear RSA host key. Please wait. Generating 2048 bit rsa key, this may take a while... Public key portion is: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCNOb7BbzbOWPrV20peu3Lmg/nkGlopVaygfeIA/LN+nnOLEP/3EcCo7wPTQFSSvNXFoHhpxoWxDV5KjcxbBY2JfVVs4XvqgVK0YFP0Mv2b7uzFuYOZtq7McT/ab6vKTTGHNPmzhR yaAyk6qKgSd3hlejKHrpzHsNF+XenZHjktByRREzWowiLUGYy9P3xalRE5Lm0AoFQ7hPvYlbECMMk/Pnl94wovpgak91ZBVqnmg7DnKvrNvhZM7rvxIq09jSG6K6xegHDyUGaSkRts2sDQjDBE1s69u51SORgiJR20c6OQALe0Uco3 /aLoxAN78JA2B6V1WM6Wgv24CucehKdV root@debian Fingerprint: sha1!! 7d:d6:0d:b8:c1:22:81:84:b7:05:13:35:ea:c7:c2:7b:27:a7:a5:ec Generating Dropbear ECDSA host key. Please wait. Generating 256 bit ecdsa key, this may take a while... Public key portion is: ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKzcfGFfwxzwgjOh4YAO3LR1pXoKAT9NXVuysrNUnM91z98Kekrmn39hp/AULUvOC8QyKRLwBK/mUFJBuz/60QA= root@debian Fingerprint: sha1!! 81:b0:92:9d:88:cf:b1:ac:c8:09:51:9e:9c:b2:48:dd:e2:76:de:24 Generating Dropbear ED25519 host key. Please wait. Generating 256 bit ed25519 key, this may take a while... Public key portion is: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFdPfmkDfwaAVOQgeHUCLI8op3PsZ6u/moIMbnsAMzQv root@debian Fingerprint: sha1!! dd:5c:0c:41:c9:36:7f:96:35:56:31:8b:f3:a1:3b:e5:a2:de:20:e3 update-initramfs: deferring update (trigger activated) Dropbear has been added to the initramfs. Don't forget to check your "ip=" kernel bootparameter to match your desired initramfs ip configuration. Processing triggers for libc-bin (2.31-13+deb11u2) ... Processing triggers for initramfs-tools (0.140) ... update-initramfs: Generating /boot/initrd.img-5.10.0-9-amd64 dropbear: WARNING: Invalid authorized_keys file, SSH login to initramfs won't work!
Stalo se několik věcí: nainstaloval se Dropbear, vygenerovaly se serverové klíče, proběhla instalace integračních skriptů a úplně na konci se spustilo nové generování inicializačního ramdisku. Všimněte si poslední hlášky ve výpisu, ve které vás server varuje, že nemáte správně vložené veřejné klíče pro přihlášení k SSH. To ovšem hned napravíme.
Přihlašování klíči
Přihlašovat se k SSH pomocí klíčů je rozhodně dobrý nápad a nebudeme to dělat jinak ani tady. Veřejný klíč či klíče je potřeba jen nakopírovat na serveru do správného umístění. Použijeme k tomu třeba scp
.
$ scp id_ed25519.pub root@debian:/etc/dropbear-initramfs/authorized_keys
Poté je ovšem nutné znovu přegenerovat ramdisk, takže musíme na serveru zavolat:
root@debian:~# update-initramfs -u
Tím se klíče zapíší do ramdisku a bude možné je použít k přihlášení. Teď už stačí jen rebootovat a novou konfiguraci si vyzkoušet.
root@debian:~# reboot
Vzdálené připojení disku
Počítač se po startu chová na první pohled stejně, jako předtím. Nabídne nám možnost zadat frázi pro připojení systémového disku. Nově ovšem také získal z DHCP místní adresy a poslouchá na TCP portu 22. Můžeme se k němu připojit běžným SSH klientem.
Po přihlášení se nám objeví informační hláška, která nám napovídá, že bychom mohli chtít spustit příkaz cryptroot-unlock
. Pokud to uděláme, budeme dotázáni na heslo a start systému poté doběhne standardním způsobem.
$ ssh root@debian The authenticity of host 'debian' can't be established. ED25519 key fingerprint is SHA256:eqaVn7K0AR11uBAcjFXbpF4gTmJNkqOR3lLZq97wdqA. No matching host key fingerprint found in DNS. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'debian' (ED25519) to the list of known hosts. To unlock root partition, and maybe others like swap, run `cryptroot-unlock`. BusyBox v1.30.1 (Debian 1:1.30.1-6+b3) built-in shell (ash) Enter 'help' for a list of built-in commands. ~ # cryptroot-unlock Please unlock disk sda5_crypt: cryptsetup: sda5_crypt set up successfully ~ # Shared connection to localhost closed.
Poznámka: Přihlašujeme se sice na účet root, ale není to root ve skutečném systému. Může tedy mít třeba úplně oddělené přihlašovací klíče, pokud to budeme chtít.
Volitelná konfigurace
Takto by vám to pravděpodobně mohlo stačit, ještě vás ale upozorním na některé užitečné možnosti konfigurace. Ve výchozím stavu se startovací systém v ramdisku dožaduje konfigurace síťových rozhraní pomocí DHCP. Pokud to nechcete a raději preferujete statické nastavení, pak stačí upravit soubor /etc/initramfs-tools/initramfs.conf
a připsat do něj řádek v následujícím formátu:
IP=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns-server-0-ip>:<dns-server-1-ip>:<ntp0-ip>
Neděste se, většinu položek lze v klidu vynechat a konec můžete zkrátit. Výsledek pak může vypadat třeba takto:
IP=192.168.2.19::192.168.2.254:255.255.255.0:debian
Přičemž jsme zapsali: adresu, bránu, masku a hostname. Nezapomeňte znovu vytvořit ramdisk pomocí příkazu update-initramfs
.
Konfigurovat můžeme také samotný Dropbear, konkrétně v souboru /etc/dropbear-initramfs/config
. Tady je třeba vyplnit volbu DROPBEAR_OPTIONS
, do které lze připsat některé parametry z manuálové stránky.
DROPBEAR_OPTIONS="-j -k -p 2222"
Volby znamenají: vypni místní přesměrování portů, vypni vzdálené přesměrování portů a poslouchej na jiném než výchozím portu. Poslední zmíněná volba se v praxi hodí, protože pak bude mít váš klient pro Dropbear uložený jiný veřejný klíč než pak pro ostré SSH v systému. Pokud podobné změny provedete, nezapomeňte opět zavolat update-initramfs
.