LUKS – Encriptar Discos en Linux RedHat

El cifrado de datos es cada vez más importante para la seguridad de cualquier entorno profesional que almacene datos críticos. En RedHat podemos encriptar un disco completo.

A este sistema de cifrado se le conoce como Linux Unified Key Setup-on-disk-format o LUKS, para abreviar.

A continuación, vamos a ver un ejemplo de cómo cifrar un disco en RedHat 8.

Formateando el disco que vamos a encriptar

El primer paso del procedimiento es dar formato al disco que vamos a encriptar. Lo haremos con el comando cryptsetup.

[root@localhost ~]# cryptsetup -y -v luksFormat /dev/nvme0n2

WARNING!
========
This will overwrite data on /dev/nvme0n2 irrevocably.

Are you sure? (Type 'yes' in capital letters): YES
Enter passphrase for /dev/nvme0n2: 
Verify passphrase: 

Key slot 0 created.
Command successful.
[root@localhost ~]# 

El cifrado puede tardar un ratito, dependiendo del tamaño del disco. También debemos tener en cuenta utilizar una contraseña complicada, de lo contrario, cryptsetup lo detectará y no dejará encriptar el disco.

IMPORTANTE: Guardar la contraseña en un lugar seguro para poder acceder a los datos del disco encriptado.

Mapeo de la LUK en el sistema

Ahora vamos a darle un nombre amigable o que se corresponda con el servicio que le vamos a dar a este disco. Para este ejemplo, la llamaremos «test».

[root@localhost ~]# cryptsetup luksOpen /dev/nvme0n2 test
Enter passphrase for /dev/nvme0n2: 
[root@localhost ~]#

Podemos comprobar que en el sistema se ha creado el dispositivo «test»:

[root@localhost ~]# ls -la /dev/mapper/test
lrwxrwxrwx. 1 root root 7 Nov 17 22:45 /dev/mapper/test -> ../dm-0
[root@localhost ~]# 

Si queremos conocer si el disco cifrado está en estado activo, lo averiguaremos con cryptsetup:

[root@localhost ~]# cryptsetup -v status test
/dev/mapper/test is active.
  type:    LUKS2
  cipher:  aes-xts-plain64
  keysize: 512 bits
  key location: keyring
  device:  /dev/nvme0n2
  sector size:  512
  offset:  32768 sectors
  size:    4161536 sectors
  mode:    read/write
Command successful.
[root@localhost ~]#

Antes de utilizar el disco encriptado

Por motivos de seguridad, conviene eliminar cualquier dato que pudiese tener el disco. Podría ser algún disco reutilizado, por ejemplo.

[root@localhost ~]# dd if=/dev/zero of=/dev/mapper/test
dd: writing to '/dev/mapper/test': No space left on device
4161537+0 records in
4161536+0 records out
2130706432 bytes (2.1 GB, 2.0 GiB) copied, 43.8529 s, 48.6 MB/s
[root@localhost ~]# 

Creación de un filesystem en el disco encriptado

Este punto no tiene ningún misterio. Se sigue el mismo procedimiento que utilizamos habitualmente para crear cualquier filesystem en Linux.

[root@localhost ~]# mkfs.xfs /dev/mapper/test 
meta-data=/dev/mapper/test       isize=512    agcount=4, agsize=130048 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=520192, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@localhost ~]#

Montaje del filesystem

Para utilizar el disco inmediatamente, siempre podremos montar el filesystem a través de la línea de comandos:

[root@localhost ~]# mkdir /test
[root@localhost ~]# mount /dev/mapper/test /test
[root@localhost ~]# df -hP /test
Filesystem        Size  Used Avail Use% Mounted on
/dev/mapper/test  2.0G   47M  2.0G   3% /test
[root@localhost ~]# 

Pero, lo lógico, es que queramos montar los filesystems encriptados con el arranque del sistema. Para ello, tendremos que configurar los ficheros /etc/crypttab y /etc/fstab y crear un fichero de encriptación con las credenciales de acceso que, en este caso, lo llamaremos /root/keytest:

  • Creación del fichero que almacenará la clave de encriptación:
