Verschluesselung: dm-crypt/luks unter openSUSE

Aus Linupedia.org
Wechseln zu: Navigation, Suche

Konsole

Verschlüsselung: dm-crypt/luks unter openSUSE

Dieser Artikel beschreibt das Verschlüsseln einer /home-Partion mit cryptsetup (mit LUKS-Erweiterung) mit einem Key-File,
dass auf einer ebenfalls verschlüsselten Partition auf einem USB-Stick gespeichert ist und während des Bootvorgangs eingebunden wird.
Dabei wird für den USB-Stick ein Passwort abgefragt um eine Partition zu mounten auf der verschiedene Schlüssel liegen,
mit denen weitere Partitionen automatisch eingebunden werden können.
Desweiteren wird beim Booten eine verschlüsselte swap-Partitionen angelegt.

Hinweis:

Dieser Artikel beschreibt die Einrichtung einer verschlüsselten Partition unter openSUSE,
sollte aber mit geringem Aufwand auch auf andere Distribution übertragbar sein.


Allgemeines


Voraussetzungen


Installation von cryptsetup (mit LUKS-Erweiterung)


Unter openSUSE 10.2 ist das Programm cryptsetup im Paket

util-linux-crypt

enthalten.

Bis einschließlich SuSE Linux 10.1 gibt es das Paket

cryptsetup-luks

bei Packman.

Unterstützung von dm-crypt und AES im Kernel


Um den Device-Mapper dm-crypt und AES-Verschlüsselung zu nutzen müssen folgende Optionen im Kernel aktiviert sein:

Code maturity level options --->

  [*] Prompt for development and/or incomplete code/drivers

  Device Drivers --> RAID and LVM Support --> 
  [*] Multiple devices driver support (RAID and LVM) 
    <*> Device mapper support
    <*> Crypt target support

  Cryptographic Options --> 
    <*> AES cipher algorithims (i586)
    <*> SHA256 digest algorithm

Diese Optionen sind im SUSE-Standardkernel bereits aktiviert.

Nur wer einen eigenen Kernel verwendet muss diese Optionen berücksichtigen.

Kontrollieren lassen sich diese Einstellungen mit:

zcat /proc/config.gz | egrep 'DM_CRYPT|_AES|SHA256|CRYPTO='

oder

egrep 'DM_CRYPT|_AES|SHA256|CRYPTO=' /boot/config-*-default
Beispiel: /proc/config.gz
# zcat /proc/config.gz | egrep 'DM_CRYPT|_AES|SHA256|CRYPTO='

CONFIG_DM_CRYPT=m
CONFIG_CRYPTO=y
CONFIG_CRYPTO_SHA256=m
CONFIG_CRYPTO_AES=m
CONFIG_CRYPTO_AES_X86_64=m



Einbinden des USB-Sticks

Um den USB-Stick immer über dasselbe Device ansprechen zu können, muss eine entsprechende UDEV-Regel erstellt, werden,
die automatisch einen Symlink auf den Stick (und die jeweiligen Partitionen) anlegt.

Zuerst ermittelt man die Seriennummer des USB-Sticks
(anhand dieser Nummer kann das Device später eindeutig zugeordnet werden):

udevinfo -a -p `udevinfo -q path -n /dev/<USB-Device>` | grep ATTRS{serial}
Beispiel: USB-Device: /dev/sdc
# udevinfo -a -p `udevinfo -q path -n /dev/sdc` | grep ATTRS{serial}

ATTRS{serial}=="076A1A939BC2"
ATTRS{serial}=="0000:00:02.1"


Welche Seriennummer nun zum USB-Stick gehört ermittelt man mit:

udevinfo -a -p `udevinfo -q path -n /dev/<USB-Device>` | grep ATTRS{product}
Beispiel: USB-Device: /dev/sdc
#  udevinfo -a -p `udevinfo -q path -n /dev/sdc` | grep ATTRS{product}

ATTRS{product}=="USB DISK 28X"
ATTRS{product}=="USB2.0 Hub"
ATTRS{product}=="EHCI Host Controller"

In diesem Fall gehört also die erste Seriennummer zum USB-Stick.

Also:
ATTRS{serial}=="076A1A939BC2"


Anschließend eine UDEV-Regel erstellen:
Mit einem beliebigen Editor die Datei

