Creación de un dispositivo de arranque cifrado

Publicada en Publicada en Anonimato, Criptografía, Espionaje, Linux, Uncategorized

Buenas a todos!! Hoy voy a describiros un método sencillo para crear vuestros propios dispositivos arrancables, como puede ser un pendrive, disco duro o cualquier otro dispositivo de almacenamiento, estando los mismos enteramente cifrados. Estando cifrados, protegeremos nuestros dispositivos, por la razón que sea, contra cualquiera que potencialmente pueda llegar a tener acceso a ellos. En este caso, crearemos un pendrive arrancable cifrado con el sistema operativo Antergos. El proceso con cualquier otra distribución debería ser el mismo o muy parecido.

Para ello, primero una breve explicación del método a utilizar. Crearemos una partición de arranque (/boot) sin cifrar y otra que contendrá el propio sistema, utilizando para esta última el cifrado LUKS (Linux Unified Key Setup). LUKS describe un método de cifrado estandarizado y ampliamente utilizado sobre sistemas operativos Linux pero independiente de la plataforma. Sobre ella, crearemos un conjunto de volúmenes o particiones lógicas utilizando la tecnología LVM (Logical Volume Manager), que permite sobre una partición física realizar una subdivisión en varias subparticiones virtuales.

Esquema de particionado del dispositivo

Con este esquema conseguimos que hasta que no se consiga descifrar la partición cifrada con LUKS no podrá siquiera apreciarse el esquema de particionado lógico sobre la misma. Otros métodos válidos podrían ser cifrar con LUKS sobre particiones lógicas, o simplemente cifrar una partición física sin crear volúmenes lógicos. Dependerá de nuestras necesidades. En mi caso he elegido un particionado con volúmenes lógicos, aunque de momento solamente instale un sistema operativo, para poder ampliarlo en el futuro con otros fácilmente. Otras razones para los volumen lógicos podrían ser la separación de la partición /home o similares.

NOTA: Si es un dispositivo que hayamos utilizado antes, tal vez os convenga borrar completamente los datos que ha contenido. Por ejemplo, como se describe aquí.

Creación de la partición /boot

En este punto, lo más conveniente es arrancar directamente desde una ISO Live del sistema operativo que queramos instalar, como bien puede ser en este caso Antergos. De esta manera, realizamos todo el proceso de preparación e instalación desde el mismo sistema Live. Como he dicho antes, el proceso debería ser muy similar para cualquier otra distribución, dado que no vamos a hacer nada que sea exclusivo de Arch o similar.

Ahora, debemos crear la partición /boot de arranque. Entre otros métodos, podemos utilizar la herramienta fdisk, pero también otras como parted o gparted.

Con fdisk, ejecutaremos (asumiendo que nuestro dispositivo objetivo está identificado como /dev/sdb):

fdisk /dev/sdb

Acto seguido, podemos ir siguiendo paso a paso la creación. Pulsaremos n para una nueva partición, p para partición extendida y 1 como número de partición (dado que no hay ninguna aún). Estableceremos por último 110M (100 Megabytes) como tamaño de la partición. El mínimo es 100, y siempre es mejor pensar que sobre, ¡nos sobran gigas hombre!

Creación de la partición /boot de arranque

Creación de la partición del sistema

Lo siguiente que haremos en fdisk será crear la partición que contendrá el sistema operativo en el futuro. Podemos de hacerlo de forma muy similar a lo anterior.

Creación de la partición cifrada

Podemos ver la tabla de particiones que se creará introduciendo en fdisk la orden p. El resultado debería ser similar al siguiente:

Visualización de la tabla de particiones a crear

Escribiremos permanentemente estos cambios con la orden w. Saldremos automáticamente de la herramienta, y podremos ejecutar el siguiente comando para comprobar que todo ha salido correctamente:

fdisk -l /dev/sdb
Escritura de las particiones y comprobación

Creación del contenedor LUKS y los volúmenes logicos

Ahora podremos crear el contenedor cifrado LUKS dentro de nuestra partición de sistema (en nuestro caso y en adelante, /dev/sdb2) y posteriormente lo abriremos:

cryptsetup luksFormat /dev/sdb2

cryptsetup open /dev/sdb2 lvm

De esta manera, el contenedor se mapeará para su acceso en /dev/mapper/lvm.

NOTA: Es necesario tener instalado el paquete device-mapper para el paso anterior, dado que requiere el módulo de kernel dm-mod.

Creación y apertura del contenedor LUKS

Pasamos a crear ahora los volúmenes lógicos por encima del contenedor cifrado con LUKS utilizando LVM. Lo primero será crear un volumen físico que contenga la totalidad del contenedor cifrado. Este volumen físico referencia el espacio sobre el que crearemos volúmenes lógicos; puede ser uno solo, como es en este caso, o estar compuesto de varias secciones del mismo dispositivo o incluso diferentes.

pvcreate /dev/mapper/lvm

Acto seguido crearemos un grupo de volúmenes lógicos. Este componente simplemente aúna uno (en este caso) o varios volúmenes físicos, de manera que sobre ellos se creen volúmenes lógicos como si fuesen un mismo dispositivo de almacenamiento. Podemos llamarlo como queramos; en este caso simplemente lo llamaré lvm_vol.

vgcreate lvm_vol /dev/mapper/lvm
Creación del volumen físico y el grupo de volúmenes

Por último crearemos los volúmenes lógicos sobre este grupo. Como vimos en el primer esquema de la entrada, crearemos en nuestro caso únicamente un volumen destinado a la memoria SWAP (1GB debería bastar para sistemas modernos con mucha memoria, además de que si usamos un pendrive tenemos un espacio limitado). El resto del espacio del volumen lo ocuparemos con el volumen destinado a la partición de Antergos.

lvcreate -L 1G lvm_vol -n swap
lvcreate -l 100%FREE lvm_vol -n antergos
Creación de los volúmenes lógicos para SWAP y Antergos

Ahora sobre los volúmenes lógicos crearemos los sistemas de ficheros correspondientes (ext4 para el sistema, swap para la SWAP). Por último, los montaremos en nuestro sistema.

mkfs.ext4 /dev/mapper/lvm_vol-antergos

mkswap /dev/mapper/lvm_vol-swap

mount /dev/mapper/lvm_vol-antergos /mnt

swapon /dev/mapper/lvm_vol-swap

mkdir /mnt/boot

mkfs.ext2 /dev/sdb1

mount /dev/sdb1 /mnt/boot

Creación de sistemas de ficheros y montaje (opcional)

Esto es optativo, dado que en general en los asistentes de instalación de las distribuciones puedes crear en las particiones nuevos sistemas de ficheros. En otras, como Arch puro, debes hacerlo manualmente.

Instalación de Antergos

En este punto, deberemos instalar nuestro sistema operativo en la partición correspondiente. En caso de Antergos, podemos hacerlo con el instalador chchi incluido en el sistema Live.

No me entretendré mucho en explicar la instalación paso a paso, dado que ya lo hace Juan en este vídeo. Basta con seguir esos pasos, con estas salvedades:

  • Debemos seleccionar la instalación avanzada y elegir las particiones manualmente.
Selección de configuración manual de particiones
  • En dicha configuración manual, nos aparecerán los volúmenes virtuales arriba del todo. Editaremos cada entrada con su configuración correspondiente, en ningún caso marcando la opción de cifrado:
    • En el volumen mapeado como swap, seleccionaremos utilizar como swap y no formatear.
    • En el volumen mapeado como la partición de antergos, seleccionaremos utilizar como ext4, punto de montaje / y formateo.
    • En la partición /dev/sdb1, en la que se localizará /boot, marcamos utilizar como ext2 (también nos vale ext3/4) y punto de montaje /boot.
  • Marcaremos además como dispositivo de cargador de arranque /dev/sdb, el dispositivo completo sobre el que estamos trabajando.

 

Con estas salvedades, podemos continuar y dejar instalando el sistema operativo un rato hasta que acabe. El usuario, nombre de equipo, contraseña y demás lo dejo a vuestra elección, claro.

Configuración de mkinitcpio y el gestor de arranque Grub

Una vez se ha terminado de instalar el sistema, no hemos acabado aún, así que no salgas del sistema Live todavía. Dado que tenemos que arrancar sobre una partición cifrada, es necesario hacer un par de cambios en el mkinitcpio, un script que sirve para cargar módulos de kernel al arranque antes de pasar el control a init, y en el gestor de arranque Grub, que necesita saber que la partición del sistema está cifrada.

Para ello, primero tendremos que montar en /mnt el sistema Antergos y su partición boot para realizar cambios sobre ellas utilizando chroot. Además debemos montar los sistemas de ficheros virtuales del sistema Live, necesarios para ciertas operaciones dentro del sistema enjaulado con chroot.

mount /dev/mapper/lvm_vol-antergos /mnt

mount /dev/sdb1 /mnt/boot

for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done

chroot /mnt
Montaje de sistemas de ficheros necesarios para el chroot

Editaremos (utilizando vi o nano, de lo poco disponible dentro de chroot) el fichero /etc/mkinitcpio.conf. En la línea correspondiente a HOOKS debemos segurarnos de que su valor contiene los elementos lvm2, encryptkeyboard. Estos son los necesarios para manejar LVM, LUKS y que nos permita introducir con teclado la contraseña de cifrado en el arranque temprano.

Configuración de mkinitcpio

Hecho esto, editaremos también dentro de chroot el fichero /etc/default/grub, que contiene los datos de generación de la configuración del sistema de arranque Grub. En el campo GRUB_CMDLINE_LINUX introduciremos el siguiente valor:

cryptdevice=UUID=[UUID]:lvm root=/dev/mapper/lvm_vol-antergos

Donde [UUID] es la UUID del dispositivo /dev/sdb2, la partición física cifrada. Podemos ver este dato ejecutando blkid en consola.

Edición del fichero de configuración /etc/default/grub

Así, le estamos indicando al sistema de arranque que tendrá que ir a buscar un dispositivo cifrado en /dev/sdb2 que contiene un grupo de volumenes llamado lvm_vol, y que en este grupo debe buscar el sistema operativo raíz en /dev/mapper/lvm_vol-antergos, que es donde se mapeará una vez descifrada la partición con la contraseña.

Hecho esto, ejecutamos los comandos necesarios para generar el nuevo mkinitcpio.conf y generar la nueva configuración de Grub:

mkinitcpio -p linux
Generación del nuevo mkinitcpio
grub-mkconfig -o /boot/grub/grub.cfg
Generación de la nueva configuración de arranque

Y con esto todo debería estar hecho y funcionando. Reiniciamos, cruzamos los dedos muy fuerte y veremos que se nos muestra el Grub correctamente, y al iniciar Antergos se nos pide la contraseña de cifrado, tras lo cual todo se inicia correctamente. ¡¡Éxito!!

Un comentario en “Creación de un dispositivo de arranque cifrado

Deja un comentario

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