Sim, você pode fazer isso acessando a chave mestra enquanto o volume é descriptografado.
O rápido e sujo para adicionar uma nova frase-senha:
device=/dev/sda5
volume_name=foo
cryptsetup luksAddKey $device --master-key-file <(dmsetup table --showkeys $volume_name | awk '{ print $5 }' | xxd -r -p)
device
e volume_name
devem ser definidos adequadamente.
volume_name
é o nome do volume descriptografado, aquele que você vê em /dev/mapper
.
Explicação:
Os volumes LUKS criptografam seus dados com uma chave mestra. Cada frase secreta adicionada simplesmente armazena uma cópia dessa chave mestra criptografada com essa frase secreta. Então, se você tiver a chave mestra, basta usá-la em um novo slot de chave.
Vamos separar o comando acima.
$ dmsetup table --showkeys $volume_name
Isso despeja um monte de informações sobre o volume ativamente descriptografado. A saída é assim:
0 200704 crypt aes-xts-plain64 53bb7da1f26e2a032cc9e70d6162980440bd69bb31cb64d2a4012362eeaad0ac 0 7:2 4096
O campo # 5 é a chave mestra.
$ dmsetup table --showkeys $volume_name | awk '{ print $5 }' | xxd -r -p
Não mostrará a saída disso como dados binários, mas o que isso faz é pegar a chave mestra do volume e depois convertê-la em dados binários brutos, necessários posteriormente.
$ cryptsetup luksAddKey $device --master-key-file <(...)
Isso está dizendo cryptsetup para adicionar uma nova chave para o volume. Normalmente, essa ação requer uma chave existente, no entanto, usamos --master-key-file
para informar que queremos usar a chave mestra.
A <(...)
é a substituição do comando shell & redirecionamento. Basicamente, ele executa tudo internamente, envia a saída para um pipe e, em seguida, substitui o <(...)
por um caminho para esse pipe.
Assim, o comando inteiro é apenas um verso para condensar várias operações.