Linux Root Server nachträglich verschlüsseln

Linux Root Server nachträglich verschlüsseln

In diesem HowTo möchte ich zeigen wie man einen Linux Root Server nachträglich verschlüsselt.
Auf die Festplatten sollen in eine Full Disk Encryption laufen, damit alle Daten Verschlüsselt sind.

Das Ausgangsszenario ist für einen gemieteten Server mit Software RAID (mdadm). Dieser wurde bereits vom Anbieter mit LVM aufgesetzt und soll jetzt nachträglich verschlüsselt werden.
Da ich dies schon gemacht hab, zeig ich das ganze in einer VM die zwei Festplatte im RAID 1 hat und dort auch ein LVM läuft.
Das verwendete Betriebssystem ist Debian Jessie.

De Ausgangssituation

Die Festplatten sind mit zwei RAID 1 erstellt worden. md0 für die boot Partition und md1 für das LVM

root@crypt-test:~ # cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1] sda1[0]
      975296 blocks super 1.2 [2/2] [UU]

md1 : active raid1 sdb2[1] sda2[0]
      9499648 blocks super 1.2 [2/2] [UU]

unused devices: 

root@crypt-test:~ # pvdisplay
  --- Physical volume ---
  PV Name               /dev/md1
  VG Name               system
  PV Size               9.06 GiB / not usable 0
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              2319
  Free PE               889
  Allocated PE          1430
  PV UUID               16jVck-L7vo-u1YO-fSvx-AVPk-p7cn-0FxeOr

root@crypt-test:~ # df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/dm-0       4.7G  869M  3.8G  19% /
udev             10M     0   10M   0% /dev
tmpfs           398M  5.4M  393M   2% /run
tmpfs           995M     0  995M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           995M     0  995M   0% /sys/fs/cgroup
/dev/md0        922M   33M  842M   4% /boot

Backup erstellen !!

Als erstes sollte ein Backup der Daten erstellt werden, bevor man mit der Prozedur anfängt. Nur so als Tip den wenn was schief geht und man den Server neu installieren muss. Ist alles weg

Installation der benötigten Pakete

apt-get install cryptsetup mdadm lvm2 dropbear busybox

Mit Cryptsetup wird das Laufwerk verschlüsselt.
Mit Dropbear wird ein SSH Deamon bereitgestellt der bereits beim Booten gestartet wird.

 

Welche Crypt Variante verwenden

Um das herauszufinden hat das cryptsetup einen benchmark Befehl der die CPU prüft und uns dann sagt welche Verschlüsselung am besten ist.

cryptsetup benchmark
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1       244537 iterations per second
PBKDF2-sha256     159067 iterations per second
PBKDF2-sha512      98107 iterations per second
PBKDF2-ripemd160  170666 iterations per second
PBKDF2-whirlpool   41373 iterations per second
#  Algorithm | Key |  Encryption |  Decryption
     aes-cbc   128b   151.8 MiB/s   282.5 MiB/s
 serpent-cbc   128b    21.5 MiB/s    65.5 MiB/s
 twofish-cbc   128b    48.0 MiB/s    60.4 MiB/s
     aes-cbc   256b   158.4 MiB/s   223.0 MiB/s
 serpent-cbc   256b    27.6 MiB/s    66.0 MiB/s
 twofish-cbc   256b    60.2 MiB/s    61.1 MiB/s
     aes-xts   256b   251.3 MiB/s   251.9 MiB/s
 serpent-xts   256b    61.4 MiB/s    61.7 MiB/s
 twofish-xts   256b    56.4 MiB/s    57.1 MiB/s
     aes-xts   512b   202.6 MiB/s   203.7 MiB/s
 serpent-xts   512b    62.0 MiB/s    62.0 MiB/s
 twofish-xts   512b    57.1 MiB/s    57.2 MiB/s

Hier der Benchmark in der VM von meinem Intel(R) Atom(TM) CPU  C2758  @ 2.40GHz

 

Auflösen des md1 RAID

Jetzt muss der RAID1 von /dev/md1 aufgelöst bzw. eine Festplatte entfernt werden. Damit wir ein neues RAID set anlegen können, das wir dann anschließend verschlüsseln werden.

Eine Festplatte als Fehlerhaft markieren

mdadm –manage /dev/md1 –fail /dev/sdb2
mdadm: set /dev/sdb2 faulty in /dev/md1

Die Fehlerhafte Festplatte aus dem RAID nehmen

mdadm –manage /dev/md1 –remove /dev/sdb2
mdadm: hot removed /dev/sdb2 from /dev/md1

Anzeigen wie es dem RAID geht

cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sda1[0] sdb1[1]
      975296 blocks super 1.2 [2/2] [UU]

md1 : active raid1 sda2[0]
      9499648 blocks super 1.2 [2/1] [U_]

unused devices:

Jetzt ist der RAID vom LVM nur noch auf einer Festplatte aktiv und wir können ein neues RAID set erstellen.
Da MDADM erkennt das auf der Partion /dev/sdb2 ein RAID set vorhanden ist, muss  die Option –force benutzt werden, um das zu überschreiben.

Alternatiev kann hier vorher auch noch die RAID Infos entfernt werden.

mdadm –zero-superblock /dev/sda2

Dann das RAID erstellen

mdadm –create –verbose /dev/md2 –level=1 –raid-devices=2 /dev/sdb2 missing –force
mdadm: /dev/sdb2 appears to be part of a raid array:
       level=raid1 devices=2 ctime=Sat May  9 13:18:14 2015
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
mdadm: size set to 9499648K
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md2 started.

Hier muss man noch das erstellen des neuen RAID´s bestätigen.

Jetzt kann man sich das RAID Setup nochmal anzeigen lassen

cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sdb2[0]
      9499648 blocks super 1.2 [1/1] [U_]

md0 : active raid1 sda1[0] sdb1[1]
      975296 blocks super 1.2 [2/2] [UU]

md1 : active raid1 sda2[0]
      9499648 blocks super 1.2 [2/1] [U_]

unused devices: 

Jetzt haben wir ein RAID set md2 das erst mal nur aus einer Festplatte besteht. Das ist auch erst mal nicht weiter schlimm, da wir später die zweite Festplatte hinzufügen werden.

Erstellen der Verschlüsselung auf md2 mit cryptsetup

Jetzt erstellt man mit cryptsetup ein verschlüsseltes Device auf dem dem RAID Device MD2.

cryptsetup -c aes-xts-plain64:sha256 -y -s 512 luksFormat /dev/md2
WARNING!
========
This will overwrite data on /dev/md2 irrevocably.

Are you sure? (Type uppercase yes): YES
Enter passphrase:
Verify passphrase:
Command successful.

Hier wird man nochmal gefragt ob man sich sicher ist und wird dann gebeten zwei mal das Passwort einzugeben.

Anschließend das Verschlüsselte RAID als neues Block Device öffnen.

cryptsetup luksOpen /dev/md2 mdcrypt

Hier wird man gebeten das vorher definierte Passwort einzugeben.

Enter passphrase for /dev/md2:

Um das Verschlüsselte Block Device zu schließen, verwendet man diesen Befehl

cryptsetup luksClose mdcrypt

 

Konfiguration für cryptsetup anpassen.

Wenn diese Einstellung vorgenommen wird, muss man beim Booten dieses Device dann entschlüsseln und das Passwort eingeben. Sonst wird der Boot Prozess nicht vorgesetzt.

nano /etc/crypttab
# < target name > < source device >         < key file >      < options >
mdcrypt         /dev/md2                none            luks

Hier könnte man jetzt auch ein Keyfile angeben aber das würde dann wieder auf dem Server liegen und wäre damit für jeden nutzbar.

MDADM Config file anpassen

Anpassungen an der /etc/mdadm/mdadm.conf vornehmen damit mdadm das neue RAID auch beim Booten erkennt.

mdadm –detail –scan

Die Ausgabe davon in die /etc/mdadm/mdadm.conf schreiben

ARRAY /dev/md/1 metadata=1.2 name=crypt-test:1 UUID=e0f1c504:d9dc0577:36c4a19d:98d9e3e5
ARRAY /dev/md/0 metadata=1.2 name=crypt-test:0 UUID=4ce0c956:ecda2c46:dd44b79e:f088118b
ARRAY /dev/md2 metadata=1.2 name=crypt-test:2 UUID=3b3b79b8:484e1eba:c1ce0893:8f57bed3

 

Dropbear SSH Server Konfigurieren

Jetzt sollte der Dropbear SSH Server Konfiguriert werden, da wir diesen dann benötigen um nach einem Neustart das verschlüsselte Blockdevice  zu entschlüsseln.

Als erstes legen wird eine Config für Dropbear angelegt in /etc/initramfs-tools/conf.d

nano /etc/initramfs-tools/conf.d/dropbear.conf
# Dropbear Laden lassen
DROPBEAR=y

# DEVICE:
# Netzwerk Device angeben eth0 / eth1 ...
#
# Entweder als DHCP
#DEVICE=eth0
#IP=eth1:DHCP

# Oder als feste Konfiguration
DEVICE=eth0
IP=192.168.0.224:::255.255.255.0::eth1:off

WICHTIG: Jetzt das initramfs neu bauen

update-initramfs -u -k all

