Dm-crypt
dm-crypt es un sistema de cifrado de discos que utiliza el marco API de cifrado del núcleo y el subsistema mapeador de dispositivos. Con dm-crypt, los administradores no solo pueden cifrar discos enteros, volúmenes lógicos o particiones, sino también ficheros individuales.
El subsistema de dm-crypt da soporte a la estructura Linux Unified Key Setup (LUKS), lo que permite usar múltiples claves para acceder a los datos cifrados, así como manipular las claves (esto es, cambiar las claves, añadir frases de acceso adicionales, etc.). A pesar de que dm-crypt soporta configuraciones no solo para LUKS, este artículo se centrará en la funcionalidad de LUKS, sobre todo debido a su flexibilidad, capacidad de gestión, así como por su amplio apoyo por parte de la comunidad.
Configuración
Hay dos requisitos previos antes de poder comenzar a usar dm-crypt:
- Configurar el núcleo de Línux.
- Instalar el paquete sys-fs/cryptsetup.
Configurar el núcleo
Para usar dm-crypt hay una serie de entradas de configuración que deben quedar definidas.
En primer lugar, se debe incluir soporte para la infraestructura del mapeador de dispositivos así como para el objetivo a cifrar:
[*] Enable loadable module support
Device Drivers --->
[*] Multiple devices driver support (RAID and LVM) --->
<*> Device mapper support
<*> Crypt target support
Luego, el núcleo de Línux necesita tener soporte para el conjunto de las API criptográficas que el administrador desee utilizar para el cifrado. Este se puede encontrar en la sección Cryptographic API:
[*] Cryptographic API --->
<*> XTS support
<*> SHA224 and SHA256 digest algorithm
<*> AES cipher algorithms
<*> AES cipher algorithms (x86_64)
<*> User-space interface for symmetric key cipher algorithms
Si se ha cifrado el sistema de ficheros root, entonces se debe crear un sistema de ficheros RAM inicial en el que el sistema de ficheros root sea descifrado antes de montarlo. Por lo tanto, esto requiere soporte para initramfs:
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
If using the tcrypt encryption option (TrueCrypt/tcplay/VeraCrypt compatibility mode), then the following items will also need to be added to the kernel. Otherwise, cryptsetup will return the following errors: "device-mapper: reload ioctl failed: Invalid argument" and "Kernel doesn't support TCRYPT compatible mapping".
Device Drivers ---> [*] Block Devices Search for <code>CONFIG_BLK_DEV</code> to find this item. ---> <*> Loopback device support Search for <code>CONFIG_BLK_DEV_LOOP</code> to find this item. File systems ---> <*> FUSE (Filesystem in Userspace) support Search for <code>CONFIG_FUSE_FS</code> to find this item. [*] Cryptographic API Search for <code>CONFIG_CRYPTO</code> to find this item. ---> Hashes, digests, and MACs ---> <*> RIPEMD-160 Search for <code>CONFIG_CRYPTO_RMD160</code> to find this item. <*> SHA-384 and SHA-512 Search for <code>CONFIG_CRYPTO_SHA512</code> to find this item. <*> Whirlpool Search for <code>CONFIG_CRYPTO_WP512</code> to find this item. Length-preserving ciphers and modes ---> <*> LRW (Liskov Rivest Wagner) Search for <code>CONFIG_CRYPTO_LRW</code> to find this item. Block ciphers ---> <*> Serpent Search for <code>CONFIG_CRYPTO_SERPENT</code> to find this item. <*> Twofish Search for <code>CONFIG_CRYPTO_TWOFISH</code> to find this item.
Instalar cryptsetup
El paquete sys-fs/cryptsetup proporciona la orden cryptsetup, que se utiliza para abrir o cerrar el soporte que sirve de almacenamiento cifrado, así como para gestionar las frases de acceso o claves asociadas con él.
root #
emerge --ask sys-fs/cryptsetup
Almacenamiento cifrado
Benchmark
cryptsetup provides a benchmarking tool which will help to decide which setup to choose. The output depends on kernel settings as well as USE flags and destination (HDD, SSD etc.).
root #
cryptsetup benchmark
# Tests are approximate using memory only (no storage IO). PBKDF2-sha1 3622024 iterations per second for 256-bit key PBKDF2-sha256 7410431 iterations per second for 256-bit key PBKDF2-sha512 3216490 iterations per second for 256-bit key PBKDF2-ripemd160 1157368 iterations per second for 256-bit key PBKDF2-whirlpool 1069975 iterations per second for 256-bit key argon2i 14 iterations, 1048576 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time) argon2id 15 iterations, 1048576 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time) # Algorithm | Key | Encryption | Decryption aes-cbc 128b 1520.5 MiB/s 4400.1 MiB/s serpent-cbc 128b 159.6 MiB/s 1061.9 MiB/s twofish-cbc 128b 310.8 MiB/s 662.1 MiB/s aes-cbc 256b 1175.8 MiB/s 4025.0 MiB/s serpent-cbc 256b 160.0 MiB/s 1054.8 MiB/s twofish-cbc 256b 312.6 MiB/s 655.5 MiB/s aes-xts 256b 4081.0 MiB/s 4073.5 MiB/s serpent-xts 256b 953.7 MiB/s 946.3 MiB/s twofish-xts 256b 597.5 MiB/s 616.8 MiB/s aes-xts 512b 3733.8 MiB/s 3743.3 MiB/s serpent-xts 512b 970.9 MiB/s 964.5 MiB/s twofish-xts 512b 598.1 MiB/s 611.3 MiB/s
Fichero de claves o frase de acceso
Para comenzar con el almacenamiento cifrado, el administrador tendrá que decidir qué método utilizar para la clave de cifrado. Con cryptsetup la elección consistirá en una frase de acceso o en un fichero de claves. En el caso de un fichero de claves, este puede ser cualquier fichero, pero se recomienda utilizar un fichero con datos aleatorios que esté protegido adecuadamente (teniendo en cuenta que el acceso a este fichero de claves permitirá tener acceso a todos los datos cifrados).
Para crear un fichero de claves, se puede utilizar la orden dd:
root #
dd if=/dev/urandom of=/etc/keys/enc.key bs=1 count=4096
En las siguientes secciones, mostraremos todas las órdenes para ambas situaciones —frase de acceso y fichero de claves—. Por supuesto, solo un método es necesario.
Crear una plataforma de almacenamiento cifrada
Con el fin de crear una plataforma de almacenamiento cifrada (que puede ser un disco, partición, fichero, ...) utilice la orden cryptsetup con la opción luksFormat
.
Por ejemplo, para tener /dev/vdb2 como medio de almacenamiento para albergar los datos cifrados:
root #
cryptsetup -s 512 luksFormat /dev/vdb2
This will overwrite data on /dev/vdb2 irrevocably. Are you sure? (Type uppercase yes): YES Enter LUKS passphrase: ... Verify passphrase: ...
Para utilizar un fichero de claves, en lugar de una frase de acceso:
root #
cryptsetup -s 512 luksFormat /dev/vdb2 /etc/keys/enc.key
This will overwrite data on /dev/vdb2 irrevocably. Are you sure? (Type uppercase yes): YES
El parámetro -s 512
le dice a cryptsetup qué longitud de clave (KeyLength) utilizar para la clave de cifrado vigente (a diferencia de la frase de acceso o fichero de claves, que se utilizan para tener acceso a esta clave de cifrado actual).
XTS splits the key into two halves, only one being used for the actual encryption. That means "aes-xts" with a 512-bit key actually uses 256 bits for the AES part.
If the LUKS header gets damaged, your encrypted data will be lost forever, even if you have a backup of the GPG key and passphrase. Therefore, you may wish to consider backing up this header to a separate device, and storing it securely. See the LUKS FAQ for more details on how to do this.
root #
cryptsetup luksHeaderBackup /dev/sdXn --header-backup-file /tmp/efiboot/luks-header.img
Full disk encryption booting
To boot from a fully encrypted device (including encrypted /boot) using GRUB, encrypt using luks1, since luks2 isn't fully supported yet. Example command:
root #
cryptsetup -c aes-xts-plain64 -s 512 -y luksFormat --type luks1 /dev/vdb2
Abrir el almacenamiento cifrado
Con el fin de abrir el almacenamiento cifrado (es decir, que los datos reales sean accesibles a través del descifrado transparente), utilice la orden luksOpen
.
root #
cryptsetup luksOpen /dev/vdb2 myname
Enter passphrase for /dev/vdb2: ...
Si se utiliza un fichero de claves, la orden se vería así:
root #
cryptsetup luksOpen -d /etc/keys/enc.key /dev/vdb2 nombredeldispositivo
Cuando la orden termina con éxito, a continuación, un fichero de dispositivo nuevo, llamado /dev/mapper/nombredeldispositivo, estará disponible.
Si esta es la primera vez que se utiliza este dispositivo cifrado, entonces necesita ser formateado. El siguiente ejemplo utiliza el sistema de archivos Btrfs pero, desde luego, se puede utilizar cualquier otro:
root #
mkfs.btrfs /dev/mapper/minombre
Una vea se ha dado formato al sistema de archivos o ya se ha realizado el formato anteriormente, el fichero de dispositivo se puede montar en el sistema:
root #
mount /dev/mapper/nombredeldispositivo /home
Cerrar el almacenamiento cifrado
Con el fin de cerrar el almacenamiento cifrado (es decir, asegurarse de que los datos reales ya no son accesibles a través del descifrado transparente), utilice la orden luksClose
:
root #
cryptsetup luksClose nombredeldispositivo
Por supuesto, asegúrese de que el dispositivo ya no está en uso.
Manipular las claves de LUKS
Las claves de LUKS se utilizan para acceder a la clave de cifrado real. Se almacenan en ranuras (slots) en la cabecera de la de partición (cifrada), disco o fichero.
Listar los slots
Con la orden luksDump
puede mostrarse la información sobre la partición cifrada, disco o fichero. Esto incluye las ranuras o slots:
root #
cryptsetup luksDump /dev/vdb2
LUKS header information for /dev/vdb2 Version: 1 Cipher name: aes Cipher mode: xts-plain64 Hash spec: sha1 Payload offset: 4096 MK bits: 512 MK digest: 34 3b ec ac 10 af 19 e7 e2 d4 c8 90 eb a8 da 3c e4 4f 2e ce MK salt: ff 7c 7f 53 db 53 48 02 a4 32 dc e0 22 fc a3 51 06 ba b3 48 b3 28 13 a8 7a 68 43 d6 46 79 14 fe MK iterations: 59375 UUID: 2921a7c9-7ccb-4300-92f4-38160804e08c Key Slot 0: ENABLED Iterations: 241053 Salt: 90 0f 0f db cf 66 ea a9 6c 7c 0c 0d b0 28 05 2f 8a 5c 14 54 98 62 1a 29 f3 08 25 0c ec c2 b1 68 Key material offset: 8 AF stripes: 4000 Key Slot 1: ENABLED Iterations: 273211 Salt: 01 4c 26 ed ff 18 75 31 b9 89 5d a6 e0 b5 f4 14 48 d0 23 47 a9 85 78 fb 76 c4 a9 d0 cd 63 fb d7 Key material offset: 512 AF stripes: 4000 Key Slot 2: DISABLED Key Slot 3: DISABLED Key Slot 4: DISABLED Key Slot 5: DISABLED Key Slot 6: DISABLED Key Slot 7: DISABLED
En el ejemplo anterior, se observa que son utilizadas dos ranuras. Tenga en cuenta que luksDump
no muestra información sensible —simplemente muestra el contenido de la cabecera LUKS—. luksDump
tiene que ser invocado sin proporcionar clave de descifrado.
Añadir un fichero de claves o frase de acceso
Para agregar un fichero de claves o frase de acceso (passphrase) adicional para acceder al almacenamiento cifrado, utilice la orden luksAddKey
:
root #
cryptsetup luksAddKey /dev/vdb2
Enter any passphrase: (Enter a valid, previously used passphrase to unlock the key) Enter new passphrase for key slot: ... Verify passphrase: ...
Para utilizar un fichero de claves para desbloquear la clave (pero aún así, teniendo que añadir una frase de acceso):
root #
cryptsetup luksAddKey -d /etc/keys/enc.key /dev/vdb2
Enter new passphrase for key slot: ... Verify passphrase: '''
Si se añade un fichero de claves (por ejemplo /etc/keys/backup.key):
root #
cryptsetup luksAddKey /dev/vdb2 /etc/keys/backup.key
O, para usar el primer fichero de claves para desbloquear la clave principal:
root #
cryptsetup luksAddKey -d /etc/keys/enc.key /dev/vdb2 /etc/keys/backup.key
Eliminar un fichero de claves o frase de acceso
Con la orden luksRemoveKey
se puede eliminar un fichero de claves o la frase de acceso (para que ya no se pueden utilizar para descifrar el almacenamiento). Así, para eliminar una frase de acceso:
root #
cryptsetup luksRemoveKey /dev/vdb2
Enter LUKS passphrase to be deleted: ...
O así, para eliminar un fichero de claves:
root #
cryptsetup luksRemoveKey -d /etc/keys/backup.key /dev/vdb2
Asegúrese de que, al menos, quede un método disponible para acceder a los datos. Una vez que se elimina una frase de acceso o fichero de claves para su uso, este no se puede recuperar de nuevo.
Vaciar un slot
Supongamos que la frase de acceso o fichero de claves ya no se recuerda, entonces la ranura puede ser liberada. Por supuesto, esto requiere un conozcamos previamente cúal es la ranura en la que la frase de acceso o fichero de claves estaba almacenada.
Por ejemplo, para vaciar la ranura 2 (que es la tercera de las ranuras, dado que se enumeran a partir de 0):
root #
cryptsetup luksKillSlot /dev/vdb2 2
Esta orden le pedirá una contraseña válida antes de continuar. O, se puede indicar el fichero de claves que se debe utilizar:
root #
cryptsetup luksKillSlot -d /etc/keys/enc.key /dev/vdb2 2
Automatizar el montaje de sistemas de ficheros cifrados
Hasta ahora, el artículo se ha centrado en la configuración manual y en el montaje y desmontaje de sistemas de ficheros cifrados. El servicio de inicio dmcrypt automatiza el descifrado y montaje de los sistemas de ficheros cifrados.
Configurar dm-crypt
Editar el fichero /etc/conf.d/dmcrypt y añadir entradas para cada sistema de ficheros. Las entradas permitidas están bien documentadas en el fichero, el ejemplo de abajo es solo eso, un ejemplo:
# Definición para /dev/mapper/home (para /home)
target=home
source=UUID="abcdef12-321a-a324-a88c-cac412befd98"
key=/etc/keys/home.key
# Definición para /dev/mapper/local (para /usr/local)
target=local
source=UUID="fedcba34-4823-b423-a94c-cadbefda2943"
key=/etc/keys/local.key
If using passphrase instead of a keyfile, you'll be prompted for it on boot (given a simple target and source configuration).
Configurar fstab
El siguiente paso es configurar /etc/fstab para montar automáticamente los sistemas de ficheros (descifrados) cuando están disponibles. Se recomienda obtener en primer lugar el UUID del sistema de ficheros descifrado (montado):
root #
blkid /dev/mapper/home
/dev/mapper/home: UUID="4321421a-4321-a6c9-de52-ba6421efab76" TYPE="ext4"
A continuación actualizar el fichero /etc/fstab adecuadamente:
UUID="4321421a-4321-a6c9-de52-ba6421efab76" /home ext4 defaults 0 0
UUID="bdef2432-3bd1-4ab4-523d-badcf234a342" /usr/local ext4 defaults 0 0
Añadir el guión de inicio al nivel de arranque
No olvidar que se debe lanzar el guión de inicio dmcrypt en el arranque:
root #
rc-update add dmcrypt boot
Make decrypted device nodes visible
If you have decrypted/unlocked a device before the services were started for example your root disk in an with an initramfs then it's possible that the mapped device is not visible. In this case you can run the following to recreate it.
root #
dmsetup mknodes
Mounting TrueCrypt/tcplay/VeraCrypt volumes
root #
cryptsetup --type tcrypt open container-to-mount container-name
Replace container-to-mount with the device file under /dev or the path to the file you wish to open. Upon successful opening, the plaintext device will appear as /dev/mapper/container-name, which you can mount
like any normal device.
If you are using key files, supply them using the --key-file
option, to open a hidden volume, supply the --tcrypt-hidden
option and for a partition or whole drive that is encrypted in system mode use the --tcrypt-system
option.
When done, unmount
the volume, and close the container using the following command:
root #
cryptsetup close container-name
See also
- Full Disk Encryption From Scratch — a guide which covers the process of configuring a drive to be encrypted using LUKS and btrfs.
- Dm-crypt full disk encryption — a guide which covers the process of configuring a drive to be encrypted using LUKS and btrfs.
- User:Sakaki/Sakaki's EFI Install Guide/Preparing the LUKS-LVM Filesystem and Boot USB Key
External resources
- The cryptsetup FAQ hosted on GitLab covers a wide range of frequently asked questions.