Website-Suche

So entsperren Sie ein LUKS-Volume beim Booten auf Raspberry Pi OS


LUKS (Linux Unified Key Setup) ist die De-facto-Standard-Verschlüsselungsmethode, die auf Linux-basierten Betriebssystemen verwendet wird. Wie wir in früheren Tutorials gesehen haben, müssen wir, wenn wir möchten, dass eine mit LUKS verschlüsselte Partition oder Rohfestplatte beim Booten automatisch entsperrt wird, eine dedizierte Zeile in die Datei /etc/crypttab eingeben. Dabei werden wir aufgefordert, das Verschlüsselungspasswort interaktiv anzugeben. Dies ist auf Laptops oder Desktop-Computern recht einfach, aber wie können wir ein Volume auf einem Headless-Server entsperren? Eine Lösung besteht darin, dropbear zu verwenden, um in einem frühen Bootstadium im initramfs SSH-Zugriff zu erhalten, um das Volume-Passwort bereitzustellen. In diesem Tutorial sehen wir, wie man dropbear-initramfs verwendet, um in einem frühen Bootstadium SSH-Zugriff zu erhalten, um ein LUKS-Volume freizuschalten.

In diesem Tutorial lernen Sie:

  • So installieren und konfigurieren Sie dropbear-initramfs auf Raspberry-pi OS
  • Wie man ein initramfs generiert
  • So konfigurieren Sie eine statische IP-Adresse im initramfs
  • So erstellen Sie einen crypttab-Eintrag für das LUKS-Gerät
  • Wie man in einer frühen Bootphase ssh und das LUKS-Volume-Passwort bereitstellt

Einführung und Installation von Dropbear

Dropbear ist ein kostenloser Open-Source-SSH-Server und -Client, der auf einer Vielzahl von Unix-Plattformen verfügbar ist. Da es sehr leichtgewichtig ist, wird es häufig in Einbettungsgeräten verwendet, bei denen die Ressourcen begrenzt sind. Unter Debian und Debian-basierten Distributionen wie Raspberry Pi OS bietet ein Paket namens dropbear-initramfs Unterstützung für die Integration von Dropbear in das System initramfs. Um mit diesem Tutorial fortzufahren, müssen wir es installieren, also führen wir Folgendes aus:

sudo apt install dropbear-initramfs

Als Teil der Installation werden einige SSH-Schlüssel generiert und im Verzeichnis /etc/dropbear-initramfs gespeichert:

ls -l /etc/dropbear-initramfs
[...]
-rw------- 1 root root 141 Jun 27 16:03 dropbear_ecdsa_host_key
-rw------- 1 root root 83 Jun 27 16:03 dropbear_ed25519_host_key
-rw------- 1 root root 805 Jun 27 16:03 dropbear_rsa_host_key

Machen Sie sich keine Sorgen, wenn Sie bereits OpenSSH auf dem System verwenden, diese Schlüssel werden nur im Kontext des initramfs verwendet.

Konfigurieren von dropbear-initramfs

Sobald wir das Paket dropbear-initramfs installiert haben, müssen wir es konfigurieren. Wir können dies tun, indem wir die entsprechende Zeile in die Datei /etc/dropbear-initramfs/config schreiben. Was wir in der Datei ändern möchten, ist der Wert der Variablen DROPBEAR_OPTIONS. Die Optionen, die wir als Wert der Variablen angeben, werden an Dropbear übergeben, wenn wir uns über SSH im initramfs-Kontext anmelden:

#
Command line options to pass to dropbear(8)
#
DROPBEAR_OPTIONS="-jks -p 2222 -c cryptroot-unlock"

Die Optionen -j und -k werden verwendet, um das Forwading für lokale bzw. Remote-SSH-Ports zu deaktivieren. Die lokale Portweiterleitung ist eine Technik, die verwendet wird, um den über einen bestimmten Port auf dem SSH-Client empfangenen Datenverkehr zu einem bestimmten Port auf dem Rechner zu tunneln, der als SSH-Server verwendet wird. Die Remote-Portweiterleitung funktioniert umgekehrt: Sie wird verwendet, um den über einen Port auf dem SSH-Server empfangenen Datenverkehr an einen Port auf dem Client-Computer weiterzuleiten. Eine Verwendung der SSH-Portweiterleitung besteht darin, den Datenverkehr zu verschlüsseln, der von Anwendungen generiert wird, die unverschlüsselte Protokolle wie FTP verwenden. Da wir in diesem Zusammenhang keine Portweiterleitung benötigen, deaktivieren wir diese Funktion.

Die Option -s wird verwendet, um die Passwortanmeldung zu deaktivieren. Um uns per SSH in das temporäre System einzuloggen, das vom initramfs zur Verfügung gestellt wird, verwenden wir die Authentifizierung mit öffentlichem Schlüssel. Wir müssen uns als Root-Benutzer anmelden, und in diesem Zusammenhang wäre es nicht möglich, sich mit einem Passwort anzumelden, selbst wenn wir es wollten.

