Cryptconfig
Dieser Artikel oder Teile davon wurden mit 'Review' markiert. Das bedeutet, dass größere Arbeiten am Inhalt des Artikels abgeschlossen sind und der Autor eine Korrekturlesung durch andere User zur Qualitätssicherung für angebracht hält.
Zu sichtende Teile: Kompletter Artikel Bitte hilf LinuxClubWiki, indem du den zu sichtenden Teil überprüfst und den Artikel gegebenenfalls überarbeitest! |
--Gehrke (Diskussion) 21:11, 24. Jan. 2015 (CET)
cryptconfig ist ein Wrapper, welcher das Handling von LUKS vereinfachen soll. Es wurde von SUSE entwickelt für den Einsatz in YaST. Dort wird es dazu verwendet, verschlüsselte home-Verzeichnisse zu erstellen und zu löschen oder deren Größe zu verändern.
Zitat aus der Projektbeschreibung:
This package contains a utility for configuring encrypted home directories and LUKS partitions. It also supports creating LUKS disk images, creating LUKS partitions, and enlarging disk images along with their file systems. This package also contains a pam module that syncs a user's UNIX password with the password used to encrypt their home directory.
Inhaltsverzeichnis
Anwendung in YaST
Im Konfigurationswerkzeug YaST ist es möglich, beim Anlegen von Benutzern oder Verändern von Eigenschaften die Verwendung eines verschlüsselten home-Verzeichnisses zu bestimmen. Als Resultat wird dabei ein LUKS-Container in der angegebenen Größe erzeugt. Die Größe dieses Containers kann an dieser Stelle auch verändert werden. Der Screenshot zeigt den entsprechenden Dialog.
Im wesentlichen wird dabei ein Image-File (der LUKS-Container) in der angegebenen Größe erzeugt. Dazu passend ein Key-File als Schlüssel, welches mit dem Login-Password des jeweiligen Users entschlüsselt werden muss:
# ls -l /home drwxr-xr-x 7 cryptedhome-user users 4096 Jan 22 07:47 cryptedhome-user -rw------- 1 cryptedhome-user root 104857601 Jan 22 07:47 cryptedhome-user.img -rw------- 1 cryptedhome-user root 288 Jan 22 07:47 cryptedhome-user.key
Die Daten im gleichnamigen Verzeichnis werden nicht verschlüsselt.
Für den Anwender ist das Verfahren im Wesentlichen transparent. Im Laufe der üblichen Arbeiten mit dem System bemerkt er nichts von der Existenz des verschlüsselten Datenspeichers, insbesondere entfällt durch die Bindung an das Login-Passwort die sonst notwendige Eingabe einer zusätzlichen Passphrase.
Anwendung über die Kommandozeile
In bestimmten Fällen kann es notwendig sein, auf die Daten innerhalb des LUKS-Containers direkt zuzugreifen. Dies kann auf zwei Wegen durchgeführt werden, wobei beide Wege voraussetzen, dass neben den beiden erzeugten Dateien (Image + Key) auch das Login-Passwort des Users bekannt ist.
- Zugriff via cryptconfig
- Zugriff via dm-crypt (cryptsetup)
Der Weg über cryptconfig ist möglicherweise etwas einfacher, aber spezifisch für die Distributionen von SUSE. Die zweite Variante ist allgemein anwendbar und kann somit mit jeder beliebigen Linux-Distribution durchgeführt werden, solange diese LUKS unterstützt.
Zugriff mit cryptconfig
Das Programm selbst gibt eine kurze Übersicht über die verfügbare Funktionalität:
usage: cryptconfig [COMMAND] [COMMAND-OPTIONS] arg1 arg2... COMMANDS enlarge-image Enlarge a disk image and it's file system close Close devices using a LUKS image make-ehd Create an encrypted home directory image and image key create-image Create an arbitrary LUKS image passwd Change the password used to encrypt/decrypt a key file pd-add Add public data open Open a LUKS image format Create a LUKS partition on a device pd-remove Remove public data pm-disable Disable pam_mount with encrypted home directories create-key Create a new key that can be added to a LUKS image pm-enable Enable pam_mount with encrypted home directories You can run cryptconfig [COMMAND] --help for more information on a command.
Auf den Inhalt kann über die Kommandozeile mit einem Zweizeiler zugegriffen werden, entsprechende Berechtigungen vorausgesetzt. Zuerst wird der Container entschlüsselt und danach der Inhalt in das gewünschte Zielverzeichnis gemountet.
j2:~ # cryptconfig open /home/cryptedhome-user.img --key-file /home/cryptedhome-user.key Enter the key file password: /home/cryptedhome-user.img is now available as device /dev/mapper/_home_cryptedhome-user.img j2:~ # mount /dev/mapper/_home_cryptedhome-user.img /mnt
In der umgekehrten Reihenfolge wird der Container wieder verschlossen:
j2:~ # umount /mnt j2:~ # cryptconfig close /home/cryptedhome-user.img Done.
Zugriff mit dm-crypt
Auch wenn der zuvor beschriebene Zugriff via cryptconfig sehr simpel umzusetzen ist, kann es lohnend sein, sich mit den Zugriffsmöglichkeiten via dm-crypt vertraut zu machen. Beispielsweise für die Verwendung in Umgebungen jenseits von SUSE (ohne Support dieses Wrappers) oder zur Erlangung detaillierter Informationen zu den eingesetzten Verfahren, möglicherweise um die gebotenen Security-Standard qualitativ bewerten zu können.
Informationen zum Container
Detaillierte Informationen zu den eingesetzten Crypto-Merkmalen können aus dem LUKS-Header ausgelesen werden, ohne dass eine Entschlüsselung stattfindet:
j2:~ # losetup --find /dev/loop0 j2:~ # losetup /dev/loop0 /home/cryptedhome-user.img losetup: /home/cryptedhome-user.img: warning: file does not fit into a 512-byte sector the end of the file will be ignored. j2:~ # losetup --list NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE /dev/loop0 0 0 0 0 /home/cryptedhome-user.img j2:~ # cryptsetup luksDump /dev/loop0 LUKS header information for /dev/loop0 Version: 1 Cipher name: aes Cipher mode: xts-plain64 Hash spec: sha1 Payload offset: 4096 MK bits: 256 MK digest: ca 55 7c 0e 46 f7 97 60 a1 09 2d f2 b0 74 58 a1 19 72 fc b4 MK salt: 83 89 19 c1 b4 3a 2a 79 24 bb 75 3d 7c c8 d9 4f f8 3a 10 2c a0 48 72 c5 8d ee 04 63 4d 12 ad 6d MK iterations: 42875 UUID: e3a9e54d-fd22-495a-a584-ecc3eaff0659 Key Slot 0: ENABLED Iterations: 173441 Salt: b5 69 44 0a 19 3e 17 e7 0b 2c 13 f3 44 48 59 dd cc 3c 81 33 bb c0 23 d3 8b a0 29 4f 34 df 04 c4 Key material offset: 8 AF stripes: 4000 Key Slot 1: DISABLED Key Slot 2: DISABLED Key Slot 3: DISABLED Key Slot 4: DISABLED Key Slot 5: DISABLED Key Slot 6: DISABLED Key Slot 7: DISABLED
Entschlüsselung des Keys
Der für den Zugriff auf den Container notwendige Schlüssel liegt direkt neben dem Container, ist aber selbst verschlüsselt:
j2:~ # cat /home/cryptedhome-user.key Salted__8��yn��a���L��.��07�!谣�j��v<C8<���zas��n������▒%� *9tm�__B"ٙ\���[3��W��l��'Z(-�A�S �����▒�o�W��W��5�?&i�qF�e�HRs#4̂wmk��`��)U��2ƚ����R`���S���F�R�� �Ց�� �� �Ļ _XG�▒��h�=7�C▒A�M��-)�%�9�U���R��^����W1D���Fg▒S(�&�,�p�;��絍,��UÁ���_2�Ȕ|H�~<ht5�Z\)*
Er wurde mit dem Login-Passwort des Users verschlüsselt. Ein Blick in den Sourcecode (cryptconfig-lib.c) zeigt diesen relevanten Code-Schnipsel:
/* * Decrypt the encrypted key file using password. The key_data * field needs to be unlocked and freed by the caller. */ gboolean decrypt_key (const char *key_file, const char *password, char **key_data, int *key_data_size) { const EVP_CIPHER *cipher = EVP_aes_256_cbc (); const EVP_MD *md = EVP_md5 (); size_t hk_sz, total_size = 0; int fd, final_size, kd_size; gboolean ret = FALSE; struct stat info; EVP_CIPHER_CTX ctx; unsigned char iv[EVP_MAX_IV_LENGTH]; unsigned char hashed_key[EVP_MAX_KEY_LENGTH]; unsigned char salt[PKCS5_SALT_LEN]; unsigned char magic[8]; fd = open (key_file, O_RDONLY | O_NOFOLLOW); [...] }
Zuerst wird der Schlüssel mit dem Login-Password via openssl entschlüsselt und unverschlüsselt abgelegt:
j2:~ # openssl enc -d -aes-256-cbc -in /home/cryptedhome-user.key -out /home/cryptedhome-user-plaintext.key enter aes-256-cbc decryption password:
Im nächsten Schritt wird mit diesem Klartext-Schlüssel (welcher sofort danach sicher entsorgt werden sollte) der LUKS-Container entschlüsselt und gemountet:
j2:~ # cryptsetup luksOpen --key-file=/home/cryptedhome-user-plaintext.key /dev/loop0 cryptedhome j2:~ # shred /home/cryptedhome-user-plaintext.key; rm /home/cryptedhome-user-plaintext.key j2:~ # mount /dev/mapper/cryptedhome /mnt
An dieser Stelle ist das home-Verzeichnis unverschlüsselt unter /mnt eingehängt und kann bearbeitet werden.
Abschließend nach getaner Arbeit wie zuvor auch die Dekonstruktion der vorigen Schritte:
j2:~ # umount /mnt j2:~ # cryptsetup luksClose cryptedhome j2:~ # losetup --detach /dev/loop0