Crypto-FS mit dm_crypt

TableOfContents(2)

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:

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:

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:



# 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-aes

Jetzt noch einen Softlink im Runlevel erzeugen: cd /etc/rcS.d ln -s /etc/init.d/setupcryptdisk.sh S28setupcryptdisk

Fertig!

CryptoFsMitDmcrypt (last edited 2007-12-14 14:32:09 by McAldo)