Cryptconfig

Aus Linupedia
Wechseln zu: Navigation, Suche
Höhe=24px 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.

Anwendung in YaST

Konfiguration verschlüsseltes home-Verzeichnis 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

Links