Contabilidad, fisalidad, laboral y linux en Canarias.

Cifrar discos o particiones en linux ubuntu

Cifrar discos o particiones en linux ubuntu

Cifrar una partición o disco duro externo en GNU/Linux

Aprender a cifrar o encriptar particiones o discos duros completos, es algo bastante importante hoy en el mundo de las comunicaciones y la expansión vertiginosa de las redes sociales. Tanto dispositivos internos como externos, en los que tengamos información sensible, serán mucho más seguros si los encriptamos.

Vamos a dejar a un lado el caso del cifrado de la partición home, la cual es bastante cómodo cifrar desde el asistente de instalación, sobre una instalación limpia.

Requisitos previos

  • Saber el nombre del dispositivo que equivale a la partición que queremos cifrart. Este  acostumbra a ser del tipo “/dev/sdb1” si se trata de una partición o “/dev/sda” si es todo el disco. A partir de ahora me referiré a este nombre como $PARTICION. El contenido de esa partición o disco lo perderemos por completo.

Podemos identificarlo ejecutando en una consola el comando

 fdisk -l
  • Desmontar la partición sobre la que vayamos a trabajar:
 umount $PARTICION
  • Instalar (en el raro caso de que todavía no lo esté) el paquete cryptsetup.

Comprobar que no hay errores en el disco

A continuación comprobaremos que la partición que vamos a cifrar no tiene errores físicos. Esta operación y la siguiente de rellenar con valores aleatorios el disco pueden tardar varias horas y no son estrictamente necesarias, pero yo recomiendo ejecutarlas.

badblocks -s -w $PARTICION -b $TAMAÑO_BLOQUE

Para saber cual es el tamaño de bloque en nuestra partición podemos usar el comando:

tune2fs -l /dev/sda5 | grep -i 'Block size'

Una forma de acelerar el proceso de chequeo de errores es usar el parámetro -t random. Por defecto lo que hace badblocks es llenar todos los bytes del disco duro con aa, 55, ff, 00. Primero escribe el primer patrón (aa) y luego comprueba que todos los bytes valen aa, a continuación hace lo mismo con el segundo patrón,… Con -t random da una sóla pasada donde el patrón usado es aleatorio. Es menos fiable pero más rápido. Tampoco es mala idea hacerlo si estamos más o menos seguros de que el disco está bien y nos vamos a saltar el paso de llenar el disco con valores aleatorios.

Aleatorizar el disco

Si somos además algo paranoicos lo que debemos hacer a continuación es llenar la partición con valores aleatorios, lo que nos protegerá de ciertos ataques criptográficos. Hay varias formas de hacer esto, a mayor nivel de paranoia más lento será.  Para ello, utilizamos el siguiente comando, que a diferencia del famoso rm, con este no habrá forma de recuperar dato alguno del soporte sobre el que se aplique:

shred -n 1 -v $PARTICION

El parámetro -n $numero define el número de pasadas que haremos, el valor por defecto es 3, pero con 1 es suficiente (…depende del grado de paranoia…). Es posible tambien hacer lo mismo con otro comando más común, dd, de la siguiente forma:

dd if=/dev/random of=$PARTICIÓN bs=$TAMAÑO_BLOQUE

No obstante, y aunque habrán aún más métodos, shred juega con dos ventajas fundamentales a la hora de borrar definitivamente un soporte:

  • Informa del progreso de la operación de forma inmediata. (Con dd tambien se puede ver el progreso, pero la forma no es tan inmediata).
  • Dependiendo del tamaño del disco, el uso de dd se puede hacer tremendamente largo. Shred es más rápido a cambio de usar patrones más cortos de aleatoriedad y de dar menos pasadas.

Cifrar la partición

El siguiente paso consiste en indicar al sistema operativo el tipo de cifrado y contraseña queremos emplear para ese dispositivo.

cryptsetup -c aes -h sha256 -y -s 256 luksFormat $PARTICION
  • -c aes setea el algoritmo de cifrado. AES es uno de los más extendidos.
  • -h sha256 que use como algoritmo de hash SHA-256.
  • -s 256: que el tamaño de la clave sean 256 bits que es más que suficiente. A mayor tamaño más seguridad pero mayor perdida de rendimiento.

Si este comando nos da un error del tipo Check kernel for support for the aes-cbc-plain cipher spec and verify that /dev/sdb6 contains at least 258 sectors es seguramente porque no tenemos cargado el módulo dm-crypt. Para cargarlo ahora mismo ejecutamos:

modprobe dm-crypt

Para hacer que se cargue automáticamente cada vez que arrancamos el ordenador añadimos al archivo /etc/modules una línea que contenga unicamente el módulo a cargar, en este caso:

dm-crypt

Ahora debemos comprobar si podemos acceder al volumen cifrado

