Cryptconfig: Unterschied zwischen den Versionen
Gehrke (Diskussion | Beiträge) (Zugriff mit dm-crypt + Informationen zum Container) |
Gehrke (Diskussion | Beiträge) (Entschlüsselung des Keys) |
||
Zeile 105: | Zeile 105: | ||
Key Slot 7: DISABLED | Key Slot 7: DISABLED | ||
</pre> | </pre> | ||
+ | |||
+ | ===Entschlüsselung des Keys=== | ||
+ | Der für den Zugriff auf den Container notwendige Schlüssel liegt direkt neben dem Container, ist aber nicht unverschlüsselt: | ||
+ | <pre> | ||
+ | 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\)* | ||
+ | </pre> | ||
+ | Er wurde mit dem Login-Passwort des Users verschlüsselt. Ein Blick in den Sourcecode zeigt diesen relevanten Code-Schnipsel: | ||
+ | <pre> | ||
+ | /* | ||
+ | * 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); | ||
+ | [...] | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | <ToDo> Womit kann das auf der Kommandozeile entschlüsselt werden? | ||
[[Kategorie:Security]] [[Kategorie:YaST]] [[Kategorie:Konsole]] | [[Kategorie:Security]] [[Kategorie:YaST]] [[Kategorie:Konsole]] |
Version vom 23. Januar 2015, 06:27 Uhr
Achtung dieser Artikel ist noch in Arbeit und dient vorläufig nur als Vorlage. Dieser Beitrag zu Linux oder der Abschnitt ist in Bearbeitung. Weitere Informationen findest du hier. Der Ersteller arbeitet an dem Beitrag oder Abschnitt und entsorgt den Wartungsbaustein spätestens 3 Tage nach der letzten Bearbeitung. Änderungen außer Rechtschreibkorrekturen ohne Absprache mit dem Urspungsautor sind möglichst zu vermeiden, solange dieser Baustein noch innerhalb der genannten Frist aktiviert ist. |
--Gehrke (Diskussion) 22:27, 21. 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.
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 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.
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.
Zugriff mit cryptconfig
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 nicht unverschlü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 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); [...] }
<ToDo> Womit kann das auf der Kommandozeile entschlüsselt werden?