Crypto-FS mit dm_crypt
Vorwort
Ich will in diesem kleinen How-To erklären, wie man ein Crypto FS einrichtet, dass bei Systemstart gemountet wird. Dazu wird dm-crypt verwendet. Als System setze ich mindestens Sarge voraus.
Vorbereitungen
Als erstes installieren wir ein paar benötigte Programme:
apt-get install cryptsetup hashalot dmsetup libdevmapper1.01 libgcrypt11-dev libcppopt-dev
Dann installieren wir uns einen Kernel (2.6.7 oder höher) bei dem wir darauf achten, dass folgende Einstellungen gemacht sind:
Code maturity level options ---> <*> Prompt for development and/or incomplete code/drivers
General setup ---> <*> Support for hot-pluggable devices
Device Drivers > *Multi-device support (RAID and LVM).
<M> Device mapper support
<M> Crypt target support
Cryptographic options ---> <M> AES cipher algorithms (Wie man einen Kernel konfiguiert und installiert ist unter DebianizedLinuxKernel gut beschrieben.)
Alternativ kann man sich auch ein fertiges Kernel-Image installieren: apt-get install kernel-image-2.6.7-1-386
Nach einem reboot laden wir die benötigten Module:
modprobe aes modprobe dm-crypt modprobe dm-mod
Und kontrollieren ob der Device Mapper richtig läuft:
ls -L /dev/mapper/control
sollte
/dev/mapper/control
ausgeben.
Dann kontrollieren wir ob AES jetzt auch wirklich unterstützt wird:
cat /proc/crypto
sollte
name : aes module : aes type : cipher blocksize : 16 min keysize : 16 max keysize : 32
ausgeben.
So jetzt testen wir noch schnell ob dmsetup auch ordnungsgemäß installiert wurde:
dmsetup targets
sollte
crypt v1.0.0 striped v1.0.1 linear v1.0.1 error v1.0.1
ausgeben.
Verschlüsselte Partition erstellen
Ich verwende als verschlüsselte Partition hda6, dies muss natürlich angepasst werden. Die Partition darf nicht gemountet sein für die nachfolgenden Befehle. ACHTUNG: Alle Daten auf dieser Partition gehen verloren!
Zuerst füllen wir unsere Partition mit Zufallsdaten: (je nach Partitionsgröße kann dies ein paar Stunden dauern)
dd if=/dev/urandom of=/dev/hda6 bs=10240
Nun erzeugen wir ein Crypt-Device-Mapper:
cryptsetup -y create name /dev/hda6
"name" sollte ein kurzer, schlüssiger Name sein. (z.B: crypt, home, data oä.)
Standardmäßig wird eine 256 Bit AES-Verschlüsslung gewählt, bei Bedarf kann man dies anpassen indem man statt des obrigen Befehls folgenden verwendet:
cryptsetup -yc aes -s 256 create name /dev/hda6
Oder analog auch als Keyfile:
cryptsetup -d name.key -s 256 create name /dev/hda6
Dann wird man nach einem Passwort gefragt, welches man zweimal eingeben muss. Man sollte bei der Auswahl eines Passworts bedenken, dass die beste Verschlüsslung nur so sicher ist wie das Passwort.
Falls ein Keyfile erstellt wurde noch ein:
chmod 600 name.key
Hinweis:
Wird die verschlüsselte Platte in einen anderen Rechner eingebaut kann man sie mit obigen Befehlen wieder einbinden (dabei muss der Gerätename -hier:/dev/hda6 - unter Umständen angepasst werden! dmesg | grep hd sollte die hierfür notwendigen Daten liefern). Wichtig: Ein Dateisystem darf danach nicht erstellt werden, da sonst sämtliche Daten gelöscht werden!
Wenn alles geklappt hat sollte:
dmsetup ls
name (254, 0)
ausgeben.
Jetzt erstellen wir ein Dateisystem auf der verschlüsselten Partition:
mkfs.ext3 /dev/mapper/name
Und mounten dies nun:
mkdir /mnt/name mount /dev/mapper/name /mnt/name
So, das verschlüsselte Dateisystem wäre damit geschafft.
Das System einrichten
Da wir das ganze natürlich permanent haben möchten müssen jetzt noch ein paar Einstellungen gemacht werden:
In /etc/crypttab fügen wir folgendes ein:
name /dev/hda6
bzw. mit Keyfile
name `/dev/hda6` /pfad/zum/keyfile
In /etc/fstab kommt das hier rein:
/dev/mapper/name /mnt/name ext3 defaults,user 0 2
Ausserdem müssen wir noch die module in /etc/modules eintragen:
aes dm-crypt dm-mod
So, das wärs eigentlich. Bei Systemstart wird jetzt nach dem Passwort gefragt, und das Dateisystem gemounted.
Swap einrichten
Als nächstes modifizieren wir die bestehende Swap-Partition, damit ein Angreifer nicht einfach nur einen Blick in die Swap werfen muss, um unsere ganze Verschlüsslung zu umgehen.
Bei mir ist die Swap-Partition hda2, dies muss natürlich angepasst werden.
Als erstes editieren wir die Datei /etc/init.d/mountall.sh. Wir fügen vor
swapon -a 2> /dev/null
folgenden Code ein (aber der Version 2.86.ds1-6 von initscripts wurde dieser Befehl ersetzt. Man muss den Code vor
swapon -a -e
einfügen):
dmsetup remove_all echo 0 `blockdev --getsize /dev/hda2` crypt blowfish `dd if=/dev/urandom count=8 bs=1 2> /dev/null | md5sum -- | head -c 16` 0 /dev/hda2 0 | dmsetup create swap0 mkswap /dev/mapper/swap0 swapon /dev/mapper/swap0
Als letztes kommentieren wir noch die Zeile
/dev/hda2 none swap sw 0 0
aus /etc/fstab aus, indem wir ein # vor die Zeile setzen Nach einem Reboot sollte uns jetzt eine verschlüsselte Swap-Partition zur Verfügung stehen.
alternative mit etch (testing)
Es reicht in /etc/crypttab folgendes einzufügen:
swap /dev/hda2 /dev/urandom swap
Als letztes ändern wir noch die Zeile
/dev/hda2 none swap sw 0 0
in in /etc/fstab in
/dev/mapper/swap none swap sw 0 0
/tmp verschlüsseln
In /tmp landen zeitweise auch recht viele Benutzerdaten, daher sollte es auch verschlüsselt werden. Entweder man legt auf dem oben beschriebenem Weg eine verschlüsselte Partition für /tmp an, oder verlegt '/tmp' auf eine bereits existierende verschlüsselte Partition. Ich werde nur letzteres beschreiben, da eine verschlüsselte /tmp Partition genauso anzulegen ist wie eine normale.
Als erstes erstellen wir einen Ordner der auf einer verschlüsselten Partition liegt, in dem später /tmp landet. Bei mir ist das /home/.tmp also:
mkdir /home/.tmp
Dann editieren wir die Datei /etc/fstab und legen folgende Zeile an:
/home/.tmp /tmp none bind,user,auto 0 0
Diese mountet den Ordner /home/.tmp auf /tmp. Als nächstes starten wir den Rechner neu, und evtl. müssen wir die Rechte von /tmp mit
chmod a+w /tmp
anpassen, damit auch normale Benutzer auf /tmp schreiben können.
Damit wären wir fertig, und können jetzt Stolz darauf sein eine Partition zu haben, an deren Inhalt auch das BSI in absehbarer Zeit nicht drankommen wird.
Die grundlegenden Techniken für dieses How-To habe ich von den Seiten http://www.saout.de/tikiwiki/tiki-index.php?page=HOWTO und http://www.saout.de/tikiwiki/tiki-index.php?page=EncryptedSwap übersetzt und leicht modifiziert. Solltest du Fehler in diesem How-To finden klick einfach auf "Seite editieren" oder wende dich im Forum an [:Incom:]
Alternativer Weg
(bitte bearbeiten!)
Anlegen von verschlüsselten Partitionen mit
dmsetup / cryptsetup
Dmsetup ist ein neues Verfahren (gegenüber cryptoloop), um verschlüsselte Partitionen oder loop-Devices anzulegen. Dieses ist fester Bestandteil des Kernels seit Version 2.6.4. Theoretisch ist es auch möglich das komplette Root-fs zu verschlüsseln, allerdings wird dazu momentan ein Kernel-Patch benötigt und eine separate Partition für '/boot' ist erforderlich. Die verwendeten Verschlüsselungsalgorithmen sind die gleichen, die auch in kommerziellen Produkten wie "Safeguard Easy" verwendet werden. Allerdings sind mit dem gezeigten Verfahren nicht mehrere Benutzer einrichtbar.
Beispielhaft wird das Verfahren mit cryptsetup gezeigt, das ein vereinfachtes Skript für dmsetup darstellt. Im Beispiel werden /home, /tmp und /swap verschlüsselt, normalerweise die einzigen Plätze, in denen sich Benutzerdaten befinden. Die Pfade und Gerätedateien müssen an das jeweilige System angepasst werden. Daten vorher sichern! Im Beispiel ist hda1 die root-Partition, hda2 die Crypto-Partition für Benutzerdaten und hda3 die verschlüsselte Swap-Partition.
Voraussetzungen:
- Kernel ab Version 2.6.4
- eine Partition für die Verzeichnisse /home und /tmp, eigene Partition für swap (sollte Standard sein)
- dmsetup, cryptsetup
- cryptomodule im Kernel (z. B. aes) müssen geladen sein!
Einrichtung: Partitionen aushängen: swapoff -a
/home & /tmp : cryptsetup -y -c aes -s 256 create hda2-aes /dev/hda2 swap : cryptsetup -d /dev/urandom create hda3-aes /dev/hda3
Bei /home und /tmp wird eine Kennwortabfrage verlangt. Swap wird bei jedem Bootvorgang per Zufallsschlüssel neu initialisiert. Der Schlüssel ist nur während einer Sitzung gültig. Es existieren jetzt spezielle "Device-Mapper"(/dev/mapper/*), über die ein de-/chiffrieren der Partitionen möglich wird.
Die Crypto-Partitionen formatieren: mke2fs -j /dev/mapper/hda2-aes mkswap /dev/mapper/hda3-aes
Man kann die Partition aber auch "on-the-fly" verschluesseln (ohne vorher zu formatieren)
Verschlüsseln der Daten (Vorsicht!): /home & /tmp : dd if=/dev/hda2 of=/dev/mapper/hda2-aes
Einbinden der Crypto-Partitionen: mount /dev/mapper/hda2-aes /home swapon /dev/mapper/hda3-aes
Damit sollten alle Daten, die ein Benutzer mit seinen Rechten erzeugen kann, verschlüsselt werden. Normalerweise müsste nach dem Booten jedesmal der "cryptsetup"-Befehl aufgerufen werden. Folgendes Skript im init-Verzeichnis (z. B. /etc/init.d) unter setupcryptdisk.sh ablegen und die Rechte den anderen Skripten angleichen:
- Skriptbeispiel S28setupcryptdisk.sh
# Mount Crypto-Partitions at boottime
i=5
cryptmount ()
{
clear
echo "Authentification for crypto partitions necessary"
dmsetup remove_all
cryptsetup -c aes -s 256 create hda2-aes /dev/hda2
mount -t ext3 /dev/mapper/hda2-aes /home
}
cryptmount
while [ $? -gt 0 ]; do
clear
echo "Falsches Kennwort, neuer Versuch nach $i s!"
sleep $i
i=$[$i*2]
cryptmount
done
cryptsetup -d /dev/urandom create hda3-aes /dev/hda3
mkswap /dev/mapper/hda3-aesJetzt noch einen Softlink im Runlevel erzeugen: cd /etc/rcS.d ln -s /etc/init.d/setupcryptdisk.sh S28setupcryptdisk
Fertig!