Verschluesselung: dm-crypt/luks unter openSUSE: Unterschied zwischen den Versionen

Aus Linupedia.org
Wechseln zu: Navigation, Suche
 
K (aes-cbc durch aes-xts ersetzt (http://www.heise.de/security/artikel/Erfolgreicher-Angriff-auf-Linux-Verschluesselung-2072199.html))
 
(14 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
'''[[Konsole]]'''
+
'''[[Security]]'''
  
 
= Verschlüsselung: dm-crypt/luks unter openSUSE =
 
= Verschlüsselung: dm-crypt/luks unter openSUSE =
Verschlüsselung einer '''/home'''- und '''swap'''-Partitionen mit '''cryptsetup''' (mit LUKS-Erweiterung), speichern des Keys auf einem (ebenfalls verschlüsselten) USB-Stick und automatische einbinden während des Bootvorgangs.<br/>
+
 
<br/>
+
Dieser Artikel beschreibt das Verschlüsseln einer '''<code>/home</code>'''-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.<br/>
{{Box Hinweis||Dieser Artikel beschreibt die Einrichtung einer verschlüsselten Partition unter openSUSE.
+
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.<br/>
}}
+
Des Weiteren wird beim Booten eine verschlüsselte '''swap'''-Partitionen angelegt.
 +
 
 +
{{Box Hinweis||Dieser Artikel beschreibt die Einrichtung einer verschlüsselten Partition unter openSUSE, sollte aber mit geringem Aufwand auch auf andere Distribution übertragbar sein.}}
  
 
== Allgemeines ==
 
== Allgemeines ==
 
<br/>
 
  
 
== Voraussetzungen ==
 
== Voraussetzungen ==
  
 
=== Installation von cryptsetup (mit LUKS-Erweiterung) ===
 
=== Installation von cryptsetup (mit LUKS-Erweiterung) ===
<br/>
+
 
Unter openSUSE 10.2 ist das Programm '''cryptsetup''' im Paket
+
Unter openSUSE 10.2 ist das Programm '''<code>cryptsetup</code>''' im Paket '''<code>util-linux-crypt</code>''' enthalten.
util-linux-crypt
+
 
enthalten.<br/><br/>
+
Bis einschließlich SuSE Linux 10.1 gibt es das Paket '''<code>cryptsetup-luks</code>'''
Bis einschließlich SuSE Linux 10.1 gibt es das Paket
+
bei [[YaST-Installationsquellen für SuSE Linux#Packman_.28Die_Multimediaf.C3.A4higkeiten_von_SuSE_Linux_erweitern.29|Packman]].
cryptsetup-luks
 
bei [[YaST-Installationsquellen für SuSE Linux#Packman_.28Die_Multimediaf.C3.A4higkeiten_von_SuSE_Linux_erweitern.29|Packman]].<br/>
 
<br/>
 
  
 
=== Unterstützung von dm-crypt und AES im Kernel ===
 
=== Unterstützung von dm-crypt und AES im Kernel ===
<br/>
 
Um den Device-Mapper '''dm-crypt''' und AES-Verschlüsselung zu nutzen müssen folgende Optionen im Kernel aktiviert sein:
 
<pre>
 
Code maturity level options --->
 
  
  [*] Prompt for development and/or incomplete code/drivers
+
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
  
  Device Drivers --> RAID and LVM Support -->
+
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.
  [*] Multiple devices driver support (RAID and LVM)
 
    <*> Device mapper support
 
    <*> Crypt target support
 
  
  Cryptographic Options -->
 
    <*> AES cipher algorithims (i586)
 
    <*> SHA256 digest algorithm
 
</pre>Diese Optionen sind im SUSE-Standardkernel bereits aktiviert.<br/>
 
Nur wer einen eigenen Kernel verwendet muss diese Optionen berücksichtigen.<br/>
 
<br/>
 
 
Kontrollieren lassen sich diese Einstellungen mit:
 
Kontrollieren lassen sich diese Einstellungen mit:
 +
 
  zcat /proc/config.gz | egrep 'DM_CRYPT|_AES|SHA256|CRYPTO='
 
  zcat /proc/config.gz | egrep 'DM_CRYPT|_AES|SHA256|CRYPTO='
 +
 
oder
 
oder
 +
 
  egrep 'DM_CRYPT|_AES|SHA256|CRYPTO=' /boot/config-*-default
 
  egrep 'DM_CRYPT|_AES|SHA256|CRYPTO=' /boot/config-*-default
{{Box Beispiel|/proc/config.gz|<pre># zcat /proc/config.gz | egrep 'DM_CRYPT|_AES|SHA256|CRYPTO='
 
  
CONFIG_DM_CRYPT=m
+
{{Box Beispiel|/proc/config.gz|
CONFIG_CRYPTO=y
+
# zcat /proc/config.gz | egrep 'DM_CRYPT|_AES|SHA256|CRYPTO='
CONFIG_CRYPTO_SHA256=m
+
CONFIG_CRYPTO_AES=m
+
CONFIG_DM_CRYPT=m
CONFIG_CRYPTO_AES_X86_64=m</pre>
+
CONFIG_CRYPTO=y
 +
CONFIG_CRYPTO_SHA256=m
 +
CONFIG_CRYPTO_AES=m
 +
CONFIG_CRYPTO_AES_X86_64=m
 
}}
 
}}
<br/>
 
  
 
== Einbinden des USB-Sticks ==
 
== Einbinden des USB-Sticks ==
Um den USB-Stick immer über dasselbe Device ansprechen zu können, muss eine entsprechende UDEV-Regel erstellt, werden,<br/>die automatisch einen Symlink auf den Stick (und die jeweiligen Partitionen) anlegt.<br/>
 
<br/>
 
Zuerst ermittelt man die Seriennummer des USB-Sticks<br/>(anhand dieser Nummer kann das Device später eindeutig zugeordnet werden):<br/>
 
udevinfo -a -p `udevinfo -q path -n /dev/<USB-Device>` | grep ATTRS{serial}
 
{{Box Beispiel|USB-Device: /dev/sdc|<pre># udevinfo -a -p `udevinfo -q path -n /dev/sdc` | grep ATTRS{serial}
 
  
ATTRS{serial}=="076A1A939BC2"
+
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.
ATTRS{serial}=="0000:00:02.1"</pre>
+
 
 +
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}"
 +
 
 +
{{Box 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:<br/>
+
Welche Herstellerbezeichnung nun zum USB-Stick gehört ermittelt man mit:
  udevinfo -a -p `udevinfo -q path -n /dev/<USB-Device>` | grep ATTRS{product}
+
 
{{Box Beispiel|USB-Device: /dev/sdc|<pre># udevinfo -a -p `udevinfo -q path -n /dev/sdc` | grep ATTRS{product}
+
  udevinfo -a -p `udevinfo -q path -n /dev/<USB-Device>` | grep "ATTRS{product}"
 +
 
 +
{{Box 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"
  
ATTRS{product}=="USB DISK 28X"
+
In diesem Fall gehört also die erste Seriennummer zum USB-Stick. Also:  
ATTRS{product}=="USB2.0 Hub"
+
 
ATTRS{product}=="EHCI Host Controller"</pre>
+
ATTRS{serial}=="076A1A939BC2"
In diesem Fall gehört also die erste Seriennummer zum USB-Stick.<br/>
 
Also: <pre>ATTRS{serial}=="076A1A939BC2"</pre>
 
 
}}
 
}}
 +
Anschließend eine udev-Regel erstellen. Mit einem beliebigen Editor die Datei <code>/etc/udev/rules.d/01-usb-crypto.rules</code> mit dem Inhalt
  
Anschließend eine UDEV-Regel erstellen:<br/>
+
  # udev-rule for encrypted usb-pen
Mit einem beliebigen Editor die Datei
+
  /etc/udev/rules.d/01-usb-crypto.rules
+
SUBSYSTEMS=="usb", ATTRS{serial}=="<Seriennummer>", KERNEL=="sd*", NAME="%k", SYMLINK+="<Device-Name>%n"
mit dem Inhalt
+
 
<pre># udev-rule for encrypted usb-pen
+
erstellen. Wobei
  
SUBSYSTEMS=="usb", ATTRS{serial}=="<Seriennummer>", KERNEL=="sd*", NAME="%k", SYMLINK+="<Device-Name>%n"</pre>
 
erstellen.<br/><br/>
 
Wobei
 
 
  ATTRS{serial}=="<Seriennummer>"
 
  ATTRS{serial}=="<Seriennummer>"
natürlich durch die Seriennummer des eigenen USB-Sticks ersetzt werden muss<br/>
+
 
und mit
+
natürlich durch die Seriennummer des eigenen USB-Sticks ersetzt werden muss und mit
 +
 
 
  SYMLINK+="<Device-Name>%n"
 
  SYMLINK+="<Device-Name>%n"
festgelegt wird unter welchem Devicenamen der Stick später verwendet wird.<br/><br/>
 
{{Box Beispiel|Seriennummer: 076A1A939BC2, USB-Device: /dev/usbcrypt|<pre># udev-rule for encrypted usb-pen
 
  
 +
festgelegt wird, unter welchem Devicenamen der Stick später verwendet wird.
 +
 +
{{Box Beispiel|Seriennummer: 076A1A939BC2, USB-Device: /dev/usbcrypt|
 +
<pre># udev-rule for encrypted usb-pen
 
SUBSYSTEMS=="usb", ATTRS{serial}=="076A1A939BC2", KERNEL=="sd*", NAME="%k", SYMLINK+="usbcrypt%n"</pre>
 
SUBSYSTEMS=="usb", ATTRS{serial}=="076A1A939BC2", KERNEL=="sd*", NAME="%k", SYMLINK+="usbcrypt%n"</pre>
Der komplette Stick kann in diesem Fall mit
 
<pre>/dev/usbcrypt</pre>
 
die erste Partition mit
 
<pre>/dev/usbcrypt1</pre>
 
die zweite Partition mit
 
<pre>/dev/usbcrypt2</pre>
 
usw. angesprochen werden.}}
 
  
Anschließend die UDEV-Regeln mit
+
Der komplette Stick kann in diesem Fall mit <code>/dev/usbcrypt</code>, die erste Partition mit <code>/dev/usbcrypt1</code>, die zweite Partition mit <code>/dev/usbcrypt2</code>, usw. angesprochen werden.
 +
}}
 +
Anschließend die udev-Regeln mit
 +
 
 
  udevcontrol reload_rules
 
  udevcontrol reload_rules
neu laden und den USB-Stick einstecken.<br/>
 
<br/>
 
  
== USB-Stick partitionieren ==
+
neu laden und den USB-Stick einstecken.
 +
 
 +
Unter <code>/dev</code> sollte dann mindestens (je nachdem wieviele Partitionen auf dem Stick existieren), das Device <code>/dev/usbcrypt</code> auftauchen unter dem der Stick dann - unabhängig von dem echten Device, dass z.B. bei '''<code>fdisk&nbsp;-l</code>''' 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 <u>'''leeren'''</u> USB-Stick zwei neue Partitionen angelegt.<br />
 +
Auf der ersten Partition (50MB) wird später der Schlüssel für die <code>/home</code>-Partition gespeichert - die zweite kann für Daten genutzt werden (unverschlüsselt).
 +
 
 +
{{Box Achtung||Mit der folgenden Eingabe werden alle Daten auf dem Stick gelöscht!}}
 +
{{Box 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 <u>zweite</u> Partition (unverschlüsselte Datenpartition) formatiert:
 +
 
 +
{{Box 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 '''<code>/etc/fstab</code>''' anlegen. Danach noch den den Mountpoint erstellen und die Partition mounten.
 +
 
 +
{{Box Beispiel|Partition '''/dev/usbcrypt2''' einbinden|In der <code>/etc/fstab</code> 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 <code>/home</code>-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 <code>/dev/mapper/</code> sollte nun das Device <code>usbkeys</code> auftauchen. Dieses Device kann nun formatiert werden:
 +
 +
{{Box 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 '''<code>/etc/fstab</code>''' 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).
 +
 +
{{Box Beispiel|Partition '''/dev/mapper/usbkeys''' einbinden|In der <code>/etc/fstab</code> 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 '''<code>dd</code>''' ein entsprechender Key erzeugt werden:
 +
 +
{{Box Beispiel|Schlüssel für die '''/home'''-Partition erstellen|Mit
 +
<pre>dd if=/dev/urandom of=/media/keys/home.key bs=1k count=2</pre>
 +
einen Key erzeugen. Diesen nur für '''root''' lesbar machen:
 +
<pre>chown root:root /media/keys/home.key
 +
chmod 0400 /media/keys/home.key</pre>
 +
}}
 +
Da beim Verschlüsseln einer Partition die vorhandenen Daten gelöscht werden, muss das vorhandene Homeverzeichnis zuvor gesichert werden:
 +
 +
{{Box Achtung||Auf der Sicherungs-Partition muss genügend Platz für das Homeverzeichnis vorhanden sein!
 +
}}
 +
Das Homeverzeichnis mit '''<code>tar</code>''' auf eine andere Partition (in diesem Fall z.B. die root-Partition) sichern:
 +
 +
{{Box Beispiel|Homeverzeichnis mit '''tar''' auf '''/media''' sichern|
 +
tar -cjpvf /media/home.tar.bz2 /home
 +
}}
 +
Anschließend kann die '''<code>/home</code>'''-Partition ausgehängt werden:
 +
 +
umount /home
 +
 +
==== Verschlüsselung ====
 +
 +
Jetzt kann die Partition verschlüsselt werden:
 +
{{Box 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 '''<code>/home</code>'''-Partition '''<code>/dev/hda3</code>''' verschlüsselt:
 +
 +
{{Box Achtung||Mit der folgenden Eingabe werden alle Daten auf der Partition gelöscht!}}
 +
{{Box Beispiel|Verschlüsselung mit Passwort <u>und</u> 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 <code>/dev/mapper</code> sollte nun das Device <code>home</code> auftauchen. Dieses Device kann nun formatiert werden:
 +
 +
{{Box 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 '''<code>/etc/fstab</code>''' anlegen und danach den den Mountpoint erstellen sowie die Partition mounten.
 +
 +
{{Box Beispiel|Partition '''/dev/mapper/home''' einbinden|In der <code>/etc/fstab</code> den "alten" Eintrag für '''<code>/home</code>''' 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" '''<code>/home</code>'''-Partition ins Dateisystem eingebunden wurde, kann das Backup des "alten" Homeverzeichnisses zurückgespielt werden:
 +
 +
{{Box 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 <code>/etc/init.d/boot.cryptdisks</code> speichern.
 +
 +
{{OpenSUSE||[[Bootscript zum Einbinden von dm-crypt/LUKS-Partitionen unter 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 <code>/etc/crypttab</code> 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 <code>/etc/fstab</code> den '''<code>swap</code>'''-Eintrag entfernen (auskommentieren mit "'''<code>#</code>'''"):
 +
 +
{{Box 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 <code>/etc/crypttab</code> 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 <code>/etc/crypttab</code> die Zeile
 +
 +
usbkeys  /dev/usbcrypt1  /media/keys  ext3  aes-xts-essiv:sha256  none  none
 +
 +
hinzufügen.
 +
 +
=== /home-Partition ===
 +
 +
Um die verschlüsselte '''<code>/home</code>'''-Partition beim Systemstart einzubinden: In der <code>/etc/crypttab</code> <u>'''unterhalb'''</u> des Eintrags für den USB-Stick die Zeile
 +
 +
home  /dev/hda3  /home  ext3  aes-xts-essiv:sha256  none  none
 +
 +
hinzufügen.
  
 
== Links ==
 
== Links ==
http://www.saout.de/misc/dm-crypt<br/>
 
http://luks.endorphin.org/dm-crypt<br/>
 
<br/>
 
  
<br/><br/>
+
http://www.saout.de/misc/dm-crypt
[[Konsole|Zurück zu Konsole]]<br />
+
http://luks.endorphin.org/dm-crypt
 +
 
 +
[[Security | Zurück zu Security]]
 +
[[Category:Security]]
 
[[Category:Konsole]]
 
[[Category:Konsole]]

Aktuelle Version vom 11. April 2014, 19:44 Uhr

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