Conociendo luks mediante cryptsetup

En estos tiempos que corren y con lo fácil que resulta, todos deberiamos tener los discos duros cifrados. Esto tiene las ventajas de siempre, confidencialidad y esas cosas de modernos. Pero tiene también alguna desventaja, que a su vez es su propia función. Es imposible recuperar los datos de ese disco, ya sea si hay algún error de hardware en el disco, si se te olvida la contraseña o si, cómo me pasó a mi, te cargas la clave para abrir el disco.

Antes de nada, empecemos por lo básico. LUKS es el estándar de cifrado de disco en GNU/Linux. Funciona sin importar la distribución que se use. No sólo cifra el disco, maneja de multiples claves del cifrado (tanto contraseñas cómo archivos de claves), permite revocar estas, es seguro ante ataques de entropia baja, entre otros. LUKS se hizo con dos cosas en mente: crear un estándar, cómo ya hemos dicho, y permitir el borrado o inaccesibilidad de los datos de manera rápida e incluso su camuflaje.

Esto último se hace manejando lo que se llaman las cabeceras de luks (luks headers in íngli). Un ejemplo de estas es lo siguiente:

# cryptsetup luksDump /dev/sdx2
LUKS header information for /dev/sdx2

Version:        1
Cipher name:    aes
Cipher mode:    cbc-essiv:sha256
Hash spec:      sha1
Payload offset: 4096
MK bits:        256
MK digest:      e5 88 07 f2 4b ce 79 21 85 34 f7 a6 e3 0b 6b b2 a7 b8 d5 a1
MK salt:        0c dd 95 3d 1e 30 1f 66 d4 5e 31 03 12 a0 61 29
                e5 ef 34 8e 13 5d 80 76 8b 4a 0a c3 55 02 22 d3
MK iterations:  5750
UUID:           e4971160-047b-49ce-8246-b63f1fb67db9

Key Slot 0: ENABLED
        Iterations:             23233
        Salt:                   ff bc fc 78 98 5d 35 50 97 76 37 b4 70 99 38 44
                                9f bd a1 b9 02 2d 4d 1d 18 b5 dc f6 4c a0 37 fc
        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

Ahí se ven distintos datos que más o menos se podrán entender. Se ve que usa el cifrado aes con cifrado de bloques (cbc) salteado con sha1. También se puede ver que tiene una sola clave activada en el Key Slot 0, son su iteraciones, salt y esas cosas que parecen Matrix.

La cosa es que sta cabecera es lo que identifica un disco cifrado con luks cómo tal. Sin esta, no se puede saber que este es un disco cifrado. Pongamos el caso de un aeropuerto de uno de esos absurdos paises en los que si te ven con un disco cifrado, te pueden pedir que los abras para echarle un vistazo. Entonces, una solución para evitar eso sería cargarse la cabecera de luks y cuando pidan que se encienda poner la mejor cara de cuñao que tengamos y soltar algo del tipo «uff, no veas con el críptico mensaje este de ‘Missing operating system’, con lo que me costó estabilizar el condensador de fluzo». Y a volar, literalmente, esperemos. La gracia de todo esto es que, aún rompiendo la cabecera, si la restauramos podremos acceder a los datos cifrados cómo si nada.

Y eso es lo que veremos a continuación. Hacer un backup de las cabeceras de luks, que es algo recomendable porqué en el FAQ de cryptsetup vemos que la gente se las apaña para romperla sin hacer nada, cargarnoslas y restaurarlas.

Antes de nada, que quede claro que nadie deberia tocar si no está segura de lo que hace y, sobretodo, si no ha hecho un backup. Repetid conmigo: TENGO QUE HACER UN BACKUP ANTES DE TOCAR.

Al lío, el proceso es más sencillo de lo que puede parecer a primera vista:

# cryptsetup luksHeaderBackup /dev/sdx1 --header-backup-file portatil-header.bak

Dónde sdx es el nombre del dispositivo cifrado y portatil-header.bak es el backup del header. Sencillo, cómo prometí. Ahora nos cargaremos el header. Este se puede hacer a pelo, volcando archivos de /dev/zero en el inicio de la partición o dispositivo cifrado. Para no pasarnos de borrado, tenemos que hacer un pequeño cálculo. Cada keyslot o espacio de llave ocupa, apróximadamente unos 1052672 bytes. Así que deberiamos multiplicar este número por el número de claves que se tengan, da run margen de dos claves más y entonces hacer:

