Logotipo LUKS

Copia de seguridad del encabezado de una partición cifrada con LUKS

 
 

Índice General

  1. Introducción
  2. Copia de seguridad y restauración con cryptsetup
  3. Copia de seguridad y restauración de forma manual

 

  1. Introducción (Volver al índice General)
    Si el encabezado de una partición cifrada con LUKS se destruye, no podremos descifrar la información que contiene. Lo mismo ocurriría si olvidamos la contraseña o se daña un archivo de claves utilizados para desbloquear una partición cifrada. Por lo tanto, es una buena idea tener una copia de seguridad del encabezado y almacenarla en otro dispositivo.

    Hacer copias de seguridad de los encabezados de LUKS, es bastante sencillo utilizando el comando cryptsetup.

    A continuación, veremos dos métodos para realizar copias de seguridad del encabezado de una partición cifrada y como restaurar la copia llegado el caso.

    Nota: Te aconsejamos que en vez de probar todo lo que viene a continuación en tu sistema en producción, crees una máquina virtual con particiones cifradas para hacer las pruebas y luego lo apliques a tu sistema en producción. En ZeppelinuX se ha publicado el artículo Cómo instalar Debian 10 buster el cual te ayudará a configurar la máquina virtual, y el artículo Cómo instalar Debian 10 con particiones cifradas con LUKS el cual te servirá de laboratorio para poner en práctica las técnicas que a continuación se explican.

  2.  

  3. Copia de seguridad y restauración con cryptsetup (Volver al índice General)
    En este método, utilizaremos el comando cryptsetup para realizar tanto la copia de seguridad como la restauración de la misma.
     

    • Realizar copia de seguridad con cryptsetup (Volver al índice General)
      La acción luksHeaderBackup de cryptsetup nos permite almacenar una copia de seguridad binaria de la cabecera LUKS y del área de ranuras de claves.

      Lo primero que tenemos que hacer es asegurarnos que particiones son las que llevan cifrado. Para listar las particiones cifradas existen varios comandos, nosotros utilizaremos lsblk.

      Al ejecutar este comando en mi sistema obtuve la siguiente salida:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      
      $ lsblk -p
      NAME                                               MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
      /dev/sda                                             8:0    0   30G  0 disk  
      ├─/dev/sda1                                          8:1    0  243M  0 part  /boot
      ├─/dev/sda2                                          8:2    0    1K  0 part  
      └─/dev/sda5                                          8:5    0 29,8G  0 part  
        └─/dev/mapper/sda5_crypt                         254:0    0 29,8G  0 crypt     ├─/dev/mapper/charlybrown--debian--vg-swap--vl 254:1    0  2,9G  0 lvm   [SWAP]
          └─/dev/mapper/charlybrown--debian--vg-root--vl 254:2    0 26,9G  0 lvm   /
      /dev/sr0

      En la línea 7 podemos ver que la partición cifrada de mi sistema es la /dev/sda5. Esta información será crucial para realizar la copia de seguridad y la restauración.

      El comando genérico para realizar la copia de seguridad sería el siguiente:

      $ sudo cryptsetup luksHeaderBackup /dev/<dispositivo> --header-backup-file /mnt/<backup>/<file>.img</file></backup></dispositivo>

      Donde /dev/<dispositivo> es la partición que contiene el volumen LUKS, /mnt/<backup>/ es la ruta al punto de montaje del dispositivo donde almacenaremos la copia de seguridad y <file>.img es el nombre que le daremos a la copia de seguridad.
       

      • Veamos un caso real (Volver al índice General)
        En nuestro ejemplo, realizaremos la copia de seguridad y la copiaremos en una memoria USB. Los pasos a seguir serán los siguientes:

        1. Creamos la carpeta /mnt/usb16GB donde montaremos una memoria USB en la que guardaremos la copia de seguridad:
          $ sudo mkdir /mnt/usb16GB
        2. Conectamos la memoria USB y ejecutamos el siguiente comando para conocer a que dispositivo está asociado:
          $ sudo fdisk -l
        3. En nuestro ejemplo, la memoria USB es el dispositivo /dev/sdb1 y lo montamos con el siguiente comando:
          $ sudo mount -t auto /dev/sdb1 /mnt/usb16GB/
        4. Y a continuación hacemos la copia de seguridad:
          $ sudo cryptsetup luksHeaderBackup /dev/sda5 --header-backup-file /mnt/usb16GB/backup-cabecera-sda5.img

          Como vemos en el comando anterior, hemos copiado la cabecera del dispositivo /dev/sda5 en la memoria USB montada en la carpeta /mnt/usb16GB y al archivo de copia de seguridad le hemos dado el nombre backup-cabecera-sda5.img.

        5. Si listamos el contenido de la memoria USB podemos ver como se ha creado el archivo:
          $ sudo ls -l /mnt/usb16GB/
          total 16384
          -r-------- 1 root root 16777216 jun 28 14:05 backup-cabecera-sda5.img
        6. Y finalmente, desmontamos la memoria USB:
          $ sudo umount /mnt/usb16GB

        Ya tenemos nuestra copia de seguridad a salvo en nuestra memoria USB.

      •  

      • Copia de seguridad «más segura» (Volver al índice General)
        También podemos hacer la copia de seguridad del encabezado de LUKS en un sistema de archivos de memoria volátil ramfs, luego cifrarlo con gpg y finalmente, escribirlo en el dispositivo donde guardaremos la copia de seguridad.

        Nota: Utilizando el sistema de archivos ramfs, al desmontarlo, no quedará rastro de nuestra copia de seguridad en el sistema, y con gpg cifraremos nuestro archivo de copia de seguridad.

        A continuación mostramos todos los comandos a ejecutar:

        1. Creamos un directorio temporal en el directorio personal del usuario root al que llamaremos temporal (podemos utilizar el nombre que queramos):
          $ sudo mkdir /root/temporal/
        2. Montamos el sistema de archivos ramfs en el directorio temporal:
          $ sudo mount ramfs /root/temporal/ -t ramfs
        3. Hacemos la copia de seguridad con cryptsetup en el directorio temporal:
          $ sudo cryptsetup luksHeaderBackup /dev/sda5 --header-backup-file /root/temporal/backup-cabecera-sda5.img

          Si listamos el contenido del sistema de archivos ramfs podemos ver como se ha creado el archivo de copia de seguridad:

          $ sudo ls -l /root/temporal/
          total 16384
          -r-------- 1 root root 16777216 jun 28 14:05 backup-cabecera-sda5.img
        4. Ciframos con gpg el fichero que contiene la copia de seguridad del encabezado.

          Nota: En este punto, el usuario que cifra el archivo de copia de seguridad ha de tener configurado gpg. Como en nuestro ejemplo, el usuario root si que tiene configurado gpg, será este usuario quien cifre el archivo de copia de seguridad.

          A continuación cifraremos el archivo de copia de seguridad con el identificador de usuario mortadelo@zeppelinux.es (user ID del usuario root en mi sistema), para que llegado el caso, pueda descrifrarlo:

          $ sudo gpg --recipient mortadelo@zeppelinux.es --encrypt /root/temporal/backup-cabecera-sda5.img

          Si listamos el contenido del sistema de archivos ramfs podemos ver como se ha creado el archivo de copia de seguridad:

          1
          2
          3
          4
          
          $ sudo ls -l /root/temporal/
          total 32752
          -r-------- 1 root   root   16777216 jun 28 14:05 backup-cabecera-sda5.img
          -rw-r--r-- 1 root   root   16753245 jun 28 15:25 backup-cabecera-sda5.img.gpg

          Se puede ver que gpg ha añadido la extensión .gpg.

        5. Copiamos el archivo cifrado con gpg que contiene la copia de seguridad en el dispositivo de almacenamiento:
          $ sudo cp /root/temporal/backup-cabecera-sda5.img.gpg /mnt/usb16GB/
        6. Y finalmente, desmontamos el sistema de archivo de memoria volátil ramfs:
          $ sudo umount /root/temporal/

      Nota: Si optamos por utilizar tmpfs en vez de ramfs, hay que tener en cuenta que tmpfs puede recurrir a usar el disco duro si necesita más memoria, por lo que no se recomienda su uso para hacer la copia de seguridad.

    •  

    • Restaurar copia de seguridad con cryptsetup (Volver al índice General)

      ¡MUY IMPORTANTE!: Si la partición en la que pretendemos restaurar la copia de seguridad está en uso, habrá que desmontarla previamente. Si se trata de una partición, por ejemplo, en la que esté montado el directorio raíz (/), debido a que no podemos desmontarla, tendremos que ejecutar los comandos siguientes desde un Live CD que tenga instalada la herramienta cryptsetup.

      Todos los comandos los ejecutaremos con privilegios de root:
       

      • Comprobar que el encabezado es el correcto (Volver al índice General)

        ¡Restaurar el encabezado incorrecto o restaurar una partición sin cifrar causará la pérdida de datos! Por lo que en primer lugar, comprobaremos si el encabezado es el correcto y una vez hecha la comprobación, restauraremos el encabezado.

        En nuesro ejemplo, el directorio raíz (/) se encuentra en la partición en la que pretendemos restaurar la cabecera, por lo que usaremos un Live CD y tendremos que asegurarnos que la partición a restaurar es la correcta. En nuestro ejemplo, la partición sigue siendo la misma: /dev/sda5.

        Con el fin de evitar la restauración de un encabezado incorrecto, podemos asegurarnos de que funciona si lo usamos primero como un --header remoto. Para hacerlo, ejecutaremos los siguiente comandos:

        1. Primeros usaremos la acción --header. Se nos pedirá una contraseña válida para acceder a /dev/sda5:
          # cryptsetup -v --header /media/user/usb16GB/backup-cabecera-sda5.img open /dev/sda5 test
          Introduzca la frase contraseña de /dev/sda5:
          Ranura de claves 0 desbloqueada.
          Orden ejecutada correctamente.
        2. Creamos un directorio temporal al que llamaremos /mnt/test:
          # mkdir /mnt/test
        3. Luego montamos el dispositivo y listamos el contenido:
          # mount /dev/mapper/test /mnt/test && ls /mnt/test

          Si todo ha ido bien, veremos listado (ls) el contenido de la partición.

          En nuestro caso, no pudimos listar el contenido, nos salió el siguiente aviso:

          mount: /mnt/test: tipo de sistema de ficheros 'LVM2_member' desconocido.

          Esto es debido a que en nuestra partición cifrada existen volúmens lógicos y sobre estos las distintas particiones, y desde nuestro Live CD no pudímos montarlas

        4. A continuación desmontamos el dispositivo:
          # umount /mnt/test
        5. Y finalmente finalizamos el test:
          # cryptsetup close test
      •  

      • Restaurar la copia de seguridad (Volver al índice General)
        Una vez que sabemos que la comprobación se realizó correctamente, pasamos a realizar la restauración.

        En nuestro caso, a pesar del aviso tipo de sistema de ficheros ‘LVM2_member’ desconocido, hemos sido unos valientes y hemos continuado con la restauración. Total, nos habíamos cargado la cabecera, ¡que más podemos perder!

        Para la restauración, utilizaremos la acción luksHeaderRestore y ejecutaremos el siguiente comando:

        # cryptsetup luksHeaderRestore /dev/sda5 --header-backup-file /media/user/usb16GB/backup-cabecera-sda5.img
         
        WARNING!
        Dispositivo /dev/sda5 ya contiene cabecera LUKS2. Reemplazar la cabecera destruirá las ranuras de claves existentes.
         
        Are you sure? (Type uppercase yess): YES

        Ahora que todas las áreas de las ranuras de claves están sobrescritas, solo las ranuras de claves activas de la copia de seguridad estarán disponibles después de ejecutar la orden.

        Por cierto, nuestra restauración funcionó y podemos acceder de nuevo al sistema 😀

  4.  

  5. Copia de seguridad y restauración de forma manual (Volver al índice General)
    Sabiendo que el encabezado siempre reside al comienzo del dispositivo, podemos realizar la copia de seguridad sin utilizar cryptsetup.

    1. En primer lugar, averiguaremos el desplazamiento (offset) de la carga útil de la partición cifrada. En nuestro ejemplo, la partición cifrada siguie siendo /dev/sda5 y utilizaremos el comando grep para filtrar la salida y nos indique solo el valor Payload offset (Desplazamiento de la carga útil).
       
      En pruebas realizadas con Debian 10 ‘buster’, Manjaro 20.0.3 y Kali Linux 2020.2 hemos comprobado que cryptsetup tiene formas distintas de cuantificar, o al menos, de presentar el valor del desplazamiento (offset):

      • Forma 1: Versión de cryptsetup 2.3.2 en Manjaro 20.0.3.
        $ sudo cryptsetup luksDump /dev/sda5 | grep "Payload offset"
        Payload offset:	4096

        Esta forma nos indica que el desplazamiento (offset) vale 4096.

      • Forma 2: Versión de cryptsetup 2.3.3 en Debian 10 ‘buster’ y Kali Linux 2020.2.
        $ sudo cryptsetup luksDump /dev/sda5 | grep offset | grep -v "Area offset"
                offset: 16777216 [bytes]

        Esta forma nos indica que el desplazamiento (offset) vale 16777216 bytes.

    2. A continuación, averiguamos el tamaño del sector de la partición:
      $ sudo fdisk -l /dev/sda5 | grep "Sector size"
      Sector size (logical/physical): 512 bytes / 512 bytes

      Si la salida está en Español, tendremos que filtrar la salida de otra forma:

      $ sudo fdisk -l /dev/sda5 | grep "Tamaño de sector"
      Tamaño de sector (lógico/físico): 512 bytes / 512 bytes

      En ambos ejemplos vemos que el tamaño del sector vale 512 bytes.

     

    • Realizar copia de seguridad del encabezado (Volver al índice General)
      Una vez que conocemos los valores del desplazamiento (offset) y el tamaño del sector, ya podemos proceder a hacer la copia de seguridad del encabezado. En este caso utilizaremos la orden dd.
      En nuestro ejemplo, realizaremos la copia de seguridad y la copiaremos en una memoria USB. Los pasos a seguir serán los siguientes:

      1. Creamos la carpeta /mnt/usb16GB donde montaremos una memoria USB en la que guardaremos la copia de seguridad:
        $ sudo mkdir /mnt/usb16GB
      2. Conectamos la memoria USB y ejecutamos el siguiente comando para conocer a que dispositivo está asociado:
        $ sudo fdisk -l
      3. En nuestro ejemplo, la memoria USB es el dispositivo /dev/sdb1 y lo montamos con el siguiente comando:
        $ sudo mount -t auto /dev/sdb1 /mnt/usb16GB/
      4. A continuación, dependiendo de la forma en que cryptsetup cuantifica el desplazamiento (offset), ejecutaremos el comando correspondiente:
        • Forma 1: Versión de cryptsetup 2.3.2 en Manjaro 20.0.3.
          $ sudo dd if=/dev/sda5 of=/mnt/usb16GB/backup-cabecera-sda5.img bs=512 count=4096
        • Forma 2: Versión de cryptsetup 2.3.3 en Debian 10 ‘buster’ y Kali Linux 2020.2. En este caso, dividimos 16777216 entre 512 y obtenemos la cantidad de 32768, que se corresponde con el número de sectores que ocupa el offset:
          $ sudo dd if=/dev/sda5 of=/mnt/usb16GB/backup-cabecera-sda5.img bs=512 count=32768
          32768+0 registros leídos
          32768+0 registros escritos
          16777216 bytes (17 MB, 16 MiB) copied, 4,33452 s, 3,9 MB/s
      5. Hecha la copia de seguridad, podemos almacenar el archivo /mnt/usb16GB/backup-cabecera-sda5.img de forma segura. Por ejemplo, siguiendo los pasos vistos en el apartado anterior Copia de seguridad más segura, pero teniendo en cuenta que en el punto 3 de dicho apartado, en vez de utilizar cryptsetup utilizaremos la orden dd que hemos visto más arriba.
    •  

    • Restaurar copia de seguridad del encabezado olver al índice General)
      Si tenemos que restaurar la copia de seguridad que hicimos de forma manual, tendremos que utilizar los mismos valores del desplazamiento (offset) y el tamaño del sector que usamos cuando realizamos la copia de seguridad manual.

      ¡MUY IMPORTANTE!: Si la partición en la que pretendemos restaurar la copia de seguridad está en uso, habrá que desmontarla previamente. Si se trata de una partición, por ejemplo, en la que esté montado el directorio raíz (/), debido a que no podemos desmontarla, tendremos que ejecutar los comandos siguientes desde un Live CD que tenga instalada la herramienta dd.

      En nuesro ejemplo, el directorio raíz (/) se encuentra en la partición en la que pretendemos restaurar la cabecera, por lo que usaremos un Live CD y tendremos que asegurarnos que la partición a restaurar es la correcta. En nuestro ejemplo, la partición sigue siendo la misma: /dev/sda5.

      Todos los comandos los ejecutaremos con privilegios de root:

      Dependiendo de la forma en que cryptsetup cuantifica el desplazamiento (offset), ejecutaremos el comando correspondiente:

      • Forma 1: Versión de cryptsetup 2.3.2 en Manjaro 20.0.3.
        # dd if=/media/user/usb16GB/backup-cabecera-sda5.img of=/dev/sda5 bs=512 count=4096
      • Forma 2: Versión de cryptsetup 2.3.3 en Debian 10 ‘buster’ y Kali Linux 2020.2.
        # dd if=/media/user/usb16GB/backup-cabecera-sda5.img of=/dev/sda5 bs=512 count=32768
        32768+0 registros leídos
        32768+0 registros escritos
        16777216 bytes (17 MB, 16 MiB) copied, 1,28849 s, 13,0 MB/s

 

Espero que este artículo os haya sido de utilidad. Si pensáis que podéis colaborar para mejorar este artículo, que hay algo erróneo en él o simplemente deseáis comentarlo, por favor, dejad vuestra opinión más abajo.
  Configuración de privacidad y de cookies.
Seguir J. Carlos:

Técnico Informático - Desarrollo Web - Administración de Redes

Técnico Informático. Desarrollo Web. Administración de redes.

Últimas publicaciones de

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.