web-dev-qa-db-fra.com

Que contient l'en-tête LUKS?

Que contient l’en-tête LUKS? Je sais, l'en-tête a une taille de 2 Mo. De plus, cryptsetup prend en charge "l'en-tête détaché", où l'en-tête peut être stocké dans un fichier séparé.

Ainsi, par exemple, je peux formater le périphérique luks et spécifier un en-tête détaché dans un fichier séparé:

dd if=/dev/zero of=LUKS-HEADER bs=1M count=2
cryptsetup luksFormat /dev/sdb1 --header LUKS-HEADER --align-payload=0

IIUC, cette opération de formatage écrit uniquement dans l'en-tête. La partition de disque n'est pas modifiée (j'ai vérifié avec md5sum). Alors pourquoi cryptsetyp luksFormat nécessite-t-il de spécifier le périphérique (/ dev/sdb1)?

Puis-je partager un en-tête pour plusieurs appareils Luks?

MISE À JOUR

Après une enquête plus approfondie, il me semble que les premiers 4096 B de l'en-tête contiennent les informations d'en-tête, qui sont imprimées avec cryptsetup luksDump.

Ce qui est stocké dans la partie restante du fichier de 2 Mo est un mystère pour moi. Il semble être écrasé par des données aléatoires (je l'ai d'abord rempli de zéros, donc je peux voir la différence). De plus, le fichier de 2 Mo est absolument incompressible. Indication supplémentaire de données aléatoires/cryptées.

Quelqu'un peut-il expliquer avec autorité ce qui est contenu dans l'en-tête LUKS de 2 Mo?

21
Martin Vegter

Je pense que l'en-tête a une taille de 2 Mo en raison du séparateur anti-criminalistique: la clé principale chiffrée est divisée en plusieurs blocs pour améliorer la diffusion et s'assurer qu'elle peut être facilement effacée du disque. En particulier, l'effacement d'une seule bande rend l'ensemble mk crypté irrécupérable.

https://web.archive.org/web/20160517044339/http://tomb.dyne.org/Luks_on_disk_format.pdf

voici la spécification LUKS2: https://gitlab.com/cryptsetup/LUKS2-docs/blob/master/luks2_doc_wip.pdf


Je me demande comment on peut extraire la clé principale chiffrée ...

11
refex

Pour votre information, je ne peux pas répondre "avec autorité" car je ne suis pas l'auteur/contributeur de LUKS/cryptsetup/dmcrypt mais un utilisateur. Mais mes réponses suivent,

Que contient l'en-tête LUKS?

De ici ,

La disposition de l'en-tête LUKS est,

    +------------------------+----+----+----+----+----+----+----+----+-----------+
    |  Luks Partition Header | K0 | K1 | K2 | K3 | K4 | K5 | K6 | K7 | BULK DATA |
    +------------------------+----+----+----+----+----+----+----+----+-----------+
                                   Figure - 1

Où,

  1. Luks Partition Header (PHDR) se compose des informations nécessaires pour déchiffrer/chiffrer le périphérique luks comme suit,
    -------------------------------+-----------------------------
    |   Partition Header Contents  |      Output by luksDump    |
    -------------------------------+-----------------------------
    |  Magic Byte                  | LUKS                       |
    -------------------------------+-----------------------------
    | Luks version                 | 1                          |
    -------------------------------+-----------------------------
    | Cipher Name                  | serpent                    |
    -------------------------------+-----------------------------
    | Cipher Mode                  | xts-plain64                |
    -------------------------------+-----------------------------
    | Hash Type                    | whirpool                   |
    -------------------------------+-----------------------------
    | Payload offset               | 4096                       |
    -------------------------------+-----------------------------
    | Master Key Bits              | 512                        |
    -------------------------------+-----------------------------
    | Master Key Digest            | 8a 90 77 7e ...            |
    -------------------------------+-----------------------------
    | Master Key Salt              | ca f3 40 fc ...            |
    -------------------------------+-----------------------------
    | Master Key Digest Iteration  | 23250                      |
    -------------------------------+-----------------------------
    | Partition UUID               | 46927c7d-7f17-4312-...     |
    -------------------------------+-----------------------------
                              Table - 1
  1. La deuxième partie de l'en-tête de partition (PHDR) se compose de 8 descripteurs de logement de clé, c'est-à-dire des informations sur le logement de clé comme suit,
    ------------------------------+------------------------------
    | Key Descriptors             |      Output by luksDump     |
    +-----------------------------+------------------------------
    | Activation status           | Enabled                     |
    +-----------------------------+------------------------------
    | Iteration                   | 146285                      |
    +-----------------------------+------------------------------
    | Salt                        | 1e c1 94 24 36 4c 98..      |
    +-----------------------------+------------------------------
    | Key Material Offset         | 8                           |
    +-----------------------------+------------------------------
    | AF Stripes                  | 4000                        |
    ------------------------------+------------------------------
                             Table - 2

Pour votre information, les informations d'en-tête de partition luks ci-dessus sont obtenues en exécutant la commande luksDump et il s'agit de 4.0K en taille.

  1. De Figure-1 après le Luks Partition header, nous pouvons voir que les sections Key-slot commencent, suivies de 8 key-slots. Chaque emplacement de clé est approximatif 128kiB en taille. Donc, pour 8 emplacements clés, nous obtenons 8 * 128 = 1024 KiB qui est de 1 Mo ou 1048576 octets.

Jusqu'à présent, nous obtenons 4096 octets de l'en-tête de partition et 131072 octets pour les emplacements de clés totalisant 1048576 + 4096 = 1052672 bytes pour la configuration par défaut de luks. Pour la configuration la plus courante aes-xts-plain environ 2 Mo.

Vous pouvez donc dire que la taille de l'en-tête dépend de divers éléments comme la taille de la clé principale, la taille de hachage, l'algorithme de chiffrement, l'algorithme de hachage, etc. Mais il est sûr de considérer 2 Mo comme en-tête luks.

  1. Après les emplacements clés, les données en bloc commencent. Depuis source ,

En raison de l'alignement par défaut de 2 Mo, le début de la zone de données pour cryptsetup 1.3 et versions ultérieures est à 2 Mo, c'est-à-dire à 0x200000. Pour les versions plus anciennes, elle est à 0x101000, soit à 1'052'672 octets.

Vous pouvez voir dans la sortie suivante que les données en masse/les données chiffrées commencent à partir du décalage 00200000

[root@arif tmp]# hexdump -C /dev/sda99 -s 0X1FFFa0 | head
001fffa0  31 62 33 33 66 30 30 20  72 20 5f 5f 6b 63 72 63  |1b33f00 r __kcrc|
001fffb0  74 61 62 5f 64 6d 61 6d  5f 61 6c 6c 6f 63 5f 63  |tab_dmam_alloc_c|
001fffc0  6f 68 65 72 65 6e 74 0a  66 66 66 66 66 66 66 66  |oherent.ffffffff|
001fffd0  38 31 62 33 33 66 30 38  20 72 20 5f 5f 6b 63 72  |81b33f08 r __kcr|
001fffe0  63 74 61 62 5f 64 6d 61  6d 5f 61 6c 6c 6f 63 5f  |ctab_dmam_alloc_|
001ffff0  6e 6f 6e 63 6f 68 65 72  65 6e 74 0a 66 66 66 66  |noncoherent.ffff|
00200000  89 8d 9f 65 56 c0 f9 07  65 d8 50 58 18 3a 67 31  |...eV...e.PX.:g1|
00200010  87 c7 7c 2e 4a 3e 40 78  08 10 2c e3 14 52 5f dc  |..|.J>@x..,..R_.|
00200020  c9 7e 1e d3 a1 4d 4f fd  4c 6c f8 fb f2 bd 46 48  |.~...MO.Ll....FH|
00200030  3f e9 f8 4b ef f7 1c 82  be 7e 91 e0 78 35 aa bb  |?..K.....~..x5..|

Pourquoi cryptsetyp luksFormat nécessite-t-il de spécifier le périphérique (/ dev/sdb1)?

Parce que,

  • cryptsetup doit spécifier luks Device comme argument
  • Il peut y avoir plusieurs périphériques/partitions luks comme j'en ai six comme suit,
[arif@arif ~]$ lsblk
NAME                                       MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                                          8:0    0 931.5G  0 disk  
├─sda1                                       8:1    0   1.9G  0 part  /boot/efi
├─sda2                                       8:2    0   953M  0 part  /boot
├─sda3                                       8:3    0 614.7G  0 part  
│ └─luks-d84cd751-7f17-4312-ed89-4dfbc33dec61
                                           253:0    0 614.7G  0 crypt 
│   ├─vg1-root                             253:2    0 139.7G  0 lvm   /
│   ├─vg1-usr                              253:3    0 186.3G  0 lvm   
│   │ └─luks-03833316-8f82-4a78-0fc4-85ed66ffccd5
                                           253:4    0 186.3G  0 crypt /usr
│   ├─vg1-home                             253:5    0 186.3G  0 lvm   
│   │ └─luks-65f51991-7437-460b-9a0b-e3851b32fdb4
                                           253:8    0 186.3G  0 crypt /home
│   ├─vg1-var                              253:6    0  93.1G  0 lvm   
│   │ └─luks-d1b24b22-53eb-477f-8259-0a22846d3edc
                                           253:9    0  93.1G  0 crypt /var
│   └─vg1-tmp                              253:7    0   9.3G  0 lvm   
│     └─luks-b69a98b8-e257-5ca7-80a4-21725a721f00
                                           253:10   0   9.3G  0 crypt /tmp
├─sda4                                       8:4    0    14G  0 part  
│ └─luks-9bbcad99-3532-4583-a428-c02b559fdf3c
                                           253:1    0    14G  0 crypt [SWAP]
└─sda5                                       8:5    0 300.1G  0 part  
  └─storage

Donc, si vous voulez luksFormat, vous devez mentionner une partition standard ou un périphérique luks existant.

Puis-je partager un en-tête pour plusieurs appareils Luks?

Pour autant que je sache, non, vous ne pouvez pas utiliser header d'un appareil luks sur un autre appareil luks car la configuration (type de chiffrement, taille de clé, etc.) pourrait être différente (si la configuration est la même, je recommande fortement ne croyez pas que cela fonctionnerait).

8
Muhammad

Je pense avoir trouvé la réponse à votre question. L'en-tête est composé de l'en-tête lui-même et d'un espace pour les emplacements de clés. La raison pour laquelle cette section derrière l'en-tête est de 2 Mo est par défaut. Voici où j'ai trouvé la réponse: https://gitlab.com/cryptsetup/cryptsetup/wikis/FrequentlyAskedQuestions

Regardez dans la section 2.4 sur cette page et à la fin de cette section, vous trouverez l'extrait ci-dessous.

"les numéros de secteur sont décalés de la longueur de l'en-tête et des emplacements de clé et il y a une perte de cette taille en capacité (1 Mo + 4096B pour les valeurs par défaut et 2 Mo pour le mode XTS non par défaut le plus couramment utilisé)"

J'espère que cela répond à votre question et que le site répertorié ci-dessus a reçu de nombreuses autres bonnes questions.

7
Eddie Studer

Tiré de https://www.lisenet.com/2013/luks-add-keys-backup-and-restore-volume-header/ , vous pouvez voir que le cryptsetup luksDump La commande expliquera le contenu. Un en-tête doit pouvoir être utilisé contre n'importe quel nombre d'appareils.

# cryptsetup luksDump /dev/sdb2
LUKS header information for /dev/sdb2

Version:        1
Cipher name:    aes
Cipher mode:    cbc-essiv:sha256
Hash spec:      sha1
Payload offset: 4096
MK bits:        256
MK digest:      e5 88 07 f2 4b ce 79 21 85 34 f7 a6 e3 0b 6b b2 a7 b8 d5 a1
MK salt:        0c dd 95 3d 1e 30 1f 66 d4 5e 31 03 12 a0 61 29
                e5 ef 34 8e 13 5d 80 76 8b 4a 0a c3 55 02 22 d3
MK iterations:  5750
UUID:           e4971160-047b-49ce-8246-b63f1fb67db9

Key Slot 0: ENABLED
        Iterations:             23233
        Salt:                   ff bc fc 78 98 5d 35 50 97 76 37 b4 70 99 38 44
                                9f bd a1 b9 02 2d 4d 1d 18 b5 dc f6 4c a0 37 fc
        Key material offset:    8
        AF stripes:             4000
Key Slot 1: ENABLED
        Iterations:             23956
        Salt:                   3a a0 06 83 d3 e0 ba da b0 5c e2 56 cb ed 72 69
                                76 9a 8a b8 e1 eb e6 90 44 b3 71 7a 2f 96 80 39
        Key material offset:    264
        AF stripes:             4000
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED
6
Jeff Ferland

Beaucoup de réponses ici ne fournissaient que des informations sur LUKS1 ( publié en 2004 ), alors j'ai pensé ajouter une référence à LUKS2 ( publié en 2017 ).

L'en-tête LUKS contient nécessairement des métadonnées non chiffrées ainsi que votre ou vos "emplacements de clés" chiffrés symétriquement contenant votre clé principale et les sels nécessaires pour déchiffrer les données sur votre volume LUKS.

Dans LUKS1, ces données comprenaient les champs suivants:

  1. la magie
  2. version
  3. nom-chiffrement
  4. mode de chiffrement
  5. hash-spec
  6. compensation de charge utile
  7. octets-clés
  8. mk-digest
  9. mk-digest-salt
  10. mk-digest-iter
  11. uuid
  12. emplacement-clé-0
  13. emplacement-clé-1
  14. emplacement-clé-2
  15. emplacement-clé-3
  16. emplacement-clé-4
  17. emplacement-clé-5
  18. emplacement-clé-6
  19. emplacement-clé-7

L'encodage et la taille exacts des champs de données ci-dessus sont décrits dans l'original LUKS On-Disk Format Specification écrit par Clemens Fruhwirth en janvier 2005.

L'en-tête de LUKS2 est très différent de LUKS1. La taille est beaucoup plus variable, les métadonnées sont stockées dans le format JSON plus extensible et le nombre d'emplacements de clés est variable.

Pour plus d'informations sur les données stockées dans l'en-tête LUKS2 et comment, consultez la Spécification du format sur disque LUKS2 publiée par Milan Broz en août 2018.

0
Michael Altfield