[root@localhost ~]# dd if=/dev/urandom of=/root/keytest bs=1024 count=4
4+0 records in
4+0 records out
4096 bytes (4.1 kB, 4.0 KiB) copied, 0.00024515 s, 16.7 MB/s
[root@localhost ~]#

[root@localhost ~]# chmod 0400 /root/keytest  

  • Añadimos la clave de encriptación al fichero:
[root@localhost ~]# cryptsetup luksAddKey /dev/nvme0n2 /root/keytest
Enter any existing passphrase: 
[root@localhost ~]# 
  • Configuramos el fichero /etc/crypttab para el mapeo del disco encriptado durante el arranque del sistema, haciendo referencia al fichero que contiene la clave cifrada generado anteriormente:
[root@localhost ~]# cat /etc/crypttab 
test	/dev/nvme0n2	
/root/keytest
[root@localhost ~]#
  • Configuramos el fichero /etc/fstab para el montaje del filesystem durante el arranque del sistema:
[root@localhost ~]# tail -1 /etc/fstab
/dev/mapper/test	/test	xfs	defaults	0 0
[root@localhost ~]#

Uso de LUKs con LVM (Logical Volume Manager)

De la misma manera que hemos creado un filesystem, también podemos utilizar el disco encriptado para que forme parte de una estructura LVM.

[root@localhost ~]# vgcreate vgtest /dev/mapper/test
WARNING: xfs signature detected on /dev/mapper/test at offset 0. Wipe it? [y/n]: y
  Wiping xfs signature on /dev/mapper/test.
  Physical volume "/dev/mapper/test" successfully created.
  Volume group "vgtest" successfully created
[root@localhost ~]#

[root@localhost ~]# lvcreate -n lvtest -l+100%FREE vgtest

  Logical volume "lvtest" created.
[root@localhost ~]# 
[root@localhost ~]# mkfs.xfs /dev/vgtest/lvtest 
meta-data=/dev/vgtest/lvtest     isize=512    agcount=4, agsize=64256 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=257024, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=1566, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@localhost ~]# 


[root@localhost ~]# tail -1 /etc/fstab 
/dev/vgtest/lvtest	/test	xfs	defaults	0 0
[root@localhost ~]# 

[root@localhost ~]# mount /test
[root@localhost ~]# df -hP /test
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/vgtest-lvtest  998M   40M  959M   4% /test
[root@localhost ~]# 

Desmontaje de una LUK

Si tenemos la necesidad de desmontar un filesystem encriptado y el disco, lo podremos realizar fácilmente de la siguiente manera:

[root@localhost ~]# umount /test
[root@localhost ~]# cryptsetup luksClose test
[root@localhost ~]# 

Modificar la contraseña de encriptación de una LUK

Con el siguiente comando cambiaremos la contraseña de encriptación del disco.

[root@localhost ~]# cryptsetup luksChangeKey /dev/nvme0n2
Enter passphrase to be changed: 
No key available with this passphrase.
[root@localhost ~]# 

No tendremos que volver a generar el fichero /root/keytest, que habíamos generado anteriormente para el montaje automático del filesystem con el arranque del sistema.

¿Podemos desencriptar un disco que ya ha sido encriptado con LUKs?

La respuesta rápida es que no. Lo que tenemos que hacer es:

  • Una copia de seguridad de nuestros datos
  • Eliminar la entrada del fichero /etc/crypttab
  • Desmontar el filesystem
  • Ejecutar el comando cryptsetup status. Por ejemplo: cryptsetup status /dev/mapper/luks-X
  • Eliminar a LUN: cryptsetup remove luks-X
  • Recrear el filesystem
  • Restaurar los datos

Más detalles en la documentación oficial de RedHat sobre eliminación de LUKs.

Te puede interesar

COMPÁRTEME

Deja un comentario