Sí, puede hacerlo accediendo a la clave maestra mientras se descifra el volumen.
El rápido y sucio para agregar una nueva frase de contraseña:
device=/dev/sda5
volume_name=foo
cryptsetup luksAddKey $device --master-key-file <(dmsetup table --showkeys $volume_name | awk '{ print $5 }' | xxd -r -p)
device
y volume_name
debe establecerse adecuadamente.
volume_name
es el nombre del volumen descifrado, el que ves en /dev/mapper
.
Explicación:
Los volúmenes LUKS cifran sus datos con una clave maestra. Cada frase de contraseña que agregue simplemente almacena una copia de esta clave maestra cifrada con esa frase de contraseña. Entonces, si tiene la clave maestra, simplemente necesita usarla en una nueva ranura de clave.
Vamos a romper el comando de arriba.
$ dmsetup table --showkeys $volume_name
Esto arroja un montón de información sobre el volumen descifrado activamente. La salida se ve así:
0 200704 crypt aes-xts-plain64 53bb7da1f26e2a032cc9e70d6162980440bd69bb31cb64d2a4012362eeaad0ac 0 7:2 4096
El campo # 5 es la clave maestra.
$ dmsetup table --showkeys $volume_name | awk '{ print $5 }' | xxd -r -p
No voy a mostrar el resultado de esto, ya que son datos binarios, pero lo que hace es tomar la clave maestra para el volumen y luego convertirlo en datos binarios sin procesar que se necesitarán más adelante.
$ cryptsetup luksAddKey $device --master-key-file <(...)
Esto le dice a cryptsetup que agregue una nueva clave al volumen. Normalmente, esta acción requiere una clave existente, sin embargo, usamos --master-key-file
para decirle que queremos utilizar la clave maestra en su lugar.
La <(...)
sustitución y redirección de comandos de shell es. Básicamente ejecuta todo lo que está dentro, envía la salida a una tubería y luego la sustituye <(...)
por una ruta a esa tubería.
Entonces, todo el comando es solo una línea para condensar varias operaciones.