/etc/udev/rules.d/01-usb-crypto.rules

mit dem Inhalt

# udev-rule for encrypted usb-pen

SUBSYSTEMS=="usb", ATTRS{serial}=="<Seriennummer>", KERNEL=="sd*", NAME="%k", SYMLINK+="<Device-Name>%n"

erstellen.

Wobei

ATTRS{serial}=="<Seriennummer>"

natürlich durch die Seriennummer des eigenen USB-Sticks ersetzt werden muss
und mit

SYMLINK+="<Device-Name>%n"

festgelegt wird unter welchem Devicenamen der Stick später verwendet wird.

Beispiel: Seriennummer: 076A1A939BC2, USB-Device: /dev/usbcrypt
# udev-rule for encrypted usb-pen

SUBSYSTEMS=="usb", ATTRS{serial}=="076A1A939BC2", KERNEL=="sd*", NAME="%k", SYMLINK+="usbcrypt%n"

Der komplette Stick kann in diesem Fall mit

/dev/usbcrypt

die erste Partition mit

/dev/usbcrypt1

die zweite Partition mit

/dev/usbcrypt2

usw. angesprochen werden.


Anschließend die UDEV-Regeln mit

udevcontrol reload_rules

neu laden und den USB-Stick einstecken.

Unter

/dev

sollte dann mindestens (je nachdem wieviele Partitionen auf dem Stick existieren), das Device

/dev/usbcrypt

auftauchen unter dem der Stick dann - unabhängig von dem echten Device, dass z.B. bei fdisk -l angezeigt wird - angesprochen werden kann.

USB-Stick partitionieren/formatieren

Zum Partitionieren bieten sich diverse Programme an:

  • Konsole:
fdisk
cfdisk
sfdisk
parted
  • GUI:
GParted (empfohlen)
QtParted

Es wird mindestens eine Partition benötigt, auf der später die Schlüssel (Keys) gespeichert werden.

Im folgenden Beispiel werden auf einem leeren USB-Stick zwei neue Partitionen angelegt.
Auf der ersten Partition (50MB) wird später der Schlüssel für die /home-Partition gespeichert - die zweite kann für Daten genutzt werden (unverschlüsselt).

Achtung:

Mit der folgenden Eingabe werden alle Daten auf dem Stick gelöscht!


Beispiel: Anlegen von zwei Partitionen auf einem leeren/neuen USB-Stick mitt sfdisk
sfdisk -uM /dev/usbcrypt << "EOF"

0,50,L,+

,,L

EOF


Anschließend wird die zweite Partition (unverschlüsselte Datenpartition) formatiert:

Beispiel: Partition /dev/usbcrypt2 mit dem ext3-Dateisystemformatieren
mkfs.ext3 -L Daten -c /dev/usbcrypt2

tune2fs -m 0 /dev/usbcrypt2

tune2fs -c 0 -i 0 /dev/usbcrypt2

tune2fs -O dir_index /dev/usbcrypt2

tune2fs -o journal_data /dev/usbcrypt2

e2fsck -D /dev/usbcrypt2
Damit werden ein ext3-Dateisystem erzeugt, der für root reservierte Platz auf 0%,
die mount-Option journal_data sowie die Dateisystem-Option dir_index gesetzt
und die automatischen Dateisystemchecks deaktiviert.

Für Einzelheiten zu den Optionen siehe:

man tune2fs

Anschließend wird das Dateisystem noch überprüft.


Für die formatierte Partition noch einen Eintrag in der /etc/fstab anlegen.
Danach noch den den Mountpoint erstellen und die Partition mounten.

Beispiel: Partition /dev/usbcrypt2 einbinden
In der
/etc/fstab

die Zeile

/dev/usbcrypt2             /media/daten      ext3        noauto,noexec,nodev                  0   0

einfügen, den Mountpoint erzeugen

mkdir -p /media/daten

und die Partition einbinden

mount /media/daten



Verschlüsselte Partitionen anlegen


Vorbereitung


Benötigte Module laden:

  • Device-Mapper:
modprobe dm-crypt
  • AES:
modprobe aes


USB-Stick


Zuerst wird die erste Partition auf dem USB-Stick verschlüsselt auf der anschließend der Schlüssel für die /home-Partition gespeichert wird.
Die Partition mit AES verschlüsseln:

