Voll-verschlüsseltes-System via SSH freischalten

Aus Thomas-Krenn-Wiki
Zur Navigation springen Zur Suche springen

Eine komplette Verschlüsselung des eigenen Systems ist eine hervorragende Möglichkeit, um die Vertraulichkeit der eigenen Daten zu sichern. Der aktuelle Ubuntu-Installer bietet von Haus aus eine geführte Installation zur Verschlüsselung des kompletten Systems mit "Encrypted LVMs". Sowohl für die automatisierte Installation als auch für den manuellen Weg gibt es zahlreiche, detaillierte Guides, die die Einrichtung erklären.[1][2]

Der Vorteil bei der Verwendung von LVMs ist, dass für die Entsperrung aller Logical Volumes nur mehr ein Passwort eingegeben werden muss. Dadurch wird das Crypto-Device, in dem sich die Volume Group und die Logical Volumes für z.B. "/root" und "/home" befinden, entsperrt. Für das erfolgreiche booten wird nur mehr eine unverschlüsselte boot-Partition benötigt. Beim Boot des Servers wird anschließend nach dem Passwort für die Entsperrung des Crypto-Devices gefragt ("Pre-boot Authentifizierung"). Da außer "/boot" noch keine Dateisystem zur Verfügung stehen ist es nicht möglich das System über eine Remote-Verbindung zu entsperren. Das Passwort muss über eine angeschlossene Tastatur eingegeben werden, was für einen Server problematisch sein kann. Die in diesem Artikel beschriebene Konfiguration verhindert daher für ein komplett verschlüsseltes Ubuntu, dass bei einem Neustart ein Monitor und eine Tastatur für die Entsperrung des Crypto-Devices angeschlossen werden muss.

Genauer gesagt wird in diesem Artikel erklärt, wie ein komplett verschlüsselter Ubuntu Server 14.04 via SSH-Verbindung entsperrt werden kann. Dazu wird ein kleiner SSH-Server namens "dropbear"[3] installiert und eingerichtet, der bereits zum Zeitpunkt des initramfs zur Verfügung steht.[4] Einige Information dieses Guides finden sich auch in "/usr/share/doc/cryptsetup" im File "README.remote.gz" wieder ("unlocking rootfs via ssh login in initramfs").

Installation

Der dropbear SSH-Server [5] wird per "apt" installiert:

sudo apt-get install dropbear

Konfiguration

Zuerst wird in die Datei "/etc/initramfs-tools/initramfs.conf" die Zeile

DROPBEAR=y

eingefügt.

Achtung: Jegliche Konfigurationen bezüglich des initramfs müssen via "update-initramfs" aktualisiert werden:

sudo update-initramfs -u

Netzwerk-Konfiguration

Die Netzwerk-Konfiguration für den Remote-Zugriff auf den Server wird in folgender Datei durchgeführt:

/etc/initramfs-tools/initramfs.conf

Wie die detaillierten Regeln zur Konfiguration des Devices aussehen, kann unter nfsroot.txt nachgelesen werden. Für DHCP kann z.B. folgende Zeile hinzugefügt werden:

#
# DEVICE: ...
#
# Specify the network interface, like eth0
#
DEVICE=eth1
IP=:::::eth1:dhcp

Für eine statische Adresse muss die Zeile wie folgt geändert werden:

DEVICE=eth1
IP=192.168.56.101:::255.255.255.0::eth1:off

Wiederum wird eine Aktualisierung des initramfs durchgeführt:

sudo update-initramfs -u

Nun wird das Netzwerk-Device bereits vor der Abfrage des Passworts für das Crypto-Device konfiguriert.

SSH-Zugriff auf Dropbear

Dropbear erstellt mehrere Schlüssel bei der Installation. Der Host Key für die Identifikation[6] des Servers befindet sich in:

lvtest@ubuntu:~$ ls /etc/initramfs-tools/etc/dropbear/
dropbear_dss_host_key  dropbear_rsa_host_key

Außerdem werden automatisch RSA-Schlüssel für die Public-Key-Authentifizierung erzeugt. Diese werden in folgendem Verzeichnis abgelegt:

lvtest@ubuntu:~$ ls /etc/initramfs-tools/root/.ssh/
authorized_keys  id_rsa id_rsa.pub

Der Private-Key "id_rsa" kann für den Zugriff auf den Server vom Client aus verwendet werden. Er muss dazu über einen gesicherten Weg auf den Client übertragen werden.