cryptsetup luksOpen $PARTICION $NOMBRE

Este comando es algo así como decirle al kernel que el volumen virtual descifrado, correspondiente al volumen físico cifrado $PARTICION va a ser /dev/mapper/$NOMBRE. Este comando no es equivalente a montar la partición, es más bien inventarnos una especie de interfaz hardware para acceder a nuestros datos descifrados.

Creamos un nuevo sistema de archivos en la partición

Si todo ha ido bien ahora debemos formatear la partición, con por ejemplo, ext4.

mkfs.ext4 [-L $ETIQUETA] -m 1 /dev/mapper/$NOMBRE
  • -L $ETIQUETA: Asigna a esa partición un determinado nombre a nuestra elección. Si no especificamos ninguno, se montará automáticamente como simplemente /media/disk.
  • -m 1: Es para reservar un 1% del disco duro para el superusuario en lugar del 5% por defecto. Es útil dejar siempre algo pero 5 es demasiado

Para cerrar el volumen descifrado y que no se puede acceder a él con la clave haremos:

cryptsetup luksClose /dev/mapper/$NOMBRE

Trabajar con el disco cifrado

Con los pasos dados hasta aquí ya tenemos listo nuestro volumen cifrado, la cuestión ahora es ¿como empezar a meter datos en él?. Primero descifraremos el disco (metiendo la clave), creándose automáticamente un volumen virtual descifrado y luego montaremos el volumen, esto lo hacemos con los comandos:

cryptsetup luksOpen $PARTICION $NOMBRE
mount /dev/mapper/$NOMBRE $PTO_MONTAJE

En el caso de que sea un partición interna es conveniente que definamos sus propiedades de montaje en /etc/fstab. En el caso de ser una externa es bastante sencillo, ya que al conectar el dispositivo automáticamente nos saldrá una ventana de diálogo preguntándonos la clave. Al introducirla, si hemos definido una etiqueta para la partición está se montará en /media/$ETIQUETA.

Para desmontar la partición y cerrar el volumen descifrado podemos hacer click con el botón derecho sobre la partición y darle a desmontar o bien ejecutar los comandos:

umount $PTO_MONTAJE && cryptsetup luksClose /dev/mapper/$NOMBRE

Entradas relacionadas

8 comentarios
  1. Buenas!

    Hace relativamente poco que ando interesado en este tema, tanto en cifrar USB como el sistema completo, salvo la particion boot que he visto que no se puede (como es logico) pero ando buscando al menos para los pendrives un sistema que sea compatible con PGP Desktop de Symantec.

    ¿Conoces algún metodo?

    Es decir de la forma que muestras, cifras los dispositivos mediante una contraseña, pero lo ideal o lo suyo “depende del grado de paranoia” seria cifrar con certificados, tal y como lo hace el PGP de Symantec, pero no tengo narices a montar despues sobre GNU/Linux el dispositivo, el programa que menciono es para windows, que no lo uso de forma habitual pero alguna que otra vez si me es necesario usarlo.

    • Wenas. Sinceramente, yo tambien estuve interesado en el tema, y bueno, tras muchas peleas con unetbooting y otros, hoy personalmente pienso que ya están empezando a venderse los pendrives cifrados por hardware, que seguramente harán muchísimo más facil el cifrado y descifrado.
      Repito, en pendrives, creo que el cifrado hardware hará inútil este tutorial; su única validez es para mantener secciones o particiones cifradas en un equipo de escritorio, o discos rígidos o SSD externos con información sensible.
      Pienso que por un poco más de sobreprecio, se gana muchísimo en seguridad y comodidad.

  2. Después de formatear el dispositivo como ext4 y cerrarlo con el luksClose y retirar el dispositivo usb, al volver a meterlo e intentar:
    sudo cryptsetup –verbose luksOpen /dev/sdd cifrado
    me da como resultado:
    command failed with code 22: /dev/sdd is not a LUKS device.

    • Es posible que hayan incompatibilidades en este aspecto con particiones ext4, que es un sistema de archivos relativamente nuevo. Para este tema, mejor usar ext3, que está más madurado.
      De todas formas, desconozco si puede ser otro aspecto, como algun fallo en algun sector, al aleatorizar la partición, o algún error de sintaxis…

Deja un comentario

RECUERDE QUE

El único objetivo de este blog es meramente informativo y en ningún caso supone asesoramiento profesional. Los textos y cualquier otra información aquí publicada están destinadas a un uso meramente informativo y documental. El autor o los autores de este sítio, no se hacen responsables de posibles inexactitudes en el contenido, ni de posibles perjuicios por su utilización. Los únicos textos que tienen validez jurídica son los publicados en los Boletines y Diarios Oficiales.

Creative Commons License