Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

viernes, 16 de junio de 2017

Cómo cifrar un disco en Linux con LUKS

La seguridad de nuestros datos es cada vez más preocupante para usuarios de todos los niveles, tanto a nivel de equipos de escritorio como de servidores. Es más, a nivel de equipos escritorio es algo aún más importante, ya que dichos equipos están al alcance de cualquiera y si una buena protección nuestros datos pueden verse expuestos. Existen varios tipos de cifrado que suelen estar orientados para cifrar cierto tipo de 'objetos'... Por ejemplo GPG o PGP son usados para el cifrado de ficheros y eCryptfs para el cifrado de directorios... Pero ninguna de estas herramientas de cifrado sirve para nuestro propósito; para cifrar un disco entero tenemos que optar por otro tipo de cifrado llamado LUKS.

LUKS

LUKS (Linux Unified Key Setup) es una especificación de cifrado de disco creado para GNU/Linux que se usa de forma estándar, lo que hace que dicho cifrado pueda ser usado en cualquier distribución de Linux. Dicho cifrado está específicamente pensado para cifrar discos, lo que lo hace perfecto para nuestro propósito.

Para ello lo primero que habría que hacer sería instalar las dependencias necesarias para posibilitar tanto el cifrado como el descifrado del disco, pues si bien es una implementación estándar, algunas distribuciones, tales como Debian, no la instalan por defecto. El paquete en cuestión se llama cryptsetup, el cual se instala desde los repositorios oficiales, lo que es tan sencillo como:

apt-get install cryptsetup

Por otro lado, vamos a tratar con un disco duro 'limpio', que simplemente está conectado; es decir que no tiene contenido alguno, ni tabla de particiones alguna; solamente está conectado. Con lo que vamos a convertir dicho disco duro en un disco duro con cifrado que además se automontará durante el arranque y que estará siempre disponible para nosotros.

Para ello, lo primero que haremos será fdisk, lo cual de por sí es sencillo, si bien en este caso no le agregaremos formato alguno al disco duro que añadamos, solamente le asignaremos una tabla de particiones muy básica para que nuestro sistemas pueda interactuar con él. Nuestro disco en cuestión es /dev/sdb, con lo que lo que haríamos sería:

fdisk /dev/sdb

Tras lo cual simplemente habría que crear una nueva partición, pulsando la tecla n, haciendo que dicha partición ocupe todo el disco, cosa que ya trata de hacer por defecto, y aplicando los cambios al disco en cuestión mediante la tecla w.

fdisk
Muestra comando fdisk

Esto que acabamos de hacer haría que tuviesemos como resultado un disco duro de nombre /dev/sdb con una partición única llamada /dev/sdb1. Generalmente sería necesario darle formato a dicha partición, pero no lo vamos a realizar aún debido a que cuando cifremos la unidad eliminaremos TODO el contenido de ésta y además dejaremos la unidad sin formato, con lo que en caso de tener contenido dentro de la partición, habría que hacer una copia de seguridad antes de pasar a cifrarla.

Teniendo eso en cuenta lo que haremos será cifrar la partición con formato LUKS, lo cual se hará mediante el comando de a continuación:

cryptsetup luksFormat /dev/sdb1

Para verificar que vamos a cifrar dicha partición, lo que tendremos que escribir será YES, tras lo cual nos pedirá que introduzcamos la contraseña con la que descifraremos la partición. El proceso tardará más o menos tiempo dependiendo de la potencia de nuestro equipo y del tamaño de la unidad que queramos cifrar.

Para abrir, o mejor dicho descifrar, la unidad que recién acabamos de crear, necesitaremos usar el comando cryptsetup de nuevo, pero con una estructura diferente:

cryptsetup open nombre_partición nombre_identificativo

Él nombre identificativo sería el nombre con el cual haremos referencia a la partición tras descifrarla. Es decir que tras descifrar la unidad, no haremos referencia a ésta como dev/sdb1 (en este caso) sino cono el nombre identificativo que le hemos asignado.

cryptsetup open /dev/sdb1 DISCO

Tras introducir el comando, el equipo nos pedirá introducir la contraseña correspondiente, tras la cual el disco quedará disponible, si bien no podremos hacer referencia a éste como habitualmente, sino que tendremos que hacerlo a través de su nombre identificativo; además, no encontraremos dicho nombre dentro del directorio /dev/ como es habitual con los dispositivos físicos, sino que lo haremos a través del directorio /dev/mapper. A sabiendas de que el nombre que le hemos puesto es DISCO, la ruta completa de nuestra unidad descifrada será /dev/mapper/DISCO.

Ahora que tenemos localizada la unidad, pasaremos a darle formato para que podamos usarla con normalidad. En este caso le vamos a asignar formato ext4, el más común de todos, pero podemos darle otros tales como bfs, ext2 o ext3. El comando para darle formato ext4 sería:

mkfs.ext4 /dev/mapper/DISCO

Ahora que la unidad tiene formato, ya puede ser usada por el sistema como si fuese una unidad más sin ningún tratamiento especial. Por ejemplo vamos a crear una carpeta llamada /mnt/NUEVODISCO, para luego montar la unidad dentro de ésta:

mkdir /mnt/NUEVODISCO
mount /dev/mapper/DISCO /mnt/NUEVODISCO

Con esto ya tendríamos la unidad disponible y perfectamente utilizable, lo cual generalmente es lo que deseamos, pero el problema que tiene esto es que al reiniciar el equipo habrá que recurrir de nuevo al comando cryptsetup para después montar de nuevo la unidad... Tarea que si bien no es demasiado complicada, si que es algo tediosa tener que hacerla cada vez que arranquemos el equipo, si tenemos intención de tener la nueva unidad siempre disponible.

Es por eso que vamos preparar el equipo para que cada vez que se inicie éste, realice todos los preparativos y que solamente te pida la contraseña de descifrado durante el arranque. Para ello tendremos que dirigirnos al fichero /etc/crypttab; fichero que ha sido creado durante la instalación de cryptsetup y que trabaja de forma parecida a fstab, pero orientado a discos cifrados. Dicho fichero será modificado para acabar con el siguiente aspecto:

# <target name> <source device> <key file> <options>
DISCO    /dev/sdb1       none luks

Gracias a ésto, el disco sería descifrado durante el arranque. Solamente faltaría montarlo para que sea accesible tan pronto como hemos arrancado el equipo, cosa que se especificaría dentro del fichero /etc/fstab. Aquí añadiremos esta línea al final del todo:

/dev/mapper/DISCO /mnt/DISCONUEVO ext4 rw 0 0

Tras aplicar este cambio, únicamente haría falta actualizar initframs (initial RAM file system) para asegurarnos de que descifre y monte adecuadamente nuestra nueva unidad. La actualización radica en un único comando que sería:

update-initramfs -u -k all

Gracias a esto, tras reiniciar el sistema veremos que pide una contraseña para descifrar la nueva unidad, contraseña que tendremos que introducir para poder acceder a ésta. Dicha contraseña siempre será pedida durante cada arranque, pero al menos evitaremos tener que usar cryptsetup y mount tras cada arranque.

Espero que os haya resultado útil.

Saludos.

2 comentarios :

  1. Muchas gracias. De mucha ayuda. Solo hay un pequeño fallo, el fichero se llama crypttab, con dos t. Un saludo

    ResponderEliminar
    Respuestas
    1. Muchas gracias por tus palabras!

      Denominación del fichero corregida. Tienes toda la razón, era con doble t.

      Saludos.

      Eliminar