Как изменить хеш-спецификацию и время существования существующего устройства LUKS dm-crypt?

11

Как я могу изменить хеш-спецификацию и время существования существующего устройства LUKS dm-crypt?

Ясно, что я могу передать параметры, если я создаю новое устройство, например что-то вроде этого:

 sudo cryptsetup luksFormat --cipher aes-cbc-essiv:sha256 --key-size 256 --iter-time 2100 --hash sha512 /dev/loop0

Но если устройство уже существует, то как я могу изменить, например , sha256чтобы sha1или изменить время итерации без «уничтожения» устройства. (Очевидно, вам придется повторно ввести пароль, поскольку будет сгенерирован новый хэш.)

ученик
источник
Что ты не понимаешь в моем вопросе?
студент
Может быть, только я, но я считаю, что было бы невежливо просить 1 предложение Q по крайней мере со ссылкой на страницу руководства или учебник, или что-то, что вы пытаетесь следовать со спецификой, такой как «что» hash-specили « iter-timeнастройки» более конкретны.
SLM
Я думаю, что мы раньше работали вместе над Q (и вы обычно помещаете в них отличные детали), и это застало меня врасплох, что на этот раз вы этого не сделали.
SLM
У меня нет больше информации в этом случае, и я не нашел то, что я хочу, на странице руководства ...
студент
2
Также есть упоминание другого инструмента , cryptsetup-reencrypt. Список маркеров напоминает то, что вы пытаетесь сделать со мной: «изменить произвольные параметры шифрования».
SLM

Ответы:

6

Каждый ключевой слот имеет свое время итерации. Если вы хотите изменить количество итераций, создайте новый слот с той же парольной фразой и новым количеством итераций, а затем удалите старый слот.

cryptsetup -i 100000 --key-slot 2 luksAddKey $device
cryptsetup luksKillSlot $device 1

Я думаю, что алгоритм хеширования не может быть настроен для каждого слота, это всегда PBKDF2 с глобально выбранной хэш-функцией.

Последние версии cryptsetup включают в себя инструмент cryptsetup-reencrypt, который может изменять основной ключ шифрования и все параметры, но он считается экспериментальным (и он перешифрует все устройство, даже если в этом нет необходимости просто изменять функцию получения ключа на основе пароля) ,

Жиль "ТАК - перестань быть злым"
источник
9

Если все, что вы хотите изменить, - это хеш, нет необходимости повторно шифровать. Вам все еще нужно создать новый заголовок LUKS. Тот же шифр, тот же главный ключ, то же смещение, другой хеш.

Вы можете попробовать это для себя. Сначала мы настроили устройство LUKS со стандартными настройками и количеством паршивых итэров:

# truncate -s 8M /dev/shm/foobar
# cryptsetup --iter-time=42 luksFormat /dev/shm/foobar

WARNING!
========
This will overwrite data on /dev/shm/foobar irrevocably.

Are you sure? (Type uppercase yes): YES
Enter passphrase: 
Verify passphrase: 
# cryptsetup luksOpen /dev/shm/foobar foobar
Enter passphrase for /dev/shm/foobar: 
# shred -z /dev/mapper/foobar
# echo Hello World I am LUKS > /dev/mapper/foobar
# strings /dev/mapper/foobar
Hello World I am LUKS
# cryptsetup luksClose foobar

На данный момент у нас есть устройство LUKS с зашифрованными данными «Hello World I am LUKS». В частности это выглядит так:

# cryptsetup luksDump /dev/shm/foobar
LUKS header information for /dev/shm/foobar

Version:        1
Cipher name:    aes
Cipher mode:    xts-plain64
Hash spec:      sha1
Payload offset: 4096
MK bits:        256
MK digest:      30 87 62 81 8e 8f a9 15 68 e0 82 c0 dc ee 19 54 9b f2 eb 5c 
MK salt:        c3 e0 28 53 67 10 13 d4 43 e3 7b d1 ce 62 6b e3 
                58 85 ee 67 71 76 b6 48 78 a8 34 71 58 71 21 f8 
MK iterations:  6175
UUID:           14a0a11d-0890-433e-bdcb-d2d1f5281bc2

Key Slot 0: ENABLED
    Iterations:             26033
    Salt:                   a1 7b 2b 5b 3d 8c 3c d1 3b 57 61 5a df 25 47 c8 
                            29 97 62 09 08 2b e1 b2 af 61 56 80 2f af a6 ae 
    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

Как видите, паршивая итерация считается стандартным хэшем sha1.

Чтобы переключить это на большое число итераций и хэш sha512, без повторного шифрования нам нужен новый заголовок LUKS, использующий тот же главный ключ, тот же шифр и то же смещение полезной нагрузки.

Получение мастер-ключа: (Предупреждение: в этом примере ваш мастер-ключ просачивается в общедоступный файл, в список процессов, а также в историю вашей оболочки. На всякий случай делайте это в ОЗУ / на Live CD / как угодно)

# cryptsetup --dump-master-key luksDump /dev/shm/foobar

WARNING!
========
Header dump with volume key is sensitive information
which allows access to encrypted partition without passphrase.
This dump should be always stored encrypted on safe place.

Are you sure? (Type uppercase yes): YES
Enter passphrase: 
LUKS header information for /dev/shm/foobar
Cipher name:    aes
Cipher mode:    xts-plain64
Payload offset: 4096
UUID:           14a0a11d-0890-433e-bdcb-d2d1f5281bc2
MK bits:        256
MK dump:    eb aa 57 2d 42 93 fe 90 00 b9 d2 e0 e0 7b 73 26 
            4b 64 1b 8b 8e 61 75 84 1b c3 d6 f7 3f 03 d2 14 

# printf '\xeb\xaa\x57\x2d\x42\x93\xfe\x90\x00\xb9\xd2\xe0\xe0\x7b\x73\x26\x4b\x64\x1b\x8b\x8e\x61\x75\x84\x1b\xc3\xd6\xf7\x3f\x03\xd2\x14' > /dev/shm/masterkey
# hexdump -C /dev/shm/masterkey
00000000  eb aa 57 2d 42 93 fe 90  00 b9 d2 e0 e0 7b 73 26  |..W-B........{s&|
00000010  4b 64 1b 8b 8e 61 75 84  1b c3 d6 f7 3f 03 d2 14  |Kd...au.....?...|
00000020

Создайте новый заголовок LUKS, используя этот ключ: (возможен сбой - сначала сделайте резервную копию вашего старого заголовка LUKS!)

# cryptsetup --master-key-file=/dev/shm/masterkey --iter-time=5000 --hash=sha512 luksFormat /dev/shm/foobar

WARNING!
========
This will overwrite data on /dev/shm/foobar irrevocably.

Are you sure? (Type uppercase yes): YES
Enter passphrase: 
Verify passphrase: 

И вот как это выглядит:

# cryptsetup luksDump /dev/shm/foobar
LUKS header information for /dev/shm/foobar

Version:        1
Cipher name:    aes
Cipher mode:    xts-plain64
Hash spec:      sha512
Payload offset: 4096
MK bits:        256
MK digest:      47 ab 7b c6 41 b0 7c d8 af 3c a0 a4 23 e6 72 87 9c 0f c6 a0 
MK salt:        32 49 a5 b5 cb 4d 8a d7 25 69 72 ae e5 b2 9e 9d 
                14 09 00 1d 01 f3 c9 99 da e1 6c fc 69 78 e4 64 
MK iterations:  393750
UUID:           fd554ae8-a862-4609-8327-c6dd65ee9a83

Key Slot 0: ENABLED
    Iterations:             1578295
    Salt:                   e5 75 1c 1f 63 1d c6 0b d9 27 1a b1 27 85 b9 c1 
                            89 e8 57 95 2a c8 a0 24 9c 29 c0 f2 27 d7 2f 9a 
    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

Теперь у нас это есть. Тот же шифр, смещение [если они различаются, вы должны указать их вместе с luksFormat], новый хеш и правильное количество итераций.

Но содержание все еще там?

# cryptsetup luksOpen /dev/shm/foobar foobar
Enter passphrase for /dev/shm/foobar: 
# strings /dev/mapper/foobar
Hello World I am LUKS

Вот и ты.

frostschutz
источник
6
cryptsetup-reencrypt --keep-key --hash sha512делает то же самое.
frostschutz