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
[stextbox id=“bash“]apt-get install cryptsetup mdadm lvm2 dropbear busybox[/stextbox]
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.
[stextbox id=“bash“]cryptsetup benchmark[/stextbox]
# 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
[stextbox id=“bash“]mdadm –manage /dev/md1 –fail /dev/sdb2[/stextbox]
mdadm: set /dev/sdb2 faulty in /dev/md1
Die Fehlerhafte Festplatte aus dem RAID nehmen
[stextbox id=“bash“]mdadm –manage /dev/md1 –remove /dev/sdb2[/stextbox]
mdadm: hot removed /dev/sdb2 from /dev/md1
Anzeigen wie es dem RAID geht
[stextbox id=“bash“]cat /proc/mdstat[/stextbox]
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.
[stextbox id=“bash“]mdadm –zero-superblock /dev/sda2[/stextbox]
Dann das RAID erstellen
[stextbox id=“bash“]mdadm –create –verbose /dev/md2 –level=1 –raid-devices=2 /dev/sdb2 missing –force[/stextbox]
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
[stextbox id=“bash“]cat /proc/mdstat[/stextbox]
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.
[stextbox id=“bash“]cryptsetup -c aes-xts-plain64:sha256 -y -s 512 luksFormat /dev/md2[/stextbox]
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.
[stextbox id=“bash“]cryptsetup luksOpen /dev/md2 mdcrypt
[/stextbox]
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
[stextbox id=“bash“]cryptsetup luksClose mdcrypt
[/stextbox]
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.
[stextbox id=“bash“]nano /etc/crypttab[/stextbox]
# < 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.
[stextbox id=“bash“]mdadm –detail –scan[/stextbox]
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
[stextbox id=“bash“]nano /etc/initramfs-tools/conf.d/dropbear.conf[/stextbox]
# 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
[stextbox id=“bash“]update-initramfs -u -k all[/stextbox]
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.
[stextbox id=“bash“]dpkg-reconfigure dropbear[/stextbox]
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.
[stextbox id="bash"]echo -n "PASSWORT" > /lib/cryptsetup/passfifo[/stextbox]
Das LVM erstellen und Daten verschieben
Als erstes auf das Verschlüsselte Device ein Physical LVM Volumen anlegen.
[stextbox id=“bash“]pvcreate /dev/mapper/mdcrypt[/stextbox]
Physical volume "/dev/mapper/mdcrypt" successfully created
Anschließen erweitert man die bereits bestehende Volume Group um das neu erstellte Physical Volume
[stextbox id=“bash“]vgextend system /dev/mapper/mdcrypt[/stextbox]
Jetzt verschiebt man die gesamte Volume group von /dev/md1 nach /dev/mapper/mdcrypt und somit in den Verschlüsselten Bereich.
[stextbox id=“bash“]pvmove /dev/md1 /dev/mapper/mdcrypt[/stextbox]
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.
[stextbox id=“bash“]vgreduce system /dev/md1[/stextbox]
Removed "/dev/md1" from volume group "system"
Anschließend lösen wird der RAID komplett aufgelöst.
[stextbox id=“bash“]mdadm –manage /dev/md1 –stop[/stextbox]
mdadm: stopped /dev/md1
Jetzt noch die RAID Infos entfernen.
[stextbox id=“bash“]mdadm –zero-superblock /dev/sda2[/stextbox]
Und die Disk zu MD2 hinzufügen
[stextbox id=“bash“]mdadm –add /dev/md2 /dev/sda2[/stextbox]
mdadm: added /dev/sda2
Jetzt ist zwar das Device dem RAID hinzugefügt worden aber der RAID ist noch nicht stabil.
[stextbox id=“bash“]cat /proc/mdstat[/stextbox]
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.
[stextbox id=“bash“]nano /etc/mdadm/mdadm.conf[/stextbox]
Wenn der RAID wieder Stabil ist.
Kann man den Server neu starten, sich per SSH verbinden und die Festplatte entschlüsseln.
[stextbox id=“bash“]echo -n „PASSWORT“ > /lib/cryptsetup/passfifo[/stextbox]
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.
Super Anleitung! Hat bei mir fast auf Anhieb so funktioniert.
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.