Dm-crypt
dm-crypt É um sistema de criptografia de disco usando a estrutura de criptografia de kernels e device mapper como subsistema. Com o dm-crypt, os administradores podem criptografar discos inteiros, volumes lógicos, partições, mas também arquivos únicos.
O subsistema dm-crypt suporta o Linux Unified Key Setup (LUKS) estrutura, que permite várias chaves acessar os dados criptografados, bem como manipular as chaves (como alterar as chaves, adicionando frases adicionais, etc.) Embora dm-crypt suporte configurações não-LUKS também, este artigo irá focar a funcionalidade LUKS, principalmente devido à sua flexibilidade, capacidade de gestão, bem como amplo apoio na comunidade.
Configuração
Existem dois pré-requisitos antes que se possa começar a usar dm-crypt:
- Configuração do Kernel do Linux
- Instalação do pacote sys-fs/cryptsetup
Configuração do Kernel
Para usar dm-crypt há um número de entradas de configuração que são necessárias.
Em primeiro lugar, o suporte à infra-estrutura device mapper, bem como crypt target deve ser incluído:
[*] Enable loadable module support
Device Drivers --->
[*] Multiple devices driver support (RAID and LVM) --->
<*> Device mapper support
<*> Crypt target support
Em seguida, o kernel do Linux precisa suportar o conjunto de APIs criptográficas que o administrador deseja usar para criptografia. Estes podem ser: 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
Se o sistema de arquivos root também será criptografado, será necessário criar um sistema de arquivos ram inicial no qual o sistema de arquivos root será descriptografado antes de ser montado. Assim, isso também requer suporte a 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.
Instalação do Cryptsetup
O pacote sys-fs/cryptsetup fornece o comando cryptsetup, que é usado para abrir ou fechar o armazenamento criptografado, bem como gerenciar as senhas ou chaves associadas a ele.
root #
emerge --ask sys-fs/cryptsetup
Armazenamento Criptografado
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
Arquivo chave ou Frase de Acesso
Para começar com o armazenamento criptografado, o administrador precisará decidir qual método usar para a chave de criptografia. Com cryptsetup a escolha é uma frase de acesso ou um arquivo chave. No caso de um arquivo chave, este pode ser qualquer arquivo, mas recomenda-se usar um arquivo com dados aleatórios que esteja devidamente protegido (considerando que o acesso a este arquivo de chave significará acesso aos dados criptografados).
Para criar o arquivo chave, utilize o comando: dd
root #
dd if=/dev/urandom of=/etc/keys/enc.key bs=1 count=4096
Nas próximas seções, mostraremos todos os comandos para ambas as situações - frase de acesso e arquivo chave. É claro que apenas um método é necessário.
Criando uma plataforma de armazenamento criptografada
Para criar uma plataforma de armazenamento criptografada (que pode ser um disco, partição, arquivo, ...) use o comando cryptsetup com o luksFormat
.
Por exemplo, ter /dev/vdb2 como o meio de armazenamento para os dados criptografados:
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 usar um arquivo de chaves em vez de uma frase secreta:
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
O -s 512
diz cryptsetup Qual keylength usar para a chave de criptografia real (ao contrário da frase secreta ou arquivo chave, que são usados para acessar essa chave de criptografia real).
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
Abrindo o armazenamento criptografado
A fim de abrir o armazenamento criptografado (isto é, tornar os dados reais acessíveis através de decodificação transparente), utilize luksOpen
.
root #
cryptsetup luksOpen /dev/vdb2 myname
Enter passphrase for /dev/vdb2: ...
Se um arquivo chave for usado, então o comando ficará assim:
root #
cryptsetup luksOpen -d /etc/keys/enc.key /dev/vdb2 myname
Quando o comando termina com êxito, um novo arquivo de dispositivo chamado /dev/mapper/myname será disponibilizado.
Se esta é a primeira vez que este dispositivo criptografado é usado, ele precisa ser formatado. O exemplo a seguir utiliza o sistema de arquivos Btrfs Mas é claro que qualquer outro sistema de arquivos fará:
root #
mkfs.btrfs /dev/mapper/myname
Uma vez que o sistema de arquivos é formatado ou a formatação já foi feita no passado, o arquivo do dispositivo pode ser montado no sistema:
root #
mount /dev/mapper/myname /home
Fechando o armazenamento criptografado
Para fechar o armazenamento criptografado (ou seja, garantir que os dados reais não são mais acessíveis através da decodificação transparente) utilize: luksClose
root #
cryptsetup luksClose myname
Claro, certifique-se de que o dispositivo não está mais em uso.
Manipulando chaves LUKS
As chaves LUKS são usadas para acessar a chave de criptografia real. Elas são armazenados em slots no cabeçalho da partição, disco ou arquivo (criptografado).
Listando os slots
Com o luksDump
, informações sobre a partição, disco ou arquivos criptografados podem ser mostrados. Isso inclui os 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
No exemplo acima, são utilizados dois slots. Observe que luksDump
não dá nada sensível - é apenas exibido o conteúdo do cabeçalho LUKS. Nenhuma chave de criptografia tem que ser fornecida para chamar luksDump
.
Adicionando arquivo chave ou frase secreta
Para adicionar um arquivo chave ou frase secreta para acessar o armazenamento criptografado, utilize: 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 usar um arquivo chave para desbloquear a chave (mas ainda adicionar uma frase secreta):
root #
cryptsetup luksAddKey -d /etc/keys/enc.key /dev/vdb2
Enter new passphrase for key slot: ... Verify passphrase: '''
Um arquivo chave deve ser adicionado em (/etc/keys/backup.key):
root #
cryptsetup luksAddKey /dev/vdb2 /etc/keys/backup.key
Ou, para usar o primeiro arquivo chave para destravar a chave principal:
root #
cryptsetup luksAddKey -d /etc/keys/enc.key /dev/vdb2 /etc/keys/backup.key
Remvoendo arquivo chave ou frase secreta
Com o luksRemoveKey
, um arquivo chave ou frase secreta pode ser removido (para que eles não possam mais serem usados para descriptografar o armazenamento):
root #
cryptsetup luksRemoveKey /dev/vdb2
Enter LUKS passphrase to be deleted: ...
Ou remova o arquivo chave:
root #
cryptsetup luksRemoveKey -d /etc/keys/backup.key /dev/vdb2
Certifique-se de que pelo menos um método para acessar os dados ainda esteja disponível. Uma vez que uma frase secreta ou arquivo chave é removido, não poderá ser recuperado novamente.
Esvaziando o slot
Suponha que a frase secreta ou arquivo chave não é mais conhecido, então o slot pode ser liberado. Naturalmente, isso requer conhecimento prévio de qual slot que a frase secreta ou arquivo chave foi armazenado.
Por exemplo, para esvaziar o slot 2 (que é o terceiro slot, pois os slots são numerados a partir do 0):
root #
cryptsetup luksKillSlot /dev/vdb2 2
Este comando pedirá uma frase de acesso válida antes de continuar. Ou pode-se utilizar o arquivo chave:
root #
cryptsetup luksKillSlot -d /etc/keys/enc.key /dev/vdb2 2
Automate mounting encrypted file systems
Until now, the article focused on manual setup and mounting/unmounting of encrypted file systems. An init service dmcrypt exists which automates the decrypting and mounting of encrypted file systems.
Configuring dm-crypt
Edit the /etc/conf.d/dmcrypt file and add in entries for each file system. The supported entries are well documented in the file, the below example is just that - an example:
# Definition for /dev/mapper/home (for /home)
target=home
source=UUID="abcdef12-321a-a324-a88c-cac412befd98"
key=/etc/keys/home.key
# If trim is desired, it can be enabled as below.
# Keep in mind that trim is not enabled by default for a security reason.
# This configuration is optional, otherwise default options apply.
options="--allow-discards"
# Definition for /dev/mapper/local (for /usr/local)
target=local
source=UUID="fedcba34-4823-b423-a94c-cadbefda2943"
key=/etc/keys/local.key
# Using an encrypted partition as key source.
target=other
source=UUID="ff24303e-49e1-4d13-b8ad-fc6b7e1d8174"
key=/keys/other.key # Relative to the root of the encrypted partition.
remdev=/dev/mapper/home # The recently decrypted partition.
# An empty line is important at the end of the file
If using passphrase instead of a keyfile, you'll be prompted for it on boot (given a simple target and source configuration).
Configuring fstab
The next step is to configure /etc/fstab to automatically mount the (decrypted) file systems when they become available. It is recommended to first obtain the UUID of the decrypted (mounted) file system:
root #
blkid /dev/mapper/home
/dev/mapper/home: UUID="4321421a-4321-a6c9-de52-ba6421efab76" TYPE="ext4"
Then, update the /etc/fstab file accordingly:
UUID="4321421a-4321-a6c9-de52-ba6421efab76" /home ext4 defaults 0 0
UUID="bdef2432-3bd1-4ab4-523d-badcf234a342" /usr/local ext4 defaults 0 0
Add initscript to bootlevel
Don't forget to have the dmcrypt init service launched at boot:
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.