Standardmäßig lauschen SSH-Server auf Port 22. In diesem Fall haben wir jedoch die Option -p verwendet, um anzugeben, dass wir einen anderen Port, 2222, verwenden möchten. Dies ist notwendig, da, wie bereits erwähnt, bei der Installation von Dropbear dedizierte Host-Schlüssel generiert werden, die sich offensichtlich von denen unterscheiden, die bei der Verbindung mit dem "echten" System verwendet werden. Wenn wir uns zum ersten Mal mit einem SSH-Server verbinden, wird der Serverschlüssel in unsere lokale "known_hosts"-Datei geschrieben. Dieser Schlüssel wird bei nachfolgenden Verbindungen überprüft, um einen möglichen "Man-in-the-Middle-Angriff" zu vermeiden. Wenn sich der Schlüssel des Servers ändert, wird eine Meldung ähnlich der folgenden angezeigt:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Please contact your system administrator.
Add correct host key in /home/hostname /.ssh/known_hosts to get rid of this message.
Offending RSA key in /var/lib/sss/pubconf/known_hosts:4
RSA host key for pong has changed and you have requested strict checking.
Host key verification failed.

Wenn wir bei der Verwendung von dropbear im initramfs und auf dem gebooteten System den gleichen Port für die Verbindung über SSH verwenden, sehen wir diese Meldung. Indem wir einen anderen Port für Dropbear angeben, können wir den Fehler vermeiden.

Die letzte Option, die wir im obigen Beispiel festgelegt haben, ist -c.  Diese Option nimmt einen Befehl als Argument an: Dieser Befehl wird zwangsweise ausgeführt, wenn die Verbindung hergestellt wird, unabhängig davon, ob der Benutzer einen anderen Befehl angegeben hat. In diesem Fall haben wir den Befehl cryptroot-unlock verwendet. Cryptroot-unlock ist ein Skript, das vom Paket cryptsetup-initramfs bereitgestellt wird: Es wird verwendet, um Geräte zu entsperren, die in der Datei /etc/crypttab beim Booten angegeben sind.

Autorisierung unseres Schlüssels

Wie wir bereits erwähnt haben, werden wir uns mit der Authentifizierung mit öffentlichem Schlüssel anmelden, daher müssen wir den öffentlichen Schlüssel unseres Clients in die Datei /etc/dropbear-initramfs/authorized-keys kopieren, die im Besitz von root sein muss und 600 als Berechtigungsmodus haben muss, so dass sie nur von ihrem Besitzer gelesen und beschrieben werden kann. Wenn wir uns normalerweise als Standardbenutzer in das System einloggen und denselben Schlüssel verwenden möchten, können wir einfach die Datei ~/.ssh/authorized_key, die im Home-Verzeichnis des Benutzers vorhanden ist, mit dem wir uns wie auf dem Server verbinden, an die oben genannte Position kopieren:

sudo cp ~/.ssh/authorized_keys /etc/dropbear-initramfs/

Wir könnten auch ein dediziertes Schlüsselpaar generieren und den Inhalt des öffentlichen Schlüssels in die Datei kopieren.

Einrichten von crypttab und fstab

Wir müssen einen Eintrag für das LUKS-verschlüsselte Blockgerät erstellen, das beim Booten automatisch in der Datei /etc/crypttab entsperrt werden soll. Hier werden wir die crypttab-Syntax nicht im Detail beschreiben, da wir sie in einem speziellen Tutorial beschrieben haben. So muss unser crypttab-Eintrag aussehen:

luks-200ce9d7-72de-443f-b669-e50d0a23f01a UUID=200ce9d7-72de-443f-b669-e50d0a23f01a none luks,initramfs

Wir haben das verschlüsselte Gerät anhand seiner UUID identifiziert und es so konfiguriert, dass es nach dem Entsperren als /dev/mapper/luks-200ce9d7-72de-443f-b669-e50d0a23f01a zugänglich ist. Das sehr Wichtige ist, dass wir die Option initramfs verwendet haben: Dies ist keine Standard-cyrpttab-Option, sondern eine Debian-Implementierung und wird benötigt, damit der Eintrag in das initramfs aufgenommen werden kann.

In diesem Beispiel möchte ich, dass dieses Gerät automatisch auf /srv gemountet wird, also müssen wir diese Zeile in /etc/fstab hinzufügen:

/dev/mapper/luks-200ce9d7-72de-443f-b669-e50d0a23f01a /srv ext4 defaults,noatime 0 2

Übrigens, wenn Sie mit fstab nicht vertraut sind, haben wir auch ein Tutorial über die Syntax geschrieben.

Festlegen einer statischen IP im initramfs

