FreeBSD/System verschlüsseln mit geli(8)
Dieser Artikel beschreibt, wie man ein FreeBSD von einem (fast) vollständig geli-verschlüsselten System booten kann, d.h. auch / liegt auf einem geli-device.
Der hier beschriebene Ansatz unterscheidet sich von diesem Artikel grundlegend dadurch, dass der Bootloader und der Kernel nicht auf eiem USB-Stick oder externen Bootmedium abgelegt ist sondern unverschlüsselt auf der Platte liegt.
Zielsetzung
- Das gesamte (benutzte) System soll verschlüsselt werden (Ausnahmen... )
- Auf externe Bootmedien (USB-Stick, Diskette, ... ) soll verzichtet werden
Nebenbedingungen
- der FreeBSD Bootloader liest sowohl die erforderlichen Kernelmodule als auch den Kernel selbst aus <bootdevice>:/boot
- der FreeBSD Bootloader liest außerdem <bootdevice>:/etc/fstab und ermittelt dort das zu mountende Root-Filesystem (wird an den Kernel übergeben)
- der FreeBSD Bootloader kann nur unverschlüsseltes UFS lesen, es kann keine geli-encryption nutzen
- swap soll verschlüsselt sein
- es soll ein unverschlüsseltes dumpdevice existieren (für kernel panics, vmcore), Größe mind. RAM
- es gibt nur eine Festplatte (zB in einem Notebook)
- andere Betriebssysteme (Multiboot) sind hier möglich, aber nicht extra behandelt.
Vorüberlegung
Es werden 2 Bereiche auf der Festplatte benötigt: verschlüsselt und unverschlüsselt.
Die Festplatte (/dev/ad0) wird daher unterteilt in 2 slices: /dev/ad0s1 (unverschlüsselt) und /dev/ad0s2 (verschlüsselt).
Grund-Installation
Zunächst eine einfache Grundinstallation von FreeBSD durchführen, zB von CD, mit sysinstall. Fast wie immer. Wir benötigen hier zunächst keine Packages.
fdisk
- 2 Slices (=Partitionen) mit Typ 165 (=FreeBSD) anlegen
-
- ca 5GB für /dev/ad0s1
- Rest für /dev/ad0s1
- BootLoader in MBR installieren
bsdlabel
- In ad0s1 folgende BSD-Labels anlegen
-
- ca 1GB für /dev/ad0s1a, Filesystem / (das ist das Boot- und Maintenance-System, unverschlüsselt)
- Rest für /dev/ad0s1b, swap (das wird später unser unverschlüsseltes dumpdevice)
Software
- Distributions: Minimal
- keine weiteren Packages
abschließen
- Installation mit Netzwerkonfiguration, Root-Passwort, User, ... abschließen.
- Auf /dev/ad0s1a liegt nun ein bootfähiges und unverschlüsseltes Minimalsystem.
- Auf /dev/ad0s2 ist derzeit nichts abgelegt, es ist aber angelegt. Wichtig ist, dass es während der Grundinstallation angelegt wird, denn wenn das Maintenance-System von /dev/ad0s1a gebootet ist, kann die Partitionstabelle in /dev/ad0 nicht geschrieben werden. Ein Trick würde es zwar erlauben, aber man kann es dann nicht ohne weiteres sehen/benutzen.
- Rebooten.
Verschlüsseltes System einrichten
Vorbereitungen
- Zunächst das soeben installierte Grundsystem booten, einloggen als root. Das sollte ohne Probleme funktionieren. Falls nicht, dann müssen diese Probleme zunächst gefixt werden.
- prüfen, welche ad0-Devices es gibt:
# ls -la /dev/ad0* crw-r----- 1 root operator 0, 86 Jul 26 18:21 /dev/ad0 crw-r----- 1 root operator 0, 87 Jul 26 18:21 /dev/ad0s1 crw-r----- 1 root operator 0, 91 Jul 26 18:21 /dev/ad0s1a crw-r----- 1 root operator 0, 92 Jul 26 18:21 /dev/ad0s1b crw-r----- 1 root operator 0, 93 Jul 26 18:21 /dev/ad0s1c crw-r----- 1 root operator 0, 88 Jul 26 18:21 /dev/ad0s2
- Wichtig ist, dass es /dev/ad0s2 gibt und außerdem keine weiteren /dev/ad0s2*
geli einrichten
Wir legen nun auf /dev/ad0s2 einen geli-Layer. Das "-b" sorgt dafür, dass der Kernel vor dem Mounten von / nach der Passphrase fragt!
# geom init -b /dev/ad0s2
Hier eine nicht zu einfache Passphrase verwenden und gut merken!
- Achtung
- Die Passphrase muss später mit dem US-Tastaturlayout eingetippt werden können, d.h. man sollte hier auf die Umlaute, x und y und Sonderzeichen verzichten, um Konfusion zu vermeiden.
Die folgenden Schritte sind Schritte, die nach dem Erzeugen eines geli-Devices immer erfolgen sollten:
- Das eben erzeugt device attachen (zugänglich machen):
# geli attach /dev/ad0s2
... fragt nach der Passphrase, bei Erfolg entsteht ein *.eli-Device
- prüfen:
# ls -la /dev/ad0s2.eli crw-r----- 1 root operator 0, 94 Jul 26 18:21 /dev/ad0s2.eli
- einmal komplett mit /dev/random überschreiben:
# dd if=/dev/random of=/dev/ad0s2.eli bs=1m
das kann je nach CPU und Größe des Devices lange bis sehr lange dauern.
- Tipp
- dd gibt durch Drücken von ^T (Strg+T) ein Zwischenergebnis aus, d.h. bisherige Menge und Geschwindigkeit
- Wenn das durch ist, kann das geli-slice /dev/ad0s2.eli sicher verwendet werden. Zu Demo-Zwecken kann man auf den Schritt mit /dev/random auch verzichten.
bsdlabel auf ad0s2.eli einrichten
Hier muss ein bsdlabel angelegt werden. Normalerweise könnte man das mit Hilfe von sysinstall oder sade erledigen, diese (er)kennen allerdings nicht das *.eli-Device. Deswegen muss man das bsdlabel hier ausnahmsweise von Hand erzeugen. Wer sich das schonmal angeschaut hat, wird hiervor vermutlich zurückschrecken, aber so schlimm ist das garnicht. Man braucht nichtmal einen Taschenrechner oder Papier+Bleistift!
- ein standard-Label schreiben:
# bsdlabel -e /dev/ad0s2.eli
- das Standard-Label ansehen (hier nur eine nachempfundene Ausgabe):
# bsdlabel /dev/ad0s2.eli # /dev/ad0s2.eli: 8 partitions: # size offset fstype [fsize bsize bps/cpg] a: 68459374 16 4.2BSD 2048 16384 28552 c: 68459390 0 unused 0 0 # "raw" part, don't edit
Es existiert hier nur ein "a:"-Label. Wir wollen allerdings mindestens noch swap und vielleicht auch verschiedene Filesysteme verwenden, deswegen der folgende Schritt
- bsdlabel exportieren
# bsdlabel /dev/ad0s2.eli > /tmp/bsdlabel_ad0s2.eli
- bearbeiten:
ad0s2.elic ist hier 33427 MB oder 32.6 GB groß. Folgende Größen sollen angelegt werden:
- ad0s2.elia / 2GB
- ad0s2.elib swap 2GB
- ad0s2.elid /usr 25GB
- ad0s2.elie /var (Rest, ca 3.5GB)
# vi /tmp/bsdlabel_ad0s2.eli # /dev/ad0s2.eli: 8 partitions: # size offset fstype [fsize bsize bps/cpg] a: 2G 16 4.2BSD b: 2G * swap c: 68459390 0 unused 0 0 # "raw" part, don't edit d: 25G * 4.2BSD e: * * 4.2BSD
- bsdlabel schreiben:
# bsdlabel -R /tmp/bsdlabel_ad0s2.eli
bsdlabel erreichnet die richtigen Größen für size und offset.
Die beiden Schritte ließen sich auch zu "bsdlabel -e" zusammenführen, hier geht allerdings dann die Datei verloren (falls man es modifiziert neu versuchen will).
- Ergebnis ansehen:
# bsdlabel /dev/ad0s2.eli # /dev/ad0s2.eli: 8 partitions: # size offset fstype [fsize bsize bps/cpg] a: 4194304 16 4.2BSD 2048 16384 28552 b: 4194304 4194320 swap c: 68459390 0 unused 0 0 # "raw" part, don't edit d: 52428800 8388624 4.2BSD 2048 16384 28552 e: 7641966 60817424 4.2BSD 2048 16384 28552
Filesysteme einrichten
- Wir sollten jetzt das folgende haben:
# ls -la /dev/ad0s2.eli* crw-r----- 1 root operator 0, 94 Jul 26 18:21 /dev/ad0s2.eli crw-r----- 1 root operator 0, 96 Jul 26 18:21 /dev/ad0s2.elia crw-r----- 1 root operator 0, 97 Jul 26 18:21 /dev/ad0s2.elib crw-r----- 1 root operator 0, 98 Jul 26 18:21 /dev/ad0s2.elic crw-r----- 1 root operator 0, 99 Jul 26 18:21 /dev/ad0s2.elid crw-r----- 1 root operator 0, 100 Jul 26 18:21 /dev/ad0s2.elie
- formatieren:
... mit UFS-Labels, die später verwendet werden (können)
# newfs -L ROOT /dev/ad0s2.elia [...] # newfs -L USR -U /dev/ad0s2.elid [...] # newfs -L VAR -U /dev/ad0s2.elie [...]
- mounten unter /geli/
# mkdir /geli # mount /dev/ufs/ROOT /geli # mkdir /geli/usr /geli/var # mount /dev/ufs/USR /geli/usr # mount /dev/ufs/VAR /geli/var
Basissystem clonen
Ziel ist es, das installierte Basissystem auf die (neuen) Filesysteme zu kopieren. Ich bevorzuge hierfür "cpdup".
- kopieren mit cpdup:
# pkg_add -r -v cpdup # /usr/local/bin/cpdup -v / /geli [...] # /usr/local/bin/cpdup -v /var /geli/var [...] # /usr/local/bin/cpdup -v /usr /geli/usr [...]
Weblinks
- System verschlüsseln mit geli(8) bei bsdwiki.de, verfolgt den Ansatz, dass die ganze Platte verschlüsselt wird und ersatzweise von einem USB-Stick gebootet wird.