Verschluesselung: dm-crypt/luks unter openSUSE: Unterschied zwischen den Versionen
Gehrke (Diskussion | Beiträge) K (aes-cbc durch aes-xts ersetzt (http://www.heise.de/security/artikel/Erfolgreicher-Angriff-auf-Linux-Verschluesselung-2072199.html)) |
|||
(13 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
− | '''[[ | + | '''[[Security]]''' |
= Verschlüsselung: dm-crypt/luks unter openSUSE = | = Verschlüsselung: dm-crypt/luks unter openSUSE = | ||
− | + | ||
− | <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 == | ||
− | |||
− | |||
== Voraussetzungen == | == Voraussetzungen == | ||
=== Installation von cryptsetup (mit LUKS-Erweiterung) === | === Installation von cryptsetup (mit LUKS-Erweiterung) === | ||
− | + | ||
− | 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. |
− | + | ||
− | + | 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]]. |
− | |||
− | bei [[YaST-Installationsquellen für SuSE Linux#Packman_.28Die_Multimediaf.C3.A4higkeiten_von_SuSE_Linux_erweitern.29|Packman]]. | ||
− | |||
=== Unterstützung von dm-crypt und AES im Kernel === | === 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: | 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 | ||
− | |||
− | 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 | + | CONFIG_CRYPTO=y |
+ | CONFIG_CRYPTO_SHA256=m | ||
+ | CONFIG_CRYPTO_AES=m | ||
+ | CONFIG_CRYPTO_AES_X86_64=m | ||
}} | }} | ||
− | |||
== Einbinden des USB-Sticks == | == Einbinden des USB-Sticks == | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | 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" | + | |
+ | 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 | + | 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| | + | 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" | ||
+ | |||
+ | 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 <code>/etc/udev/rules.d/01-usb-crypto.rules</code> 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>" | ATTRS{serial}=="<Seriennummer>" | ||
− | natürlich durch die Seriennummer des eigenen USB-Sticks ersetzt werden muss | + | |
− | 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. | ||
+ | |||
+ | {{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> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | Anschließend die | + | 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 | ||
− | |||
− | |||
− | Unter | + | neu laden und den USB-Stick einstecken. |
− | + | ||
− | sollte dann mindestens (je nachdem wieviele Partitionen auf dem Stick existieren), das Device | + | 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 -l</code>''' angezeigt wird - angesprochen werden kann. |
− | |||
− | 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 == | == USB-Stick partitionieren/formatieren == | ||
− | Zum Partitionieren bieten sich diverse Programme an: | + | Zum Partitionieren bieten sich diverse Programme an: |
− | Konsole: | + | |
− | + | *Konsole: | |
− | cfdisk | + | **fdisk |
− | sfdisk | + | **cfdisk |
− | parted | + | **sfdisk |
− | GUI: | + | **parted |
− | + | *GUI: | |
− | QtParted | + | **GParted (empfohlen) |
− | Es wird mindestens eine Partition benötigt, auf der später die Schlüssel (Keys) gespeichert werden. | + | **QtParted |
− | 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 /home-Partition gespeichert - die zweite kann für Daten genutzt werden (unverschlüsselt). | + | 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 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 | + | {{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 | |
− | [[ | + | 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
Inhaltsverzeichnis
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 |
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 /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 /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<
Schlüssel hinzufügen: cryptsetup luksAddKey /dev/hda3 /media/keys/home.key
|
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 /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