Verschluesselung: dm-crypt/luks unter openSUSE

Aus Linupedia
Wechseln zu: Navigation, Suche

Security

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, das 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.
Des Weiteren 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) 
    <M> Device mapper support
    <M> Crypt target support
Cryptographic Options -->
  <M> Cryptographic API
    <M> AES cipher algorithims oder
    <M> AES cipher algorithims (i586) oder
    <M> AES cipher algorithims (x86_64)
    <M> SHA256 digest algorithm

Diese Optionen sind im SUSE-Standardkernel bereits aktiviert. Nur wer einen eigenen Kernel verwendet, muss diese Optionen berücksichtigen. Für i586 und x86_64 gibt es optimierte Versionen auf Assemblerbasis, es empfiehlt sich diese zu verwenden.

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 


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` 


Welche Herstellerbezeichnung 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` 


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 mit 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
modprobe aes-i586
modprobe aes-x86_64

(Je nachdem, welches AES-Modul zutrifft.)

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-xts-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 read-only 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 remount,rw /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

Mit

dd if=/dev/urandom of=/media/keys/home.key bs=1k count=2

einen Key erzeugen. Diesen nur für root lesbar machen:

chown root:root /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 z.B. 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ätzlicher 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-xts-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
tar -C / -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 root:root /etc/init.d/boot.cryptdisks
chmod a+x /etc/init.d/boot.cryptdisks

und das Script in den Bootprozess einbinden:

chkconfig boot.cryptdisks B

Kontrolle:

chkconfig -l boot.cryptdisks

sollte dann

boot.cryptdisks  0:off  1:off  2:off  3:off  4:off  5:off  6:off  B:on

ausgeben.

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-xts-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-xts-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-xts-essiv:sha256  none  none

hinzufügen.

Links

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

Zurück zu Security