¿Cómo cambiar el hash-spec y el iter-time de un dispositivo LUKS dm-crypt existente?

11

¿Cómo puedo cambiar el hash-spec y el iter-time de un dispositivo LUKS dm-crypt existente ?

Claramente puedo pasar las opciones si creo un nuevo dispositivo, por ejemplo algo como esto:

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

Pero si el dispositivo ya existe, ¿cómo puedo cambiar por ejemplo sha256a sha1o cambiar el tiempo de iteración sin "destruir" el dispositivo. (Claramente, tendría que volver a escribir su contraseña ya que se generará un nuevo hash).

estudiante
fuente
¿Qué no entiendes en mi pregunta?
estudiante
Podría ser solo yo, pero considero de mala educación hacer una pregunta de 1 oración sin al menos hacer referencia a una página de manual o un tutorial o algo que intente seguir con detalles como qué hash-speces o qué iter-timeconfiguración es más específica.
slm
Supongo que hemos trabajado juntos antes en Q's (y usualmente les pones detalles excelentes) y me tomó por sorpresa que esta vez no lo hiciste.
slm
No tengo más información en este caso y no encontré lo que quiero en la página del manual ...
estudiante
2
También hay mención de otra herramienta , cryptsetup-reencrypt. La lista de viñetas suena como lo que estás intentando hacerme: "cambiar parámetros de cifrado arbitrarios".
slm

Respuestas:

6

Cada ranura de tecla tiene su propio tiempo de iteración. Si desea cambiar el número de iteraciones, cree una nueva ranura con la misma frase de contraseña y una nueva cantidad de iteraciones, luego elimine la ranura anterior.

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

Creo que el algoritmo hash no se puede configurar por ranura, siempre es PBKDF2 con una función hash elegida globalmente.

Las versiones recientes de cryptsetup incluyen una herramienta cryptsetup-reencrypt, que puede cambiar la clave de cifrado principal y todos los parámetros, pero se considera experimental (y vuelve a cifrar todo el dispositivo, aunque esto no sería necesario simplemente cambiar la función de derivación de clave basada en contraseña) .

Gilles 'SO- deja de ser malvado'
fuente
9

Si todo lo que desea cambiar es el hash, no hay necesidad de volver a cifrar. Sin embargo, aún debe crear un nuevo encabezado LUKS. El mismo cifrado, la misma clave maestra, el mismo desplazamiento, diferente hash.

Puedes probar esto por ti mismo. Primero, configuramos un dispositivo LUKS con configuraciones estándar y pésimos recuentos:

# 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

En este punto tenemos un dispositivo LUKS con los datos encriptados "Hola mundo, soy LUKS". En particular se ve así:

# 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

Como puede ver, la iteración pésima cuenta, los hash sha1 estándar.

Para cambiar eso a altos recuentos de iteraciones y hash sha512, sin volver a cifrar, necesitamos un nuevo encabezado LUKS que use la misma clave maestra, el mismo cifrado y el mismo desplazamiento de carga útil.

Obtención de la clave maestra: (Advertencia: este ejemplo filtra su clave maestra a un archivo legible en todo el mundo, a la lista de procesos, así como al historial de su shell. Para estar seguro, hágalo en RAM / en un Live CD / lo que sea)

# 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

Cree el nuevo encabezado LUKS con esta clave: (el error es posible: ¡haga una copia de seguridad de su antiguo encabezado LUKS primero!)

# 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: 

Y así es como se ve:

# 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

Ahora lo tenemos. El mismo cifrado, desplazamiento [si difieren, debe especificarlos junto con luksFormat], nuevo hash y el número adecuado de iteraciones.

¿Pero el contenido sigue ahí?

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

Ahí tienes.

Frostschutz
fuente
66
cryptsetup-reencrypt --keep-key --hash sha512hace lo mismo
frostschutz