Como alterar a especificação de hash e o tempo de iter de um dispositivo LUKS dm-crypt existente?

11

Como posso alterar a especificação de hash e o tempo de iter de um dispositivo LUKS existente do dm-crypt?

Claramente, 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á existe, como posso mudar por exemplo sha256a sha1ou alterar o tempo de iteração sem "destruir" o dispositivo. (Claramente, você teria que redigitar sua senha, pois um novo hash será gerado.)

aluna
fonte
O que você não entende na minha pergunta?
estudante de
Pode ser apenas eu, mas considero indelicado pedir uma frase de 1 frase sem pelo menos fazer referência a uma página de manual ou a um tutorial ou a algo que você está tentando seguir com detalhes específicos, como o que hash-specé ou as iter-timeconfigurações mais especificamente.
slm
Acho que já trabalhámos juntos antes nos Q's (e você costuma colocar excelentes detalhes neles) e me pegou de surpresa que desta vez não o fez.
slm
Eu não tenho mais informações neste caso e não encontrei o que eu quero na página de manual ... #
1516 de estudante
2
Também há menção de outra ferramenta , cryptsetup-reencrypt. A lista de marcadores parece com o que você está tentando fazer comigo: "alterar parâmetros de criptografia arbitrários".
slm

Respostas:

6

Cada slot de chave possui seu próprio tempo de iteração. Se você deseja alterar o número de iterações, crie um novo slot com a mesma senha e um novo número de iterações e 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-reencryptque pode alterar a chave de criptografia principal e todos os parâmetros, mas é considerado experimental (e reescreve o dispositivo inteiro, mesmo que isso não seja necessário para alterar apenas a função de derivação de chave baseada em senha) .

Gilles 'SO- parar de ser mau'
fonte
9

Se tudo o que você deseja alterar é o hash, não há necessidade de criptografar novamente. Você ainda precisa criar um novo cabeçalho LUKS. Mesma cifra, mesma chave mestra, mesmo deslocamento, hash diferente.

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

# 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 "Olá, mundo, sou LUKS". Em particular, é assim:

# 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 iteração ruim conta, os hashes sha1 padrão.

Para mudar isso para contagens de iteração alta e hash sha512, sem precisar criptografar novamente, 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: (Aviso: este exemplo vaza sua chave mestra em um arquivo legível pelo mundo, na lista de processos e no histórico do seu shell. Para segurança, faça-o na RAM / em um Live CD / qualquer outra coisa)

# 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 antigo LUKS 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. A mesma cifra, deslocamento [se eles diferem, você deve especificá-los juntamente com o luksFormat], novo hash e número adequado de iterações.

Mas o conteúdo ainda está aí?

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

Ai está.

frostschutz
fonte
6
cryptsetup-reencrypt --keep-key --hash sha512faz a mesma coisa.
frostschutz