Um uns in einem frühen Bootstadium über SSH anmelden zu können, wenn das initramfs verwendet wird, müssen wir eine statische IP für unsere Maschine setzen. Eine Möglichkeit, dies zu tun, besteht darin, statische Leases in unserem Router festzulegen (sofern das Gerät diese Funktion unterstützt), sodass er IP-Adressen statisch bestimmten MAC-Adressen zuweist. Wenn wir diese Strategie verwenden, müssen wir nichts auf dem Client-Rechner ändern. Die andere Möglichkeit besteht darin, eine statische IP direkt auf dem Client zu setzen, indem Sie den Kernel-Parameter "ip" verwenden. Wir können dies in der Datei /etc/initramfs-tools/initramfs.conf mit der folgenden Syntax festlegen:

IP=<client-ip>:<server-ip>:<gateway-ip>:<netmask>:<hostname>

Die Elemente werden durch einen Doppelpunkt getrennt. Die erste ist die Client-IP, die zweite, Server-IP, wird in diesem Zusammenhang nicht benötigt: Sie wird bei der Verbindung mit einem NFS-Server verwendet. Das dritte Element ist die IP des Gateways, bei der es sich in einem Home-Setup in der Regel um das Modem/den Router handelt. Das fünfte Element ist die Netzmaske und das dritte ist der Hostname der Maschine. Hier ist ein Beispiel. Wir weisen der Maschine die statische IP 192.168.0.39 zu:

IP=192.168.0.39::192.168.0.1:255.255.255.0:feanor

Generieren des initramfs

Wir können nun unser initramfs generieren und angeben, dass es beim Booten verwendet werden soll. Um das initramfs zu generieren, verwenden wir den Befehl mkinitramfs:

sudo mkinitramfs -o /boot/initramfs.gz

Im obigen Beispiel haben wir die Option -o (kurz für --outfile) verwendet, die als Argument den Pfad annimmt, in dem das generierte initramfs-Archiv gespeichert werden soll. In diesem Fall haben wir es als /boot/initramfs.tar.gz gespeichert. Sobald das initramfs generiert ist, müssen wir die folgende Zeile an die Datei /boot/config.txt anhängen, damit es beim Booten verwendet werden kann:

initramfs initramfs.gz followkernel

Der Befehl initramfs wird verwendet, um die ramfs anzugeben, die verwendet werden sollen, und die Speicheradresse, an die sie geladen werden soll. Mit der Verwendung von "followkernel" sagen wir im Grunde, dass das initramfs nach dem Kernel-Image in den Speicher geladen werden soll (mehr dazu erfahren Sie auf dieser Raspberry Pi Dokumentationsseite).

Entsperren des Geräts beim Booten

Zu diesem Zeitpunkt ist alles vorbereitet, und alles sollte gut funktionieren. Wir starten das Rasberry Pi OS neu und warten einige Sekunden, bis es wieder online ist. dann loggen wir uns von unserem Client-Rechner aus per SSH ein:

ssh root@192.168.0.39 -p 2222

Wenn wir zum ersten Mal eine Verbindung herstellen, wird der Systemfingerabdruck angezeigt, und wir werden aufgefordert, zu bestätigen, dass wir eine Verbindung herstellen möchten:

The authenticity of host '[192.168.0.39]:2222 ([192.168.0.39]:2222)' can't be established.
ED25519 key fingerprint is SHA256:TjCUX3ZG0blPkuRwyCCKM9Dv2JPtnHUivoC9nVP78XI.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

Sobald wir bestätigen, werden wir benachrichtigt, dass der Server zur Liste der bekannten Hosts hinzugefügt wurde, dann werden wir aufgefordert, das Passwort zum Entsperren des LUKS-verschlüsselten Geräts einzugeben, das wir in der crypttab-Datei angegeben haben:

Please unlock disk luks-200ce9d7-72de-443f-b669-e50d0a23f01a:

Da der Raspberry Pi nur über eine begrenzte CPU-Leistung verfügt, kann es eine Weile dauern, bis das LUKS-Gerät entsperrt ist, insbesondere wenn es auf einem leistungsstärkeren Gerät formatiert wurde. Wenn der Vorgang zu viel in Anspruch nimmt, erhalten wir möglicherweise einen Timeout-Fehler. Wenn wir die richtige Passphrase angeben, wird das Gerät entsperrt, die Verbindung wird geschlossen und der Bootvorgang wird fortgesetzt.

cryptsetup: luks-200ce9d7-72de-443f-b669-e50d0a23f01a set up successfully
Connection to 192.168.0.39 closed.

Schlüsse

In diesem Artikel haben wir gesehen, wie man dropbear-initramfs verwendet, um SSH-Zugang in einer frühen Bootphase zu erhalten, wenn das initramfs geladen wird, um ein LUKS-verschlüsseltes Gerät auf einem Headless Raspberry Pi zu entsperren. Die Anweisungen in diesem Tutorial können, mit einigen kleinen Änderungen, auf andere Debian-basierte Systeme angewendet werden.

Verwandte Artikel: