Como alterar o hash-spec e iter-time de um dispositivo LUKS dm-crypt existente?

11

Como posso alterar a hash-spec e iter-time de um dispositivo LUKS existente dm-crypt?

É evidente que posso passar as opções se criar um novo dispositivo, por exemplo, algo como isto:

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

Mas se o dispositivo já existir, como posso alterar, por exemplo, sha256 para sha1 ou alterar o tempo de iteração sem "destruir" o dispositivo. (É claro que você teria que digitar novamente sua senha, pois um novo hash seria gerado.)

    
por student 15.11.2013 / 22:07

2 respostas

4

Cada slot de chave tem seu próprio tempo de iteração. Se você quiser alterar o número de iterações, crie um novo espaço com a mesma frase secreta e um novo número de iterações e, em seguida, remova o slot antigo.

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

Eu acho que o algoritmo hash não pode ser configurado por slot, é sempre PBKDF2 com uma função hash escolhida globalmente.

As versões recentes do cryptsetup incluem uma ferramenta cryptsetup-reencrypt , que pode alterar a chave de criptografia principal e todos os parâmetros, mas é considerado experimental (e ele criptografa novamente todo o dispositivo, mesmo que isso não seja necessário apenas para alterar a função de derivação de chave baseada em senha).

    
por 18.11.2013 / 01:37
8

Se tudo o que você deseja alterar é o hash, não é necessário criptografar novamente. Você ainda tem que construir um novo cabeçalho LUKS embora. Mesma cifra, mesma chave mestra, mesmo offset, hash diferente.

Você pode tentar isso por si mesmo. Primeiro, configuramos um dispositivo LUKS com configurações padrão e contagens ruins:

# 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

Neste ponto, temos um dispositivo LUKS com os dados criptografados "Hello World I am LUKS". Em particular, parece com isso:

# 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 você pode ver, a contagem de iterações é baixa, hashes sha1 padrão.

Para mudar isso para contagens de alta iteração e hash sha512, sem re-criptografar, precisamos de um novo cabeçalho LUKS usando a mesma chave mestra, a mesma cifra e o mesmo deslocamento de carga útil.

Obtendo a chave mestra: (Atenção: este exemplo vaza sua chave mestra para um arquivo legível para o mundo, para a lista de processos, bem como para o histórico do seu shell. Para ser seguro, faça isso em RAM / em um Live CD / o que quer que seja)

# 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

Crie o novo cabeçalho LUKS usando esta chave: (falha é possível - faça um backup do seu cabeçalho LUKS antigo primeiro!)

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

E aqui está o que parece:

# 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

Agora nós temos isso. Mesma cifra, offset [se diferirem você deve especificá-los junto com o luksFormat], novo hash e número apropriado de iterações.

Mas o conteúdo ainda está lá?

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

Lá vai você.

    
por 12.01.2015 / 15:11

Tags