Verschlüsseltes LVM mit RAID
Vor ein paar Tagen ist meine Festplatte kaputtgegangen. Backups habe ich natürlich und im Urlaub kann ich auch einen Tag entbehren, um wieder alles einzurichten. Im Allgemeinen möchte ich so ein Ereignis aber nicht erleben, wenn gerade viel Arbeit ansteht. Deshalb habe ich mich entschlossen, mit der neuen Festplatte ein RAID einzurichten (d.h. genau genommen mit zwei Festplatten). Weil außerdem relativ klar ist, dass ich die Festplatten später in ein NAS migrieren werde und eventuell auch noch mehr Speicherplatz brauchen werde, will ich zudem ein LVM einrichten. Dieses ermöglicht es mir, später weitere Festplatten zu einem logischen Speicher zu vereinigen und somit eine virtuelle Partition zu erstellen, die größer ist als jede Festplatte für sich alleine.
Schauen wir uns die Technologien also der Reihe nach an.
RAID
RAID (Redundant Array of Inexpensive/Independent Disks) ist eine Technologie zur Speicherung von Daten auf mehreren Festplatten. Ziele von RAID sind die Steigerung der Datensicherheit und/oder Performance-Verbesserung. Die üblichsten RAID-Varianten sind RAID-0 (Striping) RAID-1 (Spiegelung) und RAID-5.
Bei RAID-0 werden mehrere Festplatten zu einem großen Festplattenbereich verbunden. Dadurch kann der RAID-Treiber die Schreibvorgänge auf mehrere Festplatten verteilen und somit die Geschwindigkeit beim Schreiben und Lesen theoretisch linear zur Anzahl der Festplatten steigern. Allerdings führt der Ausfall einer einzelnen Festplatte zum Ausfall des gesamten RAID-0-Speichers. Somit erhöht sich die Ausfallwahrscheinlichkeit mit steigender Anzahl an Festplatten.
RAID-1 spiegelt Daten auf zwei Festplatten. Alle Daten werden somit identisch auf beide Festplatten geschrieben und bei Ausfall einer Festplatte kann der Betrieb fortgesetzt werden. Beim Lesen kann der Zugriff eventuell leicht schneller werden, wenn ein Lesezugriff an beide Festplatten gesendet wird und immer das zuerst erhaltene Ergebnis verwendet wird.
RAID-5 bietet im Gegensatz zu RAID-1 die Möglichkeit durch Verbindung von mehr als 2 Festplatten größere nutzbare Speicherbereiche zu erzeugen und bietet trotzdem Sicherheit gegen den Ausfall einer einzelnen Festplatte. Hierzu werden die Daten blockweise auf verschiedene Festplatten verteilt und je Block muss eine Festplatte Paritätsbits zur Datensicherung speichern. Somit ist es mit RAID-5 bereits möglich aus kleineren Festplatten einen größeren Speicherbereich zu erstellen. Allerdings müssen für RAID-5 alle Festplatten die gleiche Größe aufweisen.
LVM
LVM bedeutet Logical Volume Manager und stellt eine Abstraktionsschicht für Festplatten dar. Dazu wird der verfügbare Speicher auf jeder Festplatte in sogenannte Extents aufgeteilt (z.B. von 4MB Größe je Extent), welche dann flexibel an die virtuellen Partitionen zugeteilt werden. Eine virtuelle Partition von 400MB Größe kann nun theoretisch aus 50 Extends von Festplatte 1 und 50 Extents von Festplatte 2 bestehen. Dank Extents muss eine virtuelle Partition nicht mehr wie bei einer konventiellen Paritionieren aus einem sequentiellen Festplattenbereich bestehen.
Generell muss man bei der Arbeit mit LVM drei wichtige Begriffe kennen:
- Physical Volume
- Volume Group
- Logical Volume
Das Physical Volume entspricht dem grundlegenden Speicher, aus dem LVM die
virtuellen Speicherbereiche aufbaut. Dies kann entweder eine komplette
reale Festplatte sein oder eine Partition einer Festplatte oder auch ein
virtueller Speicherbereich unter Linux wie er z.B. von dmcrypt
(Verschlüsselung) oder mdadm
(Software-RAID) erstellt wird. Um ein Physical
Volume mit LVM verwenden zu können, muss man einen LVM-Header darauf schreiben.
Bestehende Daten auf der Festplatte werden dabei unbrauchbar.
In der Volume Group werden die verfügbaren Physical Volumes zu einem großen Speicherbereich zusammengefasst, aus dem man dann Logical Volumes (quasi die Partitionen erzeugen kann). Theoretisch ist es möglich, mehrere Volume Groups zu verwalten, im privaten Bereich wird dies aber in der Regel weniger nützlich sein. Vorstellbar erscheint mir aber, dass es im Firmenumfeld durchaus sinnvoll sein kann, mehrere Volume Groups vorzuhalten, um sicherzustellen, dass bestimmte Daten auf bestimmten Physical Volumes gespeichert werden. Beispielsweise könnte man eine Volume Group erzeugen für Daten auf SSDs und eine für Daten auf rotierenden Festplatten. Oder eine Volume Group für Daten mit RAID und eine ohne RAID.
Aus den Volume Groups erstellt man dann letztlich Logical Volumes, auf die man dann ein Dateisystem spielen kann.
Zur Verschlüsselung mit LVM
muss man sich entscheiden, ob man die Verschlüsselung auf den Physical Volumes
oder auf den Logical Volumes durchführen will (d.h. vor oder nach LVM).
Empfohlen wird hier, die Verschlüsselung vor LVM einzurichten und die /boot
Partition außerhalb vom LVM zu verwalten, damit sie unverschlüsselt bleiben
kann. Letztlich hängt die Entscheidung aber natürlich davon ab, ob man
unverschlüsselte Volumes anlegen will.
LVM kann auch RAID-Funktionalitäten umsetzen, allerdings scheint das Tooling hierzu eventuell etwas limitiert und ich vermute, dass man bei Verwendung von LVM-RAID die Verschlüsselung nicht zwischen RAID und LVM in die Mitte schalten kann.
LVM on dmcrypt on RAID
Mein gewähltes Setup sieht nun so aus, dass ich erst zwei Festplatten zu einem
RAID-1 verbinde. Damit habe ich Ausfallsicherheit auf den Festplatten
hergestellt. Daraus wird mir vom RAID-Manager (mdadm
unter Linux) eine
einzelne Festplatte angezeigt. Diese verschlüssle ich mit dmcrypt
. Die
so verschlüsselte Festplatte füge ich anschließend zu einer Volume Group in
LVM hinzu.
Mit diesem Setup kann ich später meinen Speicherbereich erweitern. Derzeit habe ich noch zwei weitere identische Festplatten aus einem älteren RAID-1-Setup verfügbar. Diese würde ich bei einem Einbau dann wieder mit RAID-1 absichern, die entstehende virtuelle Festplatte verschlüsseln und anschließend zur LVM Volume Group hinzufügen. Damit stünde für LVM dann ein größerer Speicherbereich zur Verfügung, der im Hintergrund verschlüsselt und mit RAID-1 gesichert ist.
Mein Betriebssystem und die /boot
-Partition habe ich auf einer getrennten
SSD außerhalb des LVM-Bereichs.
Um ein RAID-1-Array aus den beiden vorhanden Partitionen zu erstellen,
kann man mit mdadm
arbeiten:
mdadm --create /dev/md0 --level=raid1 --raid-devices=2 /dev/sdb /dev/sdc
Dieser Befehl legt ein RAID-1 auf den beiden Festplatten /dev/sdb
und
/dev/sdc
an und mountet den gemeinsamen Speicher unter /dev/md0
. Die
nachfolgenden Programme können nun also mit /dev/md0
arbeiten. Man kann
das neu erstellte RAID-Array mit mdadm --details /dev/md0
anzeigen.
Dieses Device kann man nun mit cryptsetup
verschlüsseln, welches einem beim
Entschlüsseln der Festplatte wieder ein neues Device unter /dev/mapper/<name>
anlegt. Unter cryptsetup
Versionen 1.6.0 oder neuer wird mit LUKS1 als
Verschlüsselungsmethode aes-xts-plain64
verwendet. Relevant ist noch, ob
man LUKS1 oder LUKS2 verwenden will (LUKS2 ist seit cryptsetup
2.1.0
Standard).
cryptsetup luksFormat --type luks1 --key-size 512 /dev/md0
cryptsetup open /dev/md0 crypt
Nun wird unter /dev/mapper/crypt
das neue Device angezeigt, welches man zum
verschlüsselten Schreiben verwenden kann. Dieses kann nun in LVM verwendet
werden.
Hierzu erstellt man sich zunächst ein Physical Volume auf dem Device. Dabei
schreibt LVM zunächst nur die notwendigen Metadaten in den Speicherbereich.
Anschließend erstellt man eine Volume Group mit diesem Physical Volume.
Die Namenskonvention scheint sich in die Richtung entwickelt zu haben, dass
man den Hostnamen des Hosts mit in den Namen der Volume Group übernimmt,
damit beim Einsatz der Festplatten auf anderen Geräten keine Kollissionen
entstehen. Im privaten Bereich ist dieses Problem vernachlässigbar, allerdings
schadet die Konvention auch nicht. Belässt man die Festplatten dann im anderen
Host, kann man die Volume Group mit vgrename
umbenennen. Zuletzt muss noch
ein Logical Volume in der Volume Group erstellt werden.
pvcreate /dev/mapper/crypt
vgcreate vg-myhost /dev/mapper/crypt
lvcreate -n lv-data -L2TB vg-myhost
# show the newly created logical volume
lvdisplay
Anschließend kann man sich ein Dateisystem im Logical Volume erstellen und es mounten:
mkfs.ext4 /dev/vg-myhost/lv-data
mount /dev/vg-myhost/lv-data /mnt
Integration im bestehenden System
Wie zuvor beschrieben ist bei mir eine Festplatte ausgefallen, was heißt, dass ich das gesamte Setup auf einer Live-CD durchgeführt habe. Dann habe ich die wichtigsten Daten vom Backup auf die neue Festplatte kopiert.
Damit die neue Platte unter Arch richtig geladen wird, musste ich anschließend
noch /etc/mdadm.conf
, /etc/crypttab
und /etc/fstab
anpassen. Den
notwendigen Eintrag für /etc/mdadm.conf
lässt man sich am besten durch
mdadm --detail --scan
ausgeben.
# /etc/mdadm.conf
ARRAY /dev/md0 metadata=1.2 UUID=<uuid of device>
Die crypttab
definiert, wie die verschlüsselte Platte entschlüsselt werden
soll.
# /etc/crypttab
crypt0 /dev/md0 /path/to/keyfile luks
In der fstab
trägt man ein, dass das LVM Logical Volume geladen werden soll.
# /etc/fstab
/dev/vg-myhost/lv-data /home ext4 defaults 0 1