Achtung: Der Private-Key von Dropbear liegt unverschlüsselt vor, sollte die Datei "id_rsa" von einem Angreifer entwendet werden, so hat dieser direkten Zugriff auf den Dropbear SSH-Server. Da Dropbear aber kompatibel zu openssh-Schlüssel ist, empfiehlt es sich am Client ein eigenes SSH-Schlüsselpaar zu erzeugen und dann den Public-Key zum "Authorized Keys"-File von Dropbear hinzuzufügen (s.a. SSH_Key_Login) (am Client):

ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/client/.ssh/id_rsa): /home/client/.ssh/dropbear/id_rsa_initram
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/client/.ssh/dropbear/id_rsa_initram.
Your public key has been saved in /home/client/.ssh/dropbear/id_rsa_initram.pub.

Wichtig: Die Verwendung eines Passwortes sorgt für die Verschlüsselung des Private-Keys mittels AES-CBC 128-Bit-Key. Der Private-Key kann somit nur nach erfolgreicher Eingabe des Passworts verwendet werden, da die Datei "id_rsa_initram" nicht im Klartext vorliegt. Der Public-Key kann nun auf den Server kopiert werden:

client@test:~$ scp /home/client/.ssh/dropbear/id_rsa_initram.pub lvtest@192.168.56.101:/home/lvtest 
lvtest@192.168.56.101's password: 
id_rsa_initram.pub                                                                                                    100%  396     0.4KB/s   00:00

Damit wir auf den Server zugreifen dürfen, fügen wir (am Server) den am Client erstellten Public-Key zum "Authorized Keys"-File von Dropbear hinzu:

lvtest@ubuntu:~$ sudo su
root@ubuntu:/home/lvtest# cat id_rsa_initram.pub >> /etc/initramfs-tools/root/.ssh/authorized_keys

Nun kann der Server neu gestartet werden und ein Verbindungstest mit dem soeben erstellten Schlüsselpaar durchgeführt werden:

client@test:~$ ssh -i .ssh/dropbear/id_rsa_initram -o UserKnownHostsFile=.ssh/dropbear/known_hosts root@192.168.56.101
The authenticity of host '192.168.56.101 (192.168.56.101)' can't be established.
RSA key fingerprint is 03:92:1f:35:fc:e2:2b:db:ac:9b:b7:03:ba:37:e5:f1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.56.101' (RSA) to the list of known hosts.


BusyBox v1.21.1 (Ubuntu 1:1.21.0-1ubuntu1) built-in shell (ash)
Enter 'help' for a list of built-in commands.

#

Der Test war also erfolgreich und wir erhalten am Server eine BusyBox Shell, die wir später für die Entsperrung des crypto-Devices benutzen.

Entsperren des Crypto-Devices

Sollte der Verbindungstest zu Dropbear erfolgreich gewesen sein, kann die eigentliche Entsperrung der verschlüsselten LVMs vorgenommen werden. Aufgrund eines Bugs in Plymouth von Ubuntu müssen zuvor jedoch noch einige Zeilen in

/usr/share/initramfs-tools/scripts/local-top/cryptroot

auskommentiert werden. Welche Zeilen das sind, kann auch in Post #5 unter [1] nachgelesen werden (nach Zeile 289):

if [ -z "$cryptkeyscript" ]; then
   cryptkey="Unlocking the disk $cryptsource ($crypttarget)\nEnter passphrase: "
   #if [ -x /bin/plymouth ] && plymouth --ping; then
   # cryptkeyscript="plymouth ask-for-password --prompt"
   # cryptkey=$(echo -e "$cryptkey")
   #else
    cryptkeyscript="/lib/cryptsetup/askpass"
   #fi
  fi

Achtung: Nach dem Auskommentieren der Zeilen funktioniert die Entsperrung der Crypto-Devices nur mehr remote und nicht mehr lokal! Es müssen daher unbedingt alle zuvor durchgeführten Einstellungen überprüft worden sein (am besten einzeln und nacheinander überprüfen):

  1. Erfolgreiche Installation
  2. Netzwerk-Konfiguration des Devices
  3. Zugriff auf Dropbear via SSH mit Public-Key-Authentifizierung
  4. Lokale Entsperrung der Crypto-Devices

Sollte z.B. die Konfiguration des SSH-Servers oder des Netzwerk-Devices fehlschlagen, wird ein physikalischer Zugriff auf den Server benötigt und das Passwort muss mit einer angeschlossenen Tastatur eingegeben werden. Der Patch des Plymouth-Bugs darf daher nur dann durchgeführt werden, wenn die anderen Einstellungen sicher funktionieren!

Eine weitere Möglichkeit wäre die Erstellung eines Hook-Skriptes ([2]), diese Variante wurde vom Autor dieses Wiki-Artikels jedoch nicht verifiziert und ist daher ausschließlich auf eigene Gefahr zu testen. Abschließend die initramfs-Konfiguration wieder aktualisieren:

sudo update-initramfs -u

Nun verbinden wir uns wieder zum Server per SSH (Dropbear) und gelangen somit zur BusyBox Shell:

client@test:~$ ssh -i .ssh/dropbear/id_rsa_initram -o UserKnownHostsFile=.ssh/dropbear/known_hosts root@192.168.56.101

BusyBox v1.21.1 (Ubuntu 1:1.21.0-1ubuntu1) built-in shell (ash)
Enter 'help' for a list of built-in commands.

Dort entsperren wir mit folgendem Befehle unsere verschlüsselten LVMs, wobei das Passwort "encryptiontest" durch das eigene, beim Anlegen des Crypto-Devices gewählte, ersetzt werden muss. Zum Ensperren gibt es 2 Möglichkeiten:

  • /lib/cryptsetup/passfifo
# echo -n "encryptiontest" > /lib/cryptsetup/passfifo
  • /lib/cryptsetup/askpass

Die Variante ohne echo, und damit ohne dass das Passwort aufscheint, sieht wie folgt aus:

# /lib/cryptsetup/askpass "passphrase: " > /lib/cryptsetup/passfifo 
passphrase:

Bei passphrase muss schließlich das Passwort eingegeben werden.

Dann werden die Devices entsperrt und der Server setzt den Bootvorgang fort. Läuft nun am Server ein weiterer, "herkömmlicher" SSH-Server (meist openssh), kann man sich auf diesen wie gehabt verbinden. Ist bei der Installation von Dropbear bereits ein openssh-Server am laufen, beendet sich Dropbear automatisch nachdem der Server vollständig gebootet hat. Die Befehlssequenz kann dann auch in einem Schritt vollzogen werden:

ssh -i .ssh/dropbear/id_rsa_initram -o UserKnownHostsFile=.ssh/dropbear/known_hosts root@192.168.56.101 "echo -ne \"encryptiontest\" > /lib/cryptsetup/passfifo"

Die Verwendung eines eigenen "Known Hosts"-File empfiehlt sich insofern, da Dropbear einen anderen Fingerprint als der openssh-Server verwendet. Werden für Dropbear und openssh keine unterschiedlichen "Known-Host"-Files verwendet, kommt es zur folgenden Warnung:

ssh -i .ssh/dropbear/id_rsa_initram root@192.168.56.101 "echo -ne \"encryptiontest\" > /lib/cryptsetup/passfifo"
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

Diese Warnung hat ihren Ursprung darin, dass nun das Standard-File "~/.ssh/known_hosts" verwendet wird, in dem sich der Fingerprint des openssh-Servers befindet. Es ist daher empfehlenswert für den Dropbear- und den openssh-Server verschiedene "Known Host"-Dateien zu verwenden.

Weiterführende Informationen

  1. Ubuntu whole disk encryption (cryptolife.org)
  2. System verschlüsseln (wiki.ubuntuusers.de)
  3. dropbear SSH-Server (matt.ucc.asn.au)
  4. Verschlüsseltes System via SSH freischalten (wiki.ubuntuusers.de)
  5. BusyBox Shell (busybox.net)
  6. SSH Key Management (debian-administration.org)
Foto Georg Schönberger.jpg

Autor: Georg Schönberger

Georg Schönberger, Abteilung DevOps bei der XORTEX eBusiness GmbH, absolvierte an der FH OÖ am Campus Hagenberg sein Studium zum Bachelor Computer- und Mediensicherheit, Studium Master Sichere Informationssysteme. Seit 2015 ist Georg bei XORTEX beschäftigt und arbeitet sehr lösungsorientiert und hat keine Angst vor schwierigen Aufgaben. Zu seinen Hobbys zählt neben Linux auch Tennis, Klettern und Reisen.


Das könnte Sie auch interessieren

OpenSSH Public Key Authentication schlägt fehl
SSH Login unter Debian mit fail2ban absichern
SSH Root Login unter Debian verbieten