Hits :
2509
cryptsetup[link1] – LUKS (Linux Unified Key Setup)
Our goal is to encrypt a disk volume. Either is a partition, a physical or virtual disk the process is the same.
Luks has two sections:
- Header
- Key(s) slot(s) – containers
At the header section are stored informations about the cipher we used, some bits and some salt!
Header section is including and the key(s) slot(s) but for a better understanding, i will "separate" them
The second section stores the key(s) in 8 slots. These slots contain the salt and the key (passphrase or a key file) and if not used are marked as DISABLED. It is important to understand that disabling all the slots (removing all keys) the volume is unaccessible and there for trash. So be very careful with deleting a key from a slot.
There is the right way and the wrong way to encrypt a volume disk.
Encrypted your volume with a key passphrase is the wrong way unless the key is so big as your
_ (leave this field intentional blank).
Be aware that encrypted volumes with a small and easy key passphrase are just a moment away from cracking them with a brute force software. If everything are encrypted but the key is 123456 then perhaps it should be unencrypted and focus on other parts of security. This is something i've learned by the hard (easy for someone else) way!
So what is the right way ?
Create random keys for every volume you want to encrypt:
dd if=/dev/urandom of=~/keyfile.key bs=4096 count=1
ok. we now have at hand the key(file) to encrypt/decrypt our volume disk.
Store this file somewhere (really) safe.
encrypt your disk volume:
$ sudo cryptsetup luksFormat /dev/vg_diskA/lv_test --key-file /tmp/testkey
WARNING!
========
This will overwrite data on /dev/vg_diskA/lv_test irrevocably.
Are you sure? (Type uppercase yes): YES
YES
after that a confirmation is always a good thing:
$ sudo cryptsetup luksDump /dev/vg_diskA/lv_test
LUKS header information for /dev/vg_diskA/lv_test
Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha1
Payload offset: 4096
MK bits: 256
MK digest: 71 08 f4 23 7b e3 df ed ae 30 57 aa 55 bd 76 b0 20 43 7f 4a
MK salt: fe 9b 6d 76 92 cb 7d b0 69 dd 8c 3f c8 fd ac 3e
11 8f 0c 6d 5c 6c 52 a3 c8 eb e4 6e 40 73 ec fe
MK iterations: 28500
UUID: 6fe83dcc-35a3-418c-a10e-bff49955d442
Key Slot 0: ENABLED
Iterations: 112280
Salt: d4 99 81 c7 43 63 3f 8f 44 16 4d ca 22 a9 c9 d2
1a 1e fa 37 8f 93 93 15 11 04 48 d3 c6 b4 ee 14
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
Now lets do another test: If you have already a luks volume with a key passphrase and you want to change all that.
First create (as above) a new key and then add this key to a new keyslot.
before:
$ sudo cryptsetup luksFormat /dev/vg_diskA/lv_test
WARNING!
========
This will overwrite data on /dev/vg_diskA/lv_test irrevocably.
Are you sure? (Type uppercase yes): YES
Enter passphrase: 123456
Verify passphrase: 123456
$ sudo cryptsetup luksDump /dev/vg_diskA/lv_test
LUKS header information for /dev/vg_diskA/lv_test
Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha1
Payload offset: 4096
MK bits: 256
MK digest: a0 60 1e ff 87 d1 b9 94 bd 3d ca 13 d2 4b f4 be 08 ea 28 ff
MK salt: 81 0a b8 4a 1b 7b 86 3c 52 02 ea 69 bd 2c 16 3e
7a 16 27 1f a9 7b 52 7b 7b 99 bb 11 92 54 ec 65
MK iterations: 27875
UUID: 4a5bb291-4d54-440e-997c-40885e1ac908
Key Slot 0: ENABLED
Iterations: 112280
Salt: d6 d5 9e 3b 6c 8e 91 9e 9b c6 26 ce b5 68 b8 b7
d1 62 9a 8f 9f 22 8c ad 3e d2 08 1c 1e 4b bc 5e
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
add the keyfile into a new key slot:
$ sudo cryptsetup luksAddKey /dev/vg_diskA/lv_test /tmp/testkey
Enter any passphrase: 123456
$ sudo cryptsetup luksDump /dev/vg_diskA/lv_test
LUKS header information for /dev/vg_diskA/lv_test
Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha1
Payload offset: 4096
MK bits: 256
MK digest: a0 60 1e ff 87 d1 b9 94 bd 3d ca 13 d2 4b f4 be 08 ea 28 ff
MK salt: 81 0a b8 4a 1b 7b 86 3c 52 02 ea 69 bd 2c 16 3e
7a 16 27 1f a9 7b 52 7b 7b 99 bb 11 92 54 ec 65
MK iterations: 27875
UUID: 4a5bb291-4d54-440e-997c-40885e1ac908
Key Slot 0: ENABLED
Iterations: 112280
Salt: d6 d5 9e 3b 6c 8e 91 9e 9b c6 26 ce b5 68 b8 b7
d1 62 9a 8f 9f 22 8c ad 3e d2 08 1c 1e 4b bc 5e
Key material offset: 8
AF stripes: 4000
Key Slot 1: ENABLED
Iterations: 111692
Salt: f9 9f bb 58 62 a1 97 8a 65 df b9 aa ce b8 fe 8d
15 09 dc 75 74 22 ac 5b b0 78 fe af c6 76 2e a0
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
noticed that always the first key (slot 0) is the "master key" to add or remove keys from slots.
the same rule applies if you are using a keyfile.
now its time to remove the key passphrase from slot 0:
sudo cryptsetup luksKillSlot /dev/vg_diskA/lv_test 0 --key-file /tmp/testkey
$ sudo cryptsetup luksDump /dev/vg_diskA/lv_test
LUKS header information for /dev/vg_diskA/lv_test
Version: 1
Cipher name: aes
Cipher mode: xts-plain64
Hash spec: sha1
Payload offset: 4096
MK bits: 256
MK digest: a0 60 1e ff 87 d1 b9 94 bd 3d ca 13 d2 4b f4 be 08 ea 28 ff
MK salt: 81 0a b8 4a 1b 7b 86 3c 52 02 ea 69 bd 2c 16 3e
7a 16 27 1f a9 7b 52 7b 7b 99 bb 11 92 54 ec 65
MK iterations: 27875
UUID: 4a5bb291-4d54-440e-997c-40885e1ac908
Key Slot 0: DISABLED
Key Slot 1: ENABLED
Iterations: 111692
Salt: f9 9f bb 58 62 a1 97 8a 65 df b9 aa ce b8 fe 8d
15 09 dc 75 74 22 ac 5b b0 78 fe af c6 76 2e a0
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
as you see, slot 0 is DISABLED and we used the keyfile as the "master" key to this encrypted volume disk.