cryptsetup -c aes-cbc-essiv:sha256 -y luksFormat /dev/usbcrypt1
  • Mit YES bestätigen.
  • Passwort eingeben.
  • Passwort bestätigen.


Die neu erstellte Partition kann nun geöffnet werden:

cryptsetup luksOpen /dev/usbcrypt1 usbkeys
  • Passwort eingeben.

Die verschlüsselte Partition wurde damit auf usbkeys "gemappt".
Unter

/dev/mapper

sollte nun das Device

usbkeys

auftauchen.

Dieses Device kann nun formatiert werden:

Beispiel: Partition /dev/mapper/usbkeys mit dem ext3-Dateisystemformatieren
mkfs.ext3 -L Keys -c /dev/mapper/usbkeys

tune2fs -m 0 /dev/mapper/usbkeys

tune2fs -c 0 -i 0 /dev/mapper/usbkeys

tune2fs -O dir_index /dev/mapper/usbkeys

tune2fs -o journal_data /dev/mapper/usbkeys

e2fsck -D /dev/mapper/usbkeys
Damit werden ein ext3-Dateisystem erzeugt, der für root reservierte Platz auf 0%,
die mount-Option journal_data sowie die Dateisystem-Option dir_index gesetzt
und die automatischen Dateisystemchecks deaktiviert.

Für Einzelheiten zu den Optionen siehe:

man tune2fs

Anschließend wird das Dateisystem noch überprüft.


Für die formatierte Partition wird noch Eintrag in der /etc/fstab angelegt (sicherheitshalber wird die Partition Standardmäßig nur readonly eingebunden).
Danach noch den den Mountpoint erstellen und die Partition mounten (dabei wird die Partition ausnahmsweise auch schreibbar eingebunden, um anschließend den Schlüssel speichern zu können).

Beispiel: Partition /dev/mapper/usbkeys einbinden
In der
/etc/fstab

die Zeile

/dev/mapper/usbkeys             /media/keys      ext3        ro,noauto,noexec,nodev                  0   0

einfügen, den Mountpoint erzeugen

mkdir -p /media/keys

die Partition einbinden

mount /media/keys

und "beschreibbar" 'remounten

mount -o rw,remount /media/keys



/home-Partition


Vorbereitung


Bevor nun die /home-Partition verschlüsselt wird, muss noch mit dd ein entsprechender Key erzeugt werden:

Beispiel: Schlüssel für die /home-Partition erstellen
In der
dd if=/dev/urandom of=/media/keys/home.key bs=1k count=2

Schlüssel nur für root lesbar machen:

chown 0:0 /media/keys/home.key
chmod 0400 /media/keys/home.key


Da beim Verschlüsseln einer Partition die vorhandenen Daten gelöscht werden, muss das vorhandene Homeverzeichnis zuvor gesichert werden:

Achtung:

Auf der Sicherungs-Partition muss genügend Platz für das Homeverzeichnis vorhanden sein!


Das Homeverzeichnis mit tar auf eine andere Partition (in diesem Fall die root-Partition) sichern:

Beispiel: Homeverzeichnis mit tar auf /media sichern
tar -cjpvf /media/home.tar.bz2 /home


Anschließend kann die /home-Partition ausgehängt werden:

umount /home


Verschlüsselung


Jetzt kann die Partition verschlüsselt werden:

Hinweis:

Um die /home-Partition im Notfall auch ohne Schlüssel mounten zu können wird die Partition zuerst mit einer Passphrase verschlüsselt.
Anschließend wird der Schlüssel als zusätzlich Key hinzugefügt (ein Feature der LUKS-Erweiterung).


Im folgenden Beispiel wird die /home-Partition /dev/hda3 verschlüsselt:

Achtung:

Mit der folgenden Eingabe werden alle Daten auf der Partition gelöscht!


Beispiel: Verschlüsselung mit Passwort und Key-File
Die Partition mit AES verschlüsseln:
cryptsetup -c aes-cbc-essiv:sha256 -y luksFormat /dev/hda3
  • Mit YES bestätigen.
  • Passwort eingeben.
  • Passwort bestätigen.

Schlüssel hinzufügen:

cryptsetup luksAddKey /dev/hda3 /media/keys/home.key
  • Passwort eingeben.
  • Passwort bestätigen.


Die neu erstellte Partition kann nun geöffnet werden:

