verschluesselung_mit_cryptsetup
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| verschluesselung_mit_cryptsetup [2020-08-15 21:55:39] – manfred | verschluesselung_mit_cryptsetup [2022-11-21 10:41:38] (aktuell) – [mit Passwort mappen] manfred | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== Verschlüsselung mit CryptSetup ====== | ||
| + | |||
| + | Die Stärke der Sicherheit der drei besten Cipher/ | ||
| + | - **serpent** //(der sicherste in '' | ||
| + | - **twofish** //(der sicherste in '' | ||
| + | - **blowfish** //(der sicherste in '' | ||
| + | |||
| + | * -> verschlüsseln von ganzen Volumen (Festplatten bzw. Images) | ||
| + | |||
| + | |||
| + | === Lister der nutzbaren Verschlüsselungsalgorithmen (ciphers) === | ||
| + | |||
| + | < | ||
| + | # cryptsetup --help | tail -n 8 | ||
| + | Vorgabe für die Durchlaufzeit für PBKDF2 mit LUKS: 2000 Millisekunden | ||
| + | Vorgabe für PBKDF für LUKS2: argon2i | ||
| + | Iterationszeit: | ||
| + | |||
| + | Standard-Verschlüsselungsparameter: | ||
| + | Loop-AES: aes, Schlüssel 256 Bits | ||
| + | plain: aes-cbc-essiv: | ||
| + | LUKS1: aes-xts-plain64, | ||
| + | </ | ||
| + | |||
| + | > cat / | ||
| + | aes | ||
| + | cipher_null | ||
| + | compress_null | ||
| + | crc32 | ||
| + | crc32c | ||
| + | crct10dif | ||
| + | deflate | ||
| + | dh | ||
| + | digest_null | ||
| + | ghash | ||
| + | jitterentropy_rng | ||
| + | lzo | ||
| + | lzo-rle | ||
| + | md5 | ||
| + | rsa | ||
| + | serpent | ||
| + | sha1 | ||
| + | sha224 | ||
| + | sha256 | ||
| + | sha384 | ||
| + | sha512 | ||
| + | stdrng | ||
| + | twofish | ||
| + | zlib-deflate | ||
| + | | ||
| + | > cryptsetup benchmark --cipher serpent | ||
| + | # Die Tests sind nur annähernd genau, da sie nicht auf den Datenträger zugreifen. | ||
| + | # | ||
| + | serpent-cbc | ||
| + | |||
| + | < | ||
| + | # cryptsetup benchmark | ||
| + | # Die Tests sind nur annähernd genau, da sie nicht auf den Datenträger zugreifen. | ||
| + | PBKDF2-sha1 | ||
| + | PBKDF2-sha256 | ||
| + | PBKDF2-sha512 | ||
| + | PBKDF2-ripemd160 | ||
| + | PBKDF2-whirlpool | ||
| + | argon2i | ||
| + | argon2id | ||
| + | # | ||
| + | aes-cbc | ||
| + | serpent-cbc | ||
| + | twofish-cbc | ||
| + | aes-cbc | ||
| + | serpent-cbc | ||
| + | twofish-cbc | ||
| + | aes-xts | ||
| + | serpent-xts | ||
| + | twofish-xts | ||
| + | aes-xts | ||
| + | serpent-xts | ||
| + | twofish-xts | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Grundlagen der CryptSetup-Verschlüsselung mit LUKS (allgemein) ===== | ||
| + | |||
| + | Als erstes sollte man // | ||
| + | > aptitude -y install cryptsetup | ||
| + | |||
| + | Mit CryptSetup kann man symetrisch verschlüsseln: | ||
| + | * zum einen __mit einem Kryptografischen Schlüssel__ (einer Schlüsseldatei, | ||
| + | * zum anderen direkt __mit einem Passwort/ | ||
| + | |||
| + | |||
| + | ==== allgemeine Vorbereitungen ==== | ||
| + | |||
| + | Image-Datei anlegen | ||
| + | < | ||
| + | ### hier wird ein 700MB großes Image erstellt; | ||
| + | ### mit diesem Aufruf wird eine 700 MB große Datei angelegt: | ||
| + | > dd if=/ | ||
| + | |||
| + | ### mit diesem Aufruf ('' | ||
| + | > dd if=/ | ||
| + | |||
| + | ### mit diesem Aufruf ('' | ||
| + | > touch daten.img && shred -v -n1 -s700M daten.img | ||
| + | </ | ||
| + | |||
| + | Image-Datei an eine LOOP-Gerätedatei binden | ||
| + | < | ||
| + | ### nächstes freie LOOP-Gerät für die weiteren Schritte ermitteln (hier soll es das "/ | ||
| + | > / | ||
| + | /dev/loop0 | ||
| + | |||
| + | ### Damit wir das gerade erstellte Image auch beschreiben können, muss dafür eine // | ||
| + | > / | ||
| + | |||
| + | ### nachsehen, welche Gerätedatei für die Image-Datei verwendet wurde (hier ist es ''/ | ||
| + | > / | ||
| + | NAME | ||
| + | / | ||
| + | |||
| + | > / | ||
| + | /dev/loop0: [2050]: | ||
| + | </ | ||
| + | |||
| + | Wichtig ist auch zu wissen, dass der Algorithmus nicht das alleinige Sicherheitsmerkmal hierbei ist! | ||
| + | Die Verschlüsselungssoftware, | ||
| + | Solche Produkte gibt es auch unter Linux auch! | ||
| + | |||
| + | |||
| + | ==== Vorbereitungen für eine symetrische Verschlüsselung mit Schlüsseldatei ==== | ||
| + | |||
| + | |||
| + | === mit Schlüsseldatei initialisieren === | ||
| + | |||
| + | __Dieser Forgang zerstört alle Daten auf der Image-Datei, | ||
| + | |||
| + | 4096 Zufallswerte als Crypt-Schlüssel erzeugen und in der Schlüsseldatei speichern: | ||
| + | > touch crypt.key | ||
| + | > chmod 0600 crypt.key | ||
| + | > head -c 100000 / | ||
| + | > wc crypt.key | ||
| + | | ||
| + | |||
| + | __Diese Datei ist **DER** Schlüssel! | ||
| + | Diese Datei muss auf jeden Fall sicher aufbewart werden und darf niemals in fremde Hände geraten! | ||
| + | Sie muss genauso sicher aufbewart werden wie ein Passwort!__ | ||
| + | |||
| + | Verschlüsselungsalgorithmus auswählen (" | ||
| + | |||
| + | **__2010__** | ||
| + | > / | ||
| + | > / | ||
| + | > / | ||
| + | |||
| + | **__2020__** | ||
| + | > / | ||
| + | > / | ||
| + | > / | ||
| + | |||
| + | |||
| + | === mit Schlüsseldatei mappen === | ||
| + | |||
| + | < | ||
| + | ### verschlüsselte Image-Datei auf die LUKS-Gerätedatei legen => / | ||
| + | > / | ||
| + | |||
| + | cryptsetup status cryptoluks | ||
| + | / | ||
| + | cipher: | ||
| + | keysize: 256 bits | ||
| + | device: | ||
| + | offset: | ||
| + | size: 1431544 sectors | ||
| + | mode: read/write | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Vorbereitungen für eine symetrische Verschlüsselung mit Passwort/ | ||
| + | |||
| + | |||
| + | === mit Passwort initialisieren === | ||
| + | |||
| + | __Dieser Forgang zerstört alle Daten auf der Image-Datei, | ||
| + | |||
| + | < | ||
| + | ### Verschlüsselungsalgorithmus auswählen (" | ||
| + | |||
| + | ### 2010 | ||
| + | > / | ||
| + | > / | ||
| + | > / | ||
| + | |||
| + | ### 2020 | ||
| + | > / | ||
| + | > / | ||
| + | > / | ||
| + | </ | ||
| + | |||
| + | |||
| + | === mit Passwort mappen === | ||
| + | |||
| + | < | ||
| + | ### verschlüsselte Image-Datei auf die LUKS-Gerätedatei legen => / | ||
| + | > / | ||
| + | |||
| + | > ls -lha / | ||
| + | insgesamt 0 | ||
| + | drwxr-xr-x | ||
| + | drwxr-xr-x 21 root root 4,8K Nov 21 11:14 .. | ||
| + | crw------- | ||
| + | lrwxrwxrwx | ||
| + | |||
| + | > cryptsetup status cryptoluks | ||
| + | / | ||
| + | type: LUKS2 | ||
| + | cipher: | ||
| + | keysize: 512 bits | ||
| + | key location: keyring | ||
| + | device: | ||
| + | loop: /dev/sda1 | ||
| + | sector size: 512 | ||
| + | offset: | ||
| + | size: 1953488896 sectors | ||
| + | mode: read/write | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Ein Dateisystem auf dem verschlüsselten Volumen anlegen (formatieren) ===== | ||
| + | |||
| + | __Dieser Forgang zerstört alle Daten auf der Image-Datei, | ||
| + | |||
| + | Um auf das Image Daten rauf schreiben zu können, fehlt noch ein Dateisystem. Das werden wir im folgenden Schritt auf das verschlüsselte Image schreiben. | ||
| + | |||
| + | Welches Dateisystem ist jetzt das geeignetste? | ||
| + | Nun folgende sind recht bekannt: | ||
| + | - [[ext2]] - kann mit einem Zusatztreiber auch von anderen Betriebssystemen gelesen werden als Linux | ||
| + | - [[ext3]] - ist praktisch ein '' | ||
| + | - [[ext4]] - ist ein verbessertes '' | ||
| + | - [[ReiserFS]] - ein sehr schnelles Dateisystem, | ||
| + | - [[XFS]] - ein sehr schnelles Dateisystem, | ||
| + | - [[JFS]] - ein Journal-Dateisystem, | ||
| + | - [[ZFS]] - ein sehr schnelles und sicheres Dateisystem, | ||
| + | |||
| + | Als Dateisystem verwende ich meistens //JFS// oder //ZFS//, je nach Partitionsgröße und Verwendungszweck. | ||
| + | In diesem Fall ist **JFS** die bessere Wahl, weil es einfach übersichtlicher ist. | ||
| + | Ich verwende es unter Linux gerne, weil es dynamische Inodes hat (es können einem nie die Inodes aus gehen und ungenutzet Inodes belegen keinen Speicherplatz) und der '' | ||
| + | |||
| + | Dazu muss es natürlich erstmal installiert werden, auf Ubuntu-Linux geht das wie folgt: | ||
| + | > aptitude -y install jfsutils | ||
| + | |||
| + | JFS auf dem verschlüsselten Volumen anlegen: | ||
| + | > mkfs -t jfs / | ||
| + | |||
| + | ggf. will man aber auch das aktuelle Linux-Standard-Dateisystem auf dem verschlüsselten Volumen anlegen, das geht dann so: | ||
| + | > mkfs -t ext4 -m 0 -L Sphinx / | ||
| + | |||
| + | |||
| + | ===== Mount ===== | ||
| + | |||
| + | Man sollte sich angewöhnen, | ||
| + | Denn man weiß ja nie, ob es beim " | ||
| + | |||
| + | Dateisystem prüfen und ggf. reparieren | ||
| + | > fsck -y / | ||
| + | |||
| + | Dateisystem mounten: | ||
| + | > mount / | ||
| + | |||
| + | |||
| + | ===== UMount ===== | ||
| + | |||
| + | > umount /mnt | ||
| + | > / | ||
| + | > / | ||
| + | /dev/loop0 ... | ||
| + | > / | ||
| + | |||
| + | |||
| + | ===== Beispielskript zum mounten und umounten eines mit Passwort verschlüsselten Images ===== | ||
| + | |||
| + | <file bash / | ||
| + | NUTZER=" | ||
| + | # | ||
| + | CRYPTDATEI="/ | ||
| + | MDDEV=" | ||
| + | MONTIEREN="/ | ||
| + | PATH="/ | ||
| + | MOUNT=" | ||
| + | UMOUNT=" | ||
| + | PARAMETER=" | ||
| + | </ | ||
| + | |||
| + | <file bash / | ||
| + | # | ||
| + | |||
| + | # | ||
| + | # | ||
| + | # aptitude install cryptsetup | ||
| + | # | ||
| + | # | ||
| + | |||
| + | ### erstellt im Jahre 2010; | ||
| + | ### leider funktionieren diese CryptSetup-Einstellungen im Jahre 2020 | ||
| + | ### nicht mehr so, wie sie stehen; man muss mit den Parametern " | ||
| + | ### ein wenig rumspielen, bis es geht; | ||
| + | VERSION=" | ||
| + | |||
| + | # | ||
| + | if [ -r / | ||
| + | . / | ||
| + | elif [ -r / | ||
| + | . / | ||
| + | else | ||
| + | echo "'/ | ||
| + | exit 1 | ||
| + | fi | ||
| + | # | ||
| + | |||
| + | if [ -z " | ||
| + | |||
| + | echo "$0 [cryptdatei.img]" | ||
| + | |||
| + | else | ||
| + | |||
| + | if [ -e "/ | ||
| + | if [ " | ||
| + | |||
| + | ### verschl. Datei ausklinken (umount) | ||
| + | |||
| + | # | ||
| + | # dieses Script muss unbedingt in | ||
| + | # Gentoo: "/ | ||
| + | # SUSE : "/ | ||
| + | # eingetragen werden! | ||
| + | # | ||
| + | ${UMOUNT} ${MONTIEREN} && rm -r ${MONTIEREN} | ||
| + | #sync | ||
| + | sleep 1 | ||
| + | cryptsetup status ${MDDEV} | head -n1 | ||
| + | cryptsetup luksClose ${MDDEV} | ||
| + | cryptsetup status ${MDDEV} | head -n1 | ||
| + | sleep 1 | ||
| + | for LODEV in $(losetup -j ${CRYPTDATEI} | fgrep '/ | ||
| + | do | ||
| + | losetup -d ${LODEV} | ||
| + | done | ||
| + | fi | ||
| + | |||
| + | else | ||
| + | if [ " | ||
| + | |||
| + | ### verschl. Datei einklinken (mount) | ||
| + | |||
| + | # | ||
| + | # twofish (schnell+sicher) oder serpent (sehr sicher) | ||
| + | # | ||
| + | ALGORITHM=" | ||
| + | DATEISYST=" | ||
| + | # | ||
| + | # | ||
| + | ### nur zum initialisieren | ||
| + | ### erstellen der Image-Datei | ||
| + | # dd if=/ | ||
| + | # dd if=/ | ||
| + | # dd if=/ | ||
| + | # oder | ||
| + | # touch ./ | ||
| + | # touch ./ | ||
| + | # | ||
| + | # | ||
| + | LOAUSGABE=" | ||
| + | LOOPDEV=" | ||
| + | # losetup: could not find any free loop device | ||
| + | # losetup: Konnte kein freies „loop“-Gerät finden | ||
| + | |||
| + | if [ -z " | ||
| + | echo "' | ||
| + | else | ||
| + | echo "' | ||
| + | sleep 1 | ||
| + | # | ||
| + | # | ||
| + | ### nur zum initialisieren | ||
| + | # 2010: cryptsetup -y -c ${ALGORITHM} -h sha512 -s 256 luksFormat ${LOOPDEV} | ||
| + | # 2020: cryptsetup -y -c ${ALGORITHM} -h sha512 -s 512 luksFormat ${LOOPDEV} | ||
| + | # | ||
| + | # | ||
| + | cryptsetup status ${MDDEV} | head -n1 | ||
| + | cryptsetup luksOpen ${LOOPDEV} ${MDDEV} | ||
| + | # hier wird das Passwort abgefragt | ||
| + | sleep 1 | ||
| + | cryptsetup status ${MDDEV} | ||
| + | # | ||
| + | # | ||
| + | ### nur zum initialisieren | ||
| + | # mkfs -t ${DATEISYST} / | ||
| + | # | ||
| + | # | ||
| + | mkdir -p ${MONTIEREN} | ||
| + | fsck -y / | ||
| + | # | ||
| + | EINKLINKEN=" | ||
| + | echo " | ||
| + | ${EINKLINKEN} | ||
| + | fi | ||
| + | |||
| + | #echo "sleep 12" | ||
| + | #sleep 12 | ||
| + | |||
| + | fi | ||
| + | fi | ||
| + | |||
| + | fi | ||
| + | |||
| + | |||
| + | if [ " | ||
| + | for i in $(losetup -j ${CRYPTDATEI} | fgrep '/ | ||
| + | do | ||
| + | losetup -d ${i} | ||
| + | echo " | ||
| + | sleep 1 | ||
| + | done | ||
| + | fi | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== automatisches aushängen im Betriebssystem einrichten ===== | ||
| + | |||
| + | Aus Sicherheitsgründen sollte wir noch zwei Automatissmen einbauen, die unsere verschlüsselte Datei automatisch aushängen. | ||
| + | - Der Wichtigste Grund ist die Dateisystemkonsistenz. Wenn der Rechner runter gefahren wird und Sie vergessen haben die verschlüsselte Datei auszuhängen, | ||
| + | - Ein Grund, den man nicht immer hat ist der, das man den Rechner hin und wieder mal unbeaufsichtigt lässt und dann die geschützten Daten, ungeschützt von anderen eingesehn werden können. So schlage ich ein automatisches aushängen vor, welches vom Betriebssystem regelmäßig um eine bestimmte Uhrzeit ausgeführt wird. | ||
| + | |||
| + | Dazu legen wir uns ein separates Stop-Script an. | ||
| + | Würden wir dafür das " | ||
| + | |||
| + | |||
| + | Stop-Script: | ||
| + | |||
| + | # vi / | ||
| + | |||
| + | #!/bin/bash | ||
| + | | ||
| + | # | ||
| + | # Dieses Script hängt alle eingehängten Crypto-Dateien aus. | ||
| + | # | ||
| + | | ||
| + | for MDDEV in $(ls / | ||
| + | do | ||
| + | MONTIEREN="/ | ||
| + | LOOPDEV=" | ||
| + | CRYPTODATEI=" | ||
| + | | ||
| + | umount ${MONTIEREN} && rm -fr ${MONTIEREN} | ||
| + | sleep 1 | ||
| + | cryptsetup luksClose ${MDDEV} | ||
| + | sleep 1 | ||
| + | losetup -a | fgrep ${CRYPTODATEI} | awk -F':' | ||
| + | echo " | ||
| + | done | ||
| + | |||
| + | # chmod 0755 / | ||
| + | |||
| + | |||
| + | Damit das Script beim runter fahren des Systems ausgeführt wird, muss man den Aufruf in die entsprechende Datei eintragen. | ||
| + | |||
| + | Das wird bei jeder Distribution anders gemacht: | ||
| + | * Gentoo: "/ | ||
| + | * SUSE : "/ | ||
| + | |||
| + | Bei Gentoo muss dieses Script erst noch aktiviert werden, wie es bei SUSE aussieht weiß ich nicht, und bei Ubuntu muss man sich dafür selber ein Stop-Script schreiben. | ||
| + | |||
| + | Das Stop-Script für Ubuntu könnte zum Beispiel so aussehen: | ||
| + | |||
| + | # vi / | ||
| + | |||
| + | #! /bin/sh | ||
| + | ### BEGIN INIT INFO | ||
| + | # Provides: | ||
| + | # Required-Start: | ||
| + | # Required-Stop: | ||
| + | # Default-Start: | ||
| + | # Default-Stop: | ||
| + | # Short-Description: | ||
| + | # Description: | ||
| + | ### END INIT INFO | ||
| + | | ||
| + | NAME=stop-crypt | ||
| + | | ||
| + | [ -x " | ||
| + | | ||
| + | case " | ||
| + | stop) | ||
| + | / | ||
| + | ;; | ||
| + | *) | ||
| + | echo " | ||
| + | exit 3 | ||
| + | ;; | ||
| + | esac | ||
| + | |||
| + | |||
| + | Jetzt am besten noch ausführbar machen: | ||
| + | # chmod 0755 / | ||
| + | |||
| + | |||
| + | Dann muss das Script noch aktiviert werden: | ||
| + | # update-rc.d stop-crypt stop 20 0 6 . | ||
| + | |||
| + | |||
| + | Es ist auch Sinnvoll, im Sytem zu verankern, dass die verschlüsselte Datei automatisch um eine bestimmte Uhrzeit ausgehängt wird. | ||
| + | Dann kann man es nicht vergessen (Sicherheit). | ||
| + | # vi / | ||
| + | |||
| + | 00 20 * * * root / | ||
| + | |||
| + | |||
| + | === Bedienung === | ||
| + | |||
| + | als " | ||
| + | # / | ||
| + | |||
| + | |||
| + | als " | ||
| + | # su - -c / | ||
| + | oder bei Ubuntu | ||
| + | # sudo / | ||
| + | |||
| + | |||
| + | Diese Aufruffe kann man sich dann in seiner grafischen Arbeitsoberfläche als Schaltfläche oder " | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | Beim aushängen erscheint folgendes: | ||
| + | Passwort: | ||
| + | / | ||
| + | / | ||
| + | |||
| + | |||
| + | Beim Einhängen sieht das so aus: | ||
| + | Passwort: | ||
| + | '/ | ||
| + | / | ||
| + | Enter passphrase for / | ||
| + | Key slot 0 unlocked. | ||
| + | / | ||
| + | cipher: | ||
| + | keysize: 256 bits | ||
| + | device: | ||
| + | offset: | ||
| + | size: 1366008 sectors | ||
| + | mode: read/write | ||
| + | fsck from util-linux-ng 2.17.2 | ||
| + | fsck.jfs version 1.1.12, 24-Aug-2007 | ||
| + | processing started: 6/15/2010 17.27.34 | ||
| + | Using default parameter: -p | ||
| + | The current device is: / | ||
| + | Block size in bytes: | ||
| + | Filesystem size in blocks: | ||
| + | **Phase 0 - Replay Journal Log | ||
| + | Filesystem is clean. | ||
| + | / | ||
| + | |||