Dropbear erstellt mehrere Schlüssel bei der Installation, diese findet man in den folgenden Verzeichnissen.
/etc/initramfs-tools/etc/dropbear/
Hier liegt der Hostkey für die Identifikation.
Diesen sollte auf jeden Fall kopiert und beachtet werden.
Wenn sich dieser Key ändern und man Ihn nicht selber geändert hat. Da Verbindet man sich möglicherweise mit einem honeypot.

Außerdem wurde ein RSA Key für die Publik-Key-Authenifizierung erstellt.
/etc/initramfs-tools/root/.ssh/ Hier liegt sowohl der Public Key als auch der Private Key. Der letztere sollte über einen Sicheren Weg kopiert und dann gelöscht werden.

In die /etc/initramfs-tools/root/.ssh/authorized_keys sollte man seinen eigen Key eintragen und den vorhanden von Dropbear ersetzen.

Wenn hier Veränderungen vorgenommen werden muss man den initramfs neu bauen!!

Alternative kann auch ein dpkg-reconfigure dropbear genutzt werden.

dpkg-reconfigure dropbear
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 initramfs-tools (0.120) ...
update-initramfs: Generating /boot/initrd.img-3.16.0-4-amd64

 

Jetzt kann man einen Test machen und dem Server neu starten, anschließend versucht man sich mittels Dropbear zu verbinden.
Dadurch das man in der
Wenn man sich verbinden kann kann man auch gleich das Passwort für den Crypt Container eingeben.

echo -n "PASSWORT" > /lib/cryptsetup/passfifo

 

Das LVM erstellen und Daten verschieben

Als erstes auf das Verschlüsselte Device ein Physical LVM Volumen anlegen.

pvcreate /dev/mapper/mdcrypt
  Physical volume "/dev/mapper/mdcrypt" successfully created

Anschließen erweitert man die bereits bestehende Volume Group um das neu erstellte Physical Volume

vgextend system /dev/mapper/mdcrypt

Jetzt verschiebt man die gesamte Volume group von /dev/md1 nach /dev/mapper/mdcrypt und somit in den Verschlüsselten Bereich.

pvmove /dev/md1 /dev/mapper/mdcrypt

Dies kann je nach Datenmenge etwas dauern.
Ab diesem Zeitpunkt sollte man es tünlichst vermeiden den Server neu zu starten.

Wenn alle Daten verschoben sind, muss man die Volume Group wieder verkleinern damit man das MD1 entfernen kann.

vgreduce system /dev/md1
  Removed "/dev/md1" from volume group "system"

Anschließend lösen wird der RAID komplett aufgelöst.

mdadm –manage /dev/md1 –stop
mdadm: stopped /dev/md1

Jetzt noch die RAID Infos entfernen.

mdadm –zero-superblock /dev/sda2

Und die Disk zu MD2 hinzufügen

mdadm –add /dev/md2 /dev/sda2
mdadm: added /dev/sda2

Jetzt ist zwar das Device dem RAID hinzugefügt worden aber der RAID ist noch nicht stabil.

cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1] sda1[0]
      975296 blocks super 1.2 [2/2] [UU]

md2 : active raid1 sda2[2] sdb2[0]
      9499648 blocks super 1.2 [2/1] [U_]
      [=>...................]  recovery =  6.2% (597312/9499648) finish=2.9min speed=49776K/sec

unused devices:

Jetzt abwarten bis das RAID neu aufgebaut ist.
In der zwischenzeit kann noch die /etc/mdadm/mdadm.conf bearbeitet werden, um das jetzt fehlende RAID Set zu entfernen.

nano /etc/mdadm/mdadm.conf

 

Wenn der RAID wieder Stabil ist.

Kann man den Server neu starten, sich per SSH verbinden und die Festplatte entschlüsseln.

echo -n „PASSWORT“ > /lib/cryptsetup/passfifo

Oder falls man zugriff über eine IPMI Karte hat, kann man auch das Passwort dort eingeben.

Allerdings sollte man hier beachten, das die Daten verschlüsselt übertragen werden. Sonst würde das Crypto Passwort auch wieder keinen Sinn machen.

Crypt1 Crypt2

 

Getagged mit: , , ,
2 Kommentare zu “Linux Root Server nachträglich verschlüsseln
  1. Jan sagt:

    Super Anleitung! Hat bei mir fast auf Anhieb so funktioniert.

  2. Preußner Alexander sagt:

    Danke das freut mich jemanden geholfen zu haben.
    Kannst du mir auch noch sagen was du mit fast auf Anhieb meinst. Gab es ein Problem oder war die Anleitung nicht ganz korrekt.

Schreibe einen Kommentar

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

*