# cryptsetup -v isLuks /dev/sdx1
# head -c 3145728 /dev/zero > /dev/sdx1
# cryptsetup -v isLuks /dev/sdx1

Este seria el ejemplo para cargarse un keyslot. isLuks nos dice si el dispositivo en cuestión es un dispositivo luks. El primero debería devolver las siguientes líneas, respectivamente:

Command successful.
Command failed with code 22: Device /dev/sdb1 is not a valid LUKS device.

Otra forma de verlo es con gparted. gparted

Y para restaurar la cabecera, simplemente haremos:

# cryptsetup luksHeaderRestore /dev/sdx1 --header-backup-file portatil-header.bak
# cryptsetup -v isLuks /dev/sdx1

Y veremos que todo se ha restaurado correctamente. Precaución: Hay que ir con mucho cuidado, una de las cuatro veces que he probado se ha corrompido el sistema de ficheros y he tenido que formatear. No tengo muy claro porqué, pero creo que ha sido debido a que he volcado demasiados ceros. PD: para evitar poner cara de gilipollas al cargaros una clave:

# chattr +i clave.luks

Y así no la podréis borrar sin querer.

PD2: Puede que a más de una piense que lo suyo seria tener la opción de borrar la cabecera ante la inserción de una contraseña concreta o al meter tres veces una contraseña incorrecta. Aquí (el punto 5.21) explica su desarrollador que no lo ve útil ya que actualmente, quien accede a un disco duro lo primero que hace es clonarlo. En cualquier caso a raiz de la opción de nukear el disco en kali linux, surgió un debate en el que no queda claro que se puede hacer y que si al final se deciden a hacerlo, lo harán cómo una opción al compilar o alguna cosa similar, para alejar su uso al usuario medio.

Fuente: cryptsetup

Compartir

11 Comentarios

  1. todos deberiamos tener los discos duros cifrados.

    ¡Estoy de acuerdo! Principalmente en notebooks, netbooks, raspberry-pis (si te la pasás llevándolas de aquí para allá) y, si es posible, cualquier dispositivo portátil.

    El pretexto que uso para poder «vender» un disco cifrado es que si te roban la notebook, no podrán recuperar nada sin la clave y tu trabajo y tu información personal está a salvo. Claro, son más claves y, por eso, más molestias, pero vale la pena.

    ¡¡¡Gracias por el post!!! Muy bueno :-)

  2. Muy interesante ;) , conocia luks, pero no el «truco» de borrar la cabecera, muy util para estos tiempos que nos quedan por vivir.

  3. No hago los pasos de este post ni de coña. Estoy seguro de que en la documentación hay datos suficientes como para saber el tamaño exacto de la cabecera, y no ese «ocupa aproximadamente nosecuantos bytes». Si de 4 veces que lo has hecho se te ha corrompido 1, no lo hago en mis discos ni de coña, es peor que la ruleta rusa ( probabilidad 1/6 de que se dispare el arma xD ).

    Saludos !!

    1. No. Se puede ver haciendo un luksDump, pero he preferido no explicar eso. El motivo de que no salga es que es variable, según el tamaño de las claves y la cantidad de claves que tienes.

  4. Pregunta….

    ¿Y si sobreescribimos con 0’s MENOS bytes para estar seguros de no corromper nada?

    Al fin y al cabo estamos estropeando igualmente la información de la cabecera y ya no se va a poder reconocer como partición cifrada.

    1. Es posible que sirva, no lo he probado. En su documentación mencionan un cálculo cuyo resultado he puesto (dos MB más 1Mb por clave por las claves que tengas). Creo que si se hiciese lo que dices efectivamente no se detectaria a primera vista pero la información sobre la clave podría ser visible ante un una inspección más laboriosa.

  5. He seguido los pasos para hacerme un backup del header LUKS por si acaso y un script tipo recover con esto, una imagen del MRB y la tabla de particiones. Me parece una buena práctica. Saludos.

    1. Me alegro de que te haya servido. Además, viendo el FAQ de luks se ve que la gente se las apaña para romperlas sin querer muy a menudo.

Deja una respuesta

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax