Instalar ArchLinux cifrando el disco con dm-Crypt y LUKS – Parte I

Publicado: noviembre 16, 2013 en FileSystem, Seguridad, System
Etiquetas:, , , , , , ,

archlinux-vert-dark-grad1

Un sistema instalado sobre un disco sin cifrar es accesible. Tan solo hay que modificar una entrada en el gestor de arranque o, en caso de que esté protegido, arrancar con otro sistema. Bastará montar el disco al que queremos acceder y podremos extraer toda la información, contraseñas de usuarios, etc.

El cifrado de discos antes de instalar un sistema, es muy importante para prevenir el acceso a los datos en caso de pérdida del equipo. En algunas distribuciones podemos realizar este cifrado desde su instalador (es el caso de Debian y derivadas o Fedora). En el caso de ArchLinux y otras distribuciones, esto no es así, por lo que veremos un método para realizar esta tarea.

Consideraciones previas

Lo primero que debemos tener en cuenta es el tipo de cifrado que utilizaremos. En principio, tenemos dos posibilidades:

  • Cifrar a nivel de bloque (dispositivo o partición).
  • Cifrar a ninel de archivos (únicamente directorios o archivos específicos).

De las opciones que disponemos en ArchLinux para cifrar a nivel de bloque, vamos a utilizar dm-Crypt con LUKS. El dm-Crypt viene con el kernel del sistema y nos permite mapear un dispositivo cifrado en otro virtual , que será el que contendrá los datos sin cifrados. LUKS es una capa de abstracción que se encarga de almacenar la configuración de dm-Crypt y nos permite una utilización del disco más fácil, además de la gestión de claves, por lo que podremos disponer de más de una (hasta ocho) por dispositivo cifrado.

Con este método, además de poder tener varias claves por dispositivo, podremos crear un keyfile (un fichero que contiene la clave, de forma que podemos almacenarlo en un pendrive y arrancar el sistema con el conectado, sin necesidad de introducir la clave manualmente).

A la hora de particionar, dispondríamos, en general, de dos opciones:

  • Cifrar todo el dispositivo, es decir, todo el disco. En este caso utilizaríamos dm-Crypt plain y perdemos las ventajas de LUKS.
  • Cifrar las particiones con dm-Crypt+LUKS. Esta es la opción que vamos a utilizar, es la más flexible.

Además de esto, vamos a utilizar LVM (Logical Volume Manager). En general, en un contenedor LVM, podremos crear particiones virtuales. Lo bueno de LVM es que nos permite añadir dispositivos para redimensionar las particiones virtuales, sin necesidad de formatear.

Ahora, tenemos dos opciones más para elegir:

  • Cifrar la partición y, dentro de ésta, crear el LVM. Nos permite ocultar que estamos utilizando un contenedor LVM, pero no podremos añadir/quitar dispositivos a una partición, sin tener que volver a crearla.
  • Crear un volumen LVM y cifrar las particiones creadas. Nos va a permitir redimensionar y utilizar sistemas cifrados y sin cifrar. No ocultamos la existencia de un contenedor LVM.

En resumen:

Vamos a crear un contenedor LVM, vamos a cifrar las particiones que creemos dentro de él y, salvo la partición donde se montará el sisema raíz, el resto se descifrarán con un keyfile alojado dentro de ésta.

Este método nos va a permitir una gran flexibilidad a la hora de mantener el sistema. Es la utilizada, por ejemplo, por Debian en el instalador.

Esquema de partionado

Para que el sistema pueda arrancar, primero ha de descifrar la partición donde está alojado el sistema raíz. Esto obliga a  separar el /boot, directorio donde reside el gestor de arranque , para que pueda ser legible y pueda, al cargar el kernel, descifrar el resto del sistema.

En esta guía vamos a instalar utilizando el nuevo sistema de particiones GPT, con una placa base con firmware BIOS. Además, utilizaremos GRUB, por lo que será necesario crear una partición adicional (no estará cifrada), de tipo EF02, para poder arrancar. Para un sistema UEFI, será similar, con la salvedad de que la partición destinada a /boot debe estar formateada como FAT32 (tipo EF00), de un tamaño mínimo de 512 MB (aconsejado  1 GB) y no será necesaria la partición adicional antes mencionada.

Suponiendo que el disco donde vamos a instalar sea el /dev/sda, vamos a crear las particiones siguientes:

  1. /dev/sda1 <– Tipo EF02, tamaño uno o dos megas.
  2. /dev/sda2 <– Para /boot, con 300 MB estará bien. Si el sistema es UEFI, tipo EF00, de 1 GB
  3. /dev/sda3 <– Contenedor LVM, con el espacio para el sistema raíz (entre 30 y 40 GB), más el espacio para home y swap. Dentro del contenedor crearemos:
  • rootvol <– Partición virtual para el sistema raíz.
  • homevol <– Partición virtual para el home.
  • swap <– A partir de 2 GB de RAM, no es necesaria, tan solo si queremos hibernar el equipo. Dependiendo de qué utilicemos para hibernar, necesitamos más o menos swap. Con un tamaño del 60% de RAM será suficiente. Para equipos con menos de 1GB, el doble que la RAM del sistema.

En el ejemplo, con la máquina virtual, utilizaremos 8 GB para el raiz, 1 GB para el home y 1 GB para la swap.

Iniciando el sistema

Arrancamos el equipo con el medio de instalación. Si hemos descargado la versión dual y nuestra máquina soporta 64 Bits, nos permitirá elegir esta opción. Si no lo soporta, no aparece.

Una vez iniciado el sistema, hay que establecer el mapa de teclado y el idioma del sistema. Por defecto, está en inglés.

Para ello, bastará ejecutar:

loadkeys es

Ya tenemos el teclado en nuestro idioma, ahora editamos el /etc/locale.gen y localizamos las entradas correspondientes, eliminamos la # para descomentar y guardamos el archivo. Si utilizamos nano, con CTRL+w podemos buscar la cadena es_ES y, con CTRL+x, guardar y salir del editor. Las líneas a descomentar son:

es_ES.UTF-8 UTF-8
es_ES ISO-8859-1
es_ES@euro ISO-8859-15

Una vez hecho esto, generamos los locales y exportamos la variable LANG, que indica al sistema el idioma en que se encuentra:

locale-gen
export LANG=es_ES.UTF-8

Si nuestra red es cableada y con DHCP activado, deberíamos tener conexión. Si es wifi, primero deberemos levantarla. Después, con wifi-menu la configuraremos. Para conocer cómo se llama la interfaz de red wifi, ejecutamos:

iwconfig
# Nos devuelve las interfaces y nos informa si son wireless o no.
ip link set nombre_interfaz up
wifi-menu nombre_interfaz

Particionamos el disco

Podemos proceder a crear las particiones. Para ello utilizaremos el comando cgdisk, similar al cfdisk, pero para particionado GPT. Lo invocamos con el disco en el que vamos a instalar:

cgdisk /dev/sda

La primera partición que crearemos será la Bios Boot Partition. Nos situamos en New, pulsamos intro, dejamos como primer sector el que viene por defecto. En la siguiente pregunta, ponemos +1M. En el tipo especificamos EF02.

En el espacio restante, creamos otra partición, dejando el primer sector el que nos indique y especificando en la siguiente pregunta +300MB.  Ésta será la /boot, podemos dejar el tipo de partición por defecto. En el caso de UEFI, el tamaño será de un 1G y el tipo EF00.

En el espacio libre que queda, le damos a New y dejamos el sector incial y final el que venga por defecto. Para el tipo de partición, eligiremos la LVM (código 8e00).

Ahora creamos el volumen LVM y, dentro de él, los volumenes virtuales. Es posible que haya que cargar el módulo encardado de mapear dispositivos, el dm-mod:

#Comprobamos que dm-mod está cargado
lsmod |grep dm-mod
#Si no hay salida, ejecutamos:
modprobe dm-mod

#Creamos el contenedor LVM
pvcreate /dev/sda3

#Definimos el grupo virtual
vgcreate Datos /dev/sda3

#Creamos los volúmenes (particiones) virtuales
lvcreate -L 8G Datos -n rootvol
lvcreate -L 1G Datos -n homevol
lvcreate -C y -l +100%FREE Datos -n swapvol
# -C y para el swap, para que no la divida entre varios discos,
# en caso de que añadamos más o utilicemos más de uno

#Ciframos los volúmenes, las claves se pueden modificar
#y añadir más después
cryptsetup luksFormat /dev/Datos/rootvol
cryptsetup luksFormat /dev/Datos/homevol
cryptsetup luksFormat /dev/Datos/swapvol

#Abrimos los volúmenes
cryptsetup open --type luks /dev/Datos/rootvol root
cryptsetup open --type luks /dev/Datos/homevol home
cryptsetup open --type luks /dev/Datos/swapvol swap

Ya tenemos el sistema particionado, vamos a formatear:

mkfs.ext4 /dev/mapper/root
mkfs.ext4 /dev/mapper/home
mkswap /dev/mapper/swap
swapon /dev/mapper/swap
mkfs.ext4 /dev/sda2

Podemos ver estos pasos en el siguiente vídeo:

En la próxima entrada, instalaremos el sistema base y completaremos la configuración para un primer reinicio.

Fuente:

Segunda parte: https://archeando.wordpress.com/2013/12/09/instalar-archlinux-cifrando-el-disco-con-dm-crypt-y-luks-parte-ii/

comentarios
    • Archuser dice:

      En las distros que no incluyen el cifrado en el instalador, toca hacer esto. Bueno, se complica un poco con el LVM, pero, al final de la serie, pondré un ejemplo para que veamos la utilidad de utizarlo 🙂

  1. jmiault dice:

    Como te comentaba en taringa! es muy necesario el cifrado y agrego que el encriptado de ciertos directorios comprimidos en archivos de respaldo ya que nunca se sabe lo que puede pasar, no?

  2. […] Instalar ArchLinux cifrando el disco con dm-Crypt y LUKS – Parte I noviembre 16, 2013 […]

  3. seguridad100 dice:

    ¡Gran aporte! Razonables argumentos. Manten este nivel es un articulo estupendo. Tengo que leer màs posts como este.

    Saludos

    seguridad100 http://www.seguridad100.com

  4. Laegnur dice:

    Buenas
    Una pregunta, a ver si me puedes guiar. En un PC viejo quiero montar un servidor, y por paranoia quiero cifrarlo todo. Este PC tiene un disco IDE de 80Gb como sda y un disco SATA de 500Gb como sdb. En el primero pondré la partición de 1Mb y la de Boot. Si quiero usar el resto de los 80Gb junto a los 500Gb del otro como LVM (con volúmenes de /, /home y swap), como se configuraría eso? Le pasaría los dos discos a pvcreate?

    • Archuser dice:

      Buenas!
      En el diso de 500, crea una partición que ocupe todo el disco, de tipo 8e00.
      Suponiendo que en el sda, la partición lvm sea la sda3, haz:

      pvcreate /dev/sda3
      pvcreate /dev/sdb1

      Crea el volumen lógico:

      vgcreate Datos /dev/sda3

      Añade el disco sdb:

      vgextend Datos /dev/sdb1

      Y ya tienes el volumen Datos con la suma de los dos discos. A partir de ahí, el proceso es el mismo. Tan solo hay que tener en cuenta que la swap has de crearla con el parámetro «-C y» para que evitar que se divida entre los dos discos. Por ejemplo:

      lvcreate -C y -l +100%FREE Datos -n swapvol

      De hecho, voy a cambiar esto en el post 🙂

      Un saludo!

  5. Omar dice:

    Hola Archuser, ante todo muchas gracias por el tutorial, soy usuario de ArchLinux hace 8 meses y hay dos preguntas que quiero hacerte. La primer este método de instalación cifrado aún funciona? ya que al ver la fecha veo que el post lo hiciste hace 3 años. La segunda pregunta es si la clave de los volúmenes rootvol, homevol y swapvol debe ser la misma o cada volumen debe tener claves distintas? En estos días quiero formatear mi disco e instalar Arch cifrado. Te agradecería mucho que puedas aclararme esas dudas. Saludos

Deja un comentario

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