Cambiar contraseña en un sistema de archivos LUKS sin conocer la contraseña

30

Tengo un servidor Debian Wheezy que se ha estado ejecutando durante un tiempo con una unidad cifrada. La contraseña de la unidad cifrada ( /dev/sda5) se perdió cuando mi archivo de contraseña cifrada estaba dañado.

Me gustaría poder reiniciar este servidor, pero eso, por supuesto, requerirá esa contraseña. Dado que la unidad está claramente en un estado descifrado, ¿hay alguna forma de cambiar la contraseña sin conocer la anterior?

cryptsetup luksChangeKey /dev/sda5 requiere la contraseña del volumen.

Por supuesto, podría rsynceliminar todo y reconstruirlo, pero me gustaría evitarlo. Miré a través de la memoria ( #cat /dev/mem | less), pero no pude encontrarlo (¡lo cual es muy bueno!).

Ethan
fuente
2
Hmmmm ... ¿Cuál sería el punto de tener un sistema de archivos encriptado si fuera tan fácil acceder a él sin la contraseña?
mdpc
77
@mdpc: Tu comentario no tiene sentido. Se tiene acceso al sistema de archivos, porque él tenía la contraseña cuando el último servidor de arranque.
G-Man dice 'reinstalar a Monica' el
2
Solo porque TENÍAS la contraseña (y se dañó) no invalida mi comentario. En general, si olvida la contraseña para cualquier tipo de material encriptado, debe perderse para siempre, de lo contrario, ¿cuál fue el punto de encriptarlo en primer lugar?
mdpc
3
@mdpc Tiempo presente, tiene acceso actual al sistema de archivos.
Patrick
Misma pregunta sobre el Súper Usuario: Contraseña LUKS perdida, partición encriptada abierta (no respondida).
G-Man dice 'Restablecer a Monica' el

Respuestas:

40

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)

devicey volume_namedebe establecerse adecuadamente.
volume_namees 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-filepara 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.

Patricio
fuente
No estoy seguro de si estoy haciendo algo mal, pero mi LUKS no muestra una cadena como la que está mostrando en el ejemplo. Es un pequeño número corto de 9 dígitos. También el mío se muestra como "8: 3 lineal".
slm
@slm Si se muestra linear, entonces ese no es un volumen LUKS abierto (valor incorrecto para volume_nameel comando proporcionado). Un volumen LUKS abierto tendrá crypten el tercer campo. En cryptsetup luksOpen /dev/foo bar, el volume_namevalor sería bar.
Patrick
Ya lo pillo. Hay un volumen debajo de /dev/mappernombrado luks-...... Ese es el volumen que necesita usar, no el volumen lógico mapeado LVM.
slm
1
Parece que con versiones recientes de dmsetup, el formato de dmsetup tableha cambiado. Al menos para mí, la clave maestra se muestra en la columna $6.
Karol Babioch
@KarolBabioch probablemente no especificó el nombre del volumen?
frostschutz