cryptsetup -d /media/keys/home.key luksOpen /dev/hda3 home

Die verschlüsselte Partition wurde damit auf home "gemappt".
Unter

/dev/mapper

sollte nun das Device

home

auftauchen.

Dieses Device kann nun formatiert werden:

Beispiel: Partition /dev/mapper/home mit dem ext3-Dateisystemformatieren
mkfs.ext3 -L Home -c /dev/mapper/home

tune2fs -c 0 -i 0 /dev/mapper/home

tune2fs -O dir_index /dev/mapper/home

tune2fs -o journal_data /dev/mapper/home

e2fsck -D /dev/mapper/home
Damit werden ein ext3-Dateisystem erzeugt, die mount-Option journal_data sowie die Dateisystem-Option dir_index gesetzt
und die automatischen Dateisystemchecks deaktiviert.

Für Einzelheiten zu den Optionen siehe:

man tune2fs

Anschließend wird das Dateisystem noch überprüft.


Für die formatierte Partition noch den Eintrag in der /etc/fstab anlegen und danach den den Mountpoint erstellen sowie die Partition mounten.

Beispiel: Partition /dev/mapper/home einbinden
In der
/etc/fstab

den "alten" Eintrag für /home von

/dev/hda3             /home      ext3        defaults                  1   2

auf

/dev/mapper/home             /home      ext3        noauto                  0   0

ändern und die Partition einbinden

mount /home



Daten zurückspielen


Wenn die "neue" /home-Partition ins Dateisystem eingebunden wurde, kann das Backup des "alten" Homeverzeichnisses zurückgespielt werden:

Beispiel: Das mit tar gesicherte Homeverzeichnis wieder einspielen
cd /
tar -xjvpf /media/home.tar.bz2



Verschlüsselte Partitionen beim Systemstart einbinden


Vorbereitung


Um die angelegten Partitionen beim Systemstart einzubinden wird ein entsprechendes Bootscript benötigt.
Folgendes Script kopieren und unter

/etc/init.d/boot.cryptdisks

speichern.

openSUSE:


Die Rechte für das Script setzen (ausführbar machen):

chown 0:0 /etc/init.d/boot.cryptdisks
chmod 0700 /etc/init.d/boot.cryptdisks



Anschließend die Datei

/etc/crypttab

mit folgendem Inhalt anlegen:

# /etc/crypttab
# crypttab: Mappings for encrypted partitions
#
# NAME              = name for device-mapper
# SOURCE DEVICE     = encrypted devive
# MOUNTPOINT        = where to mount the encrypted partition
# FILESYSTEM        = filesystem-type of the device
# CIPHER            = encryption method: aes, twofish, ...
# OPTS              = options for the enccryption:
#                     cryptsetup LUKS: hash-length (swap-devices)
#                     cryptsetup: keylength bits
# KEY               = path to keyfile to decrypt partition

# NAME      SOURCE DEVICE           MOUNTPOINT          FILESYSTEM  CIPHER                      OPTS        KEY



swap


Um beim Systemstart eine verschlüsselte swap-Partition anzulegen:

In der

/etc/fstab

den swap-Eintrag entfernen (auskommentieren mit "#"):

Beispiel: swap-Partition /dev/hda1 aus der /etc/fstab entfernen

Den Eintrag

/dev/hda1                                    swap                   swap            defaults                                                0       0

in

#/dev/hda1                                   swap                   swap            defaults                                                0       0

ändern


In der

/etc/crypttab

die Zeile

swap0        /dev/sda2                 swap                    swap        aes-cbc-essiv:sha256        sha256      /dev/urandom

hinzufügen.

USB-Stick


Um die verschlüsselte Partition des USB-Sticks beim Systemstart einzubinden:

In der

/etc/crypttab

die Zeile

usbkeys     /dev/usbcrypt1            /media/keys  ext3        aes-cbc-essiv:sha256        none        none

hinzufügen.

/home-Partition


Um die verschlüsselte /home-Partition beim Systemstart einzubinden:

In der

/etc/crypttab

unterhalb des Eintrags für den USB-Stick die Zeile

home     /dev/hda3            /home  ext3        aes-cbc-essiv:sha256        none        none

hinzufügen.

Links

http://www.saout.de/misc/dm-crypt
http://luks.endorphin.org/dm-crypt



Zurück zu Security