LUKS Verschlüsseltes Ubuntu 20.04 remote über SSH entschlüsseln

Wenn man ein Ubuntu komplett mittels LUKS verschlüsselt muss beim Starten ein Passwort eingegeben werden. Da man nicht immer physischen Zugriff auf den Server hat, wenn man ihn neu starten muss, ist es gut die Option zu haben das Passwort remote über SSH einzugeben. Über den normalen SSH Server ist dies nicht möglich, da das Passwort schon eingegeben werden muss, bevor der SSH Server startet. In diesem Artikel beschreibe ich, wie dropbear so konfiguriert werden kann, um über ihn bzw. SSH das LUKS Passwort einzugeben. Ich nehme in diesem Arikel an, dass der Server beim starte eine bekannte IP Adresse per DHCP zugewiesen bekommt.

Zuerst muss dropbear installiert werden. Das Paket dropbear-initramfs ist die initramfs integration von dropbear.

$ sudo apt install dropbear-initramfs 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  dropbear-bin libtomcrypt1 libtommath1
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 535 kB of archives.
After this operation, 1635 kB of additional disk space will be used.
Do you want to continue? [Y/n]  
Get:1 http://de.archive.ubuntu.com/ubuntu focal/main amd64 libtommath1 amd64 1.2.0-3 [53.0 kB]
Get:2 http://de.archive.ubuntu.com/ubuntu focal/universe amd64 libtomcrypt1 amd64 1.18.2-3 [360 kB]
Get:3 http://de.archive.ubuntu.com/ubuntu focal/universe amd64 dropbear-bin amd64 2019.78-2build1 [113 kB]
Get:4 http://de.archive.ubuntu.com/ubuntu focal/universe amd64 dropbear-initramfs all 2019.78-2build1 [8992 B]
Fetched 535 kB in 0s (1273 kB/s)            
Selecting previously unselected package libtommath1:amd64.
(Reading database ... 107150 files and directories currently installed.)
Preparing to unpack .../libtommath1_1.2.0-3_amd64.deb ...
Unpacking libtommath1:amd64 (1.2.0-3) ...
Selecting previously unselected package libtomcrypt1:amd64.
Preparing to unpack .../libtomcrypt1_1.18.2-3_amd64.deb ...
Unpacking libtomcrypt1:amd64 (1.18.2-3) ...
Selecting previously unselected package dropbear-bin.
Preparing to unpack .../dropbear-bin_2019.78-2build1_amd64.deb ...
Unpacking dropbear-bin (2019.78-2build1) ...
Selecting previously unselected package dropbear-initramfs.
Preparing to unpack .../dropbear-initramfs_2019.78-2build1_all.deb ...
Unpacking dropbear-initramfs (2019.78-2build1) ...
Setting up libtommath1:amd64 (1.2.0-3) ...
Setting up libtomcrypt1:amd64 (1.18.2-3) ...
Setting up dropbear-bin (2019.78-2build1) ...
Setting up dropbear-initramfs (2019.78-2build1) ...
Generating Dropbear DSS host key.  Please wait.
Generating 1024 bit dss key, this may take a while...
1024 SHA256:JDWKym87Slb69njtU+6JOzXLaoNbPaAz5/Crg&VVzEE root@server02 (DSA)
+---[DSA 1024]----+
|        .E.      |
|         .       |
|      o o        |
|.    o =         |
|.o. . o S.       |
|..o+   o. o      |
| ..oo oO o o     |
| .ooO=*oX   .    |
| .*@=B==++.      |
+----[SHA256]-----+
Generating Dropbear RSA host key.  Please wait.
Generating 2048 bit rsa key, this may take a while...
2048 SHA256:oY1qGNXZ6WuL1p3sTgHbJktzVEWQ7mnOOORZ39KHKUY root@server02 (RSA)
+---[RSA 2048]----+
|            .+o  |
|     . o .  ..   |
|    . o +  .. E  |
|   .   = . ...   |
|  .   o S o...o  |
|   o .   = oo+.. |
|  . o  .Oo*o++.  |
|   .  .++@=+..o  |
|     ...++. +o   |
+----[SHA256]-----+
Generating Dropbear ECDSA host key.  Please wait.
Generating 256 bit ecdsa key, this may take a while...
256 SHA256:u/g9oA7OLW30cGPlvBV7Ha4A7fi2TUpVeL8FFIazHkv root@server02 (ECDSA)
+---[ECDSA 256]---+
|         ..  o*=+|
|          .. +=+o|
|         ... o++ |
|       o. o.o +. |
|        S+.* o.  |
|       ..o*oo  . |
|      ..oo..o   .|
|     ..o..=oo.  .|
|     .o.oo.*+. E |
+----[SHA256]-----+
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 man-db (2.9.1-1) ...
Processing triggers for libc-bin (2.31-0ubuntu9) ...
Processing triggers for initramfs-tools (0.136ubuntu6) ...
update-initramfs: Generating /boot/initrd.img-5.4.0-37-generic
dropbear: WARNING: Invalid authorized_keys file, remote unlocking of cryptroot via SSH won't work!

Zuerst notieren wir uns den Hashwert des RSA host key (rot markiert), da wir beim ersten Verbinden mit dropbear nach diesem gefragt werden um zu verifizieren, dass wir mit dem richtigen Server kommunizieren.

Jetzt kümmern wir uns um die Fehlermeldung am Ende. Sie sagt, dass wir noch unseren öffentlichen Schlüssel zum Authentifizieren in der authorized_keys Datei hinterlegen müssen – Wie man sich Schlüssel zum Authentifizieren unter Ubuntu erstellt habe ich im Artikel SSH Authentifizierung mittels Public-Keys beschrieben. Hier ist zu beachten, dass die aktuelle Version von dropbear – zumindest die, welche Ubuntu 20.04 standardmäßig mitliefert – kein ED25519 unterstützt. Deshalb werden wir unseren RSA Schlüssel hinterlegen.

Dazu einfach die Datei /etc/dropbear-initramfs/authorized_keys auf dem Server als Superuser öffnen und den RSA Schlüssel (~/.ssh/id_rsa.pub) einfügen.

$ sudo nano /etc/dropbear-initramfs/authorized_keys

Da dropbear einen eigenen bzw. anderen RSA Host Key verwendet als OpenSSH in Ubuntu und pro Host und Port nur ein Host Key hinterlegt sein kann, würde bei jedem Verbinden mit dem anderen SSH Server eine Fehlermelden kommen und die known_hosts Datei müsste angepasst werden – Es ist aus Sicherheitsaspekten nicht ratsam den gleichen Host Key zu verwenden. Dieses Problem kann ganz einfach mit einer eigenen SSH Konfiguration für dropbear auf dem Client umgangen werden in der eine alternative known_hosts Datei angegeben wird. Die SSH Konfiguration auf Clientseite könnte beispielsweise so aussehen:

Host server-unlock
	Hostname xxx.xxx.xxx.xxx
	User root
	UserKnownHostsFile ~/.ssh/known_hosts.initramfs

Weitere Einstellungsmöglichkeiten der Client SSH Konfiguration beschreibe ich in dem Artikel Konfigurationsdatei zum Verwalten von SSH Verbindungen.

Damit wir uns den Befehl zum Entschlüsseln nicht merken bzw. immer eingeben müssen können wir dropbear so konfigurieren, dass es den Befehl zum Entschlüsseln automatisch ausführt, wenn wir uns verbinden und wir nur noch das Passwort eingeben müssen. Dazu muss die Datei /etc/dropbear-initramfs/config um folgendes ergänzt werden:

DROPBEAR_OPTIONS='-c cryptroot-unlock'

Da wir uns immer mittels RSA authentifizieren lösche ich noch die Host Keys für die Authentifizierung mittels DSA und ECDSA.

$ sudo rm /etc/dropbear-initramfs/dropbear_dss_host_key /etc/dropbear-initramfs/dropbear_ecdsa_host_key

Jetzt müssen wir noch das initframfs Image aktualisieren um alle gemachten Änderungen zu übernehmen

$ sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-5.x.x-xx-generic

Jetzt starten wir einmal neu um das System testweise über SSH zu entschlüsseln.

$ sudo reboot

Nun verbinden wir uns über die angelegte Konfiguration mit dem Server.

$ ssh server-unlock
The authenticity of host 'xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx)' can't be established.
RSA key fingerprint is SHA256:oY1qGNXZ6WuL1p3sTgHbJktzVEWQ7mnOOORZ39KHKUY.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'xxx.xxx.xxx.xxx' (RSA) to the list of known hosts.
Enter passphrase for key '/home/user/.ssh/id_rsa': 
Please unlock disk dm_crypt-1: 
cryptsetup: dm_crypt-1 set up successfully
Connection to xxx.xxx.xxx.xxx closed by remote host.
Connection to xxx.xxx.xxx.xxx closed.

Wie man sieht musste zuerst der Host Key von dropbear bestätigt werden – dies muss nur einmal gemacht werden. Nach dem öffnen des eigenen Schlüssels wurde sofort nach dem Passwort für die LUKS partition gefragt. Nach dem Entschlüsseln der Partition wurde die Verbindung sofort wieder getrennt und der Server bootet in Ubuntu.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.