Dm-crypt

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Dm-crypt and the translation is 86% complete.
Outdated translations are marked like this.


Resources

dm-crypt — это система шифрования дисков с использованием платформы ядра crypto API и подсистемы определения устройств. С помощью dm-crypt администраторы могут зашифровать весь диск, логические тома, разделы, а также отдельные файлы.

Подсистема dm-crypt поддерживает структуру Linux Unified Key Setup (LUKS), которая позволяет с помощью различных ключей получать доступ к зашифрованным данным, а также управлять ключами (например, изменять ключи, добавлять дополнительные пароли, и др.) Хотя dm-crypt поддерживает установку без LUKS, данная статья будет в основном посвящена функционалу LUKS, в силу её гибкости, управляемости, а также широкой поддержки в обществе.

Конфигурация

Существует два условия, необходимых для использования dm-crypt:

  1. Настройка ядра Linux
  2. Установка пакета sys-fs/cryptsetup

Конфигурация ядра

Для использования dm-crypt необходимо настроить несколько параметров конфигурации.

Прежде всего, должна быть включена поддержка инфраструктуры device mapper и crypt target:

ЯДРО Включение device mapper и crypt target
[*] Enable loadable module support Search for <code>CONFIG_MODULES</code> to find this item. --->
Device Drivers --->
  [*] Multiple devices driver support (RAID and LVM) Search for <code>CONFIG_MD</code> to find this item. --->
    <*> Device mapper support Search for <code>CONFIG_BLK_DEV_DM</code> to find this item.
    <*> Crypt target support Search for <code>CONFIG_DM_CRYPT</code> to find this item.

Далее, ядро Linux должно поддерживать набор криптографических функций, которые администратор хочет использовать для шифрования. Они могут быть найдены в разделе Cryptographic API:

ЯДРО Включение функций криптографического API
[*] Cryptographic API Search for <code>CONFIG_CRYPTO</code> to find this item. --->
  Block ciphers --->
    <*> AES (Advanced Encryption Standard) Search for <code>CONFIG_CRYPTO_AES</code> to find this item.
    <*> AES cipher algorithms (x86_64)
  Length-preserving ciphers and modes --->
    <*> XTS (XOR Encrypt XOR with ciphertext stealing) Search for <code>CONFIG_CRYPTO_XTS</code> to find this item.
  Hashes, digests, and MACS --->
    <*> SHA-224 and SHA-256 Search for <code>CONFIG_CRYPTO_SHA256</code> to find this item.
  Userspace interface --->
    <*> Hash algorithms Search for <code>CONFIG_CRYPT_USER_API_HASH</code> to find this item.
    <*> Symmetric key cipher algorithms Search for <code>CONFIG_CRYPTO_USER_API_SKCIPHER</code> to find this item.

Если также будет зашифрована корневая файловая система, необходимо создать initramfs, в которой корневая файловая система будет расшифрована перед монтированием. Таким образом, требуется поддержка initramfs:

ЯДРО Включение поддержки initramfs
General setup  --->
  [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support Search for <code>CONFIG_BLK_DEV_INITRD</code> to find this item.

При использовании опции шифрования tcrypt (режим совместимости с TrueCrypt/tcplay/VeraCrypt) в ядро также должны быть добавлены следующие компоненты. В противном случае, cryptsetup будет выходить с ошибками "device-mapper: reload ioctl failed: Invalid argument" и "Kernel doesn't support TCRYPT compatible mapping".

ЯДРО Включение поддержки tcrypt (режим совместимости с TrueCrypt/tcplay/VeraCrypt)
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.

Установка Cryptsetup

Пакет sys-fs/cryptsetup предоставляет команду cryptsetup, которая используется для открытия или закрытия зашифрованного хранилища, а также для управления паролями и связанными с ними ключами.

root #emerge --ask sys-fs/cryptsetup

Зашифрованное хранилище

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

Ключевой файл или пароль

Чтобы начать работу с зашифрованным хранилищем, администратор должен решить, какой метод использовать для создания ключа шифрования. Если используется cryptsetup, можно выбрать пароль или ключевой файл. Ключевой файл может быть любым файлом, но рекомендуется использовать надлежащим образом защищённый (ввиду того, что доступ к ключевому файлу подразумевает доступ к зашифрованным данным) файл с случайными данными.

Для создания ключевого файла, можно использовать команду dd:

root #dd if=/dev/urandom of=/etc/keys/enc.key bs=1 count=4096

В следующих разделах мы будем указывать каждую команду для обоих случаев: пароля и ключевого файла. Конечно, необходим только один метод.

Создание платформы зашифрованного хранилища

Чтобы создать платформу защищённого хранилища (которое может быть диском, разделом, файлом, ...) вызовите команду cryptsetup с параметром luksFormat.

К примеру, что использовать /dev/vdb2 как носитель зашифрованных данных:

root #cryptsetup -c aes-xts-plain64 -s 512 -y luksFormat /dev/vdb2
This will overwrite data on /dev/vdb2 irrevocably.
  
Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase: ...
Verify passphrase: ...

Для использования ключевого файла вместо пароля:

root #cryptsetup -c aes-xts-plain64 -s 512 -y luksFormat /dev/vdb2 /etc/keys/enc.key
This will overwrite data on /dev/vdb2 irrevocably.
  
Are you sure? (Type uppercase yes): YES

Параметр -s 512 сообщает cryptsetup, какую длину ключа использовать для настоящего ключа шифрования (который, в отличие от пароля или ключевого файла, используется непосредственно для доступа к данным).

Заметка
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
Be aware, that if you do keep a LUKS header backup in this fashion and subsequently revoke any of the keyslots, the old keys will still be usable to unlock the LUKS partition for those with an access to that header backup file.

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

Открытие зашифрованного хранилища

Чтобы открыть зашифрованное хранилище (т.е. сделать реальные данные доступными благодаря незаметной расшифровке), используйте параметр luksOpen.

root #cryptsetup luksOpen /dev/vdb2 myname
Enter passphrase for /dev/vdb2: ...

Если используется ключевой файл, команда будет выглядеть таким образом:

root #cryptsetup luksOpen -d /etc/keys/enc.key /dev/vdb2 myname

Когда команда успешно завершится, станет доступным новый файл устройства /dev/mapper/myname.

Если это зашифрованное устройство используется в первый раз, его необходимо отформатировать. Следующий пример использует файловую систему Btrfs, но, конечно же, система может создать и любую другую:

root #mkfs.btrfs /dev/mapper/myname

Когда файловая система создана, или форматирование уже было произведено в прошлом, файл устройства может быть смонтирован:

root #mount /dev/mapper/myname /home

Закрытие зашифрованного хранилища

Чтобы закрыть зашифрованное хранилище (т.е. убедиться, что реальные данные больше не доступны благодаря незаметной расшифровке), используйте параметр luksClose:

root #cryptsetup luksClose myname

Конечно, убедитесь, что устройство больше не используется:

Управление ключами LUKS

Ключи LUKS используются для доступа к реальным ключам шифрования. Они хранятся в слотах в заголовке (зашифрованного) раздела, диска или файла.

Вывод списка слотов

С параметром luksDump может быть отображена информация о зашифрованном разделе, диске или файле. Она содержит слоты:

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

В приведённом выше примере использованы два слота. Заметьте, что luksDump не разглашает ничего секретного – она просто отображает содержимое заголовка LUKS. Чтобы вызвать luksDump, нет необходимости предоставлять ключи расшифровки.

Добавление ключевого файла или пароля

Чтобы добавить дополнительный ключевой файл или пароль для доступа к зашифрованным данным, используйте параметр 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: ...

Чтобы использовать ключевой файл для открытия ключа (но всё же, с добавлением пароля):

root #cryptsetup luksAddKey -d /etc/keys/enc.key /dev/vdb2
Enter new passphrase for key slot: ...
Verify passphrase: ...

Если необходимо добавить ключевой файл (скажем,

/etc/keys/backup.key):
root #cryptsetup luksAddKey /dev/vdb2 /etc/keys/backup.key

Или, чтобы использовать первый ключевой файл, для открытия основного ключа:

root #cryptsetup luksAddKey -d /etc/keys/enc.key /dev/vdb2 /etc/keys/backup.key

Удаление ключевого файла или пароля

С помощью параметра luksRemoveKey можно удалить ключевой файл или пароль (таким образом, их больше невозможно будет использовать для расшифровки хранилища):

root #cryptsetup luksRemoveKey /dev/vdb2
Enter LUKS passphrase to be deleted: ...

Или для удаления ключевого файла:

root #cryptsetup luksRemoveKey -d /etc/keys/backup.key /dev/vdb2

Убедитесь, что хотя бы один способ доступа к данным остался доступен. Когда пароль или ключевой файл снят с использования, он не может быть снова восстановлен.

Опустошение слота

Предположим, если пароль или ключевой файл больше неизвестен, слот может быть освобождён. Конечно, для этого требуется заранее знать, в каком слоте находится ключевой файл или пароль.

К примеру, для опустошения 2 слота (который является третьим слотом, поскольку слоты нумеруются, начиная с 0):

root #cryptsetup luksKillSlot /dev/vdb2 2

Данная команда перед продолжением запросит действительный пароль. Или можно воспользоваться ключевым файлом:

root #cryptsetup luksKillSlot -d /etc/keys/enc.key /dev/vdb2 2

Автоматизация монтирования зашифрованных файловых систем

До сих пор статья была посвящена настройке и монтированию/демонтированию файловых систем вручную. Существует init-скрипт dmcrypt, который автоматизирует расшифровку и монтирование зашифрованных файловых систем.

Настройка dm-crypt

Отредактируйте файл /etc/conf.d/dmcrypt и добавьте туда записи для каждой файловой системы. Поддерживаемые записи хорошо описаны в файле, приведённом в примере ниже:

ФАЙЛ /etc/conf.d/dmcryptАвтоматическая разблокировка двух зашифрованных файловых систем
# Определение для /dev/mapper/home (для /home)
target=home
source=UUID="abcdef12-321a-a324-a88c-cac412befd98"
key=/etc/keys/home.key
 
# Определение для /dev/mapper/local (для /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).

Настройка fstab

Следующий шаг – настроить /etc/fstab для автоматического подключения (расшифрованных) файловых систем, когда они становятся доступными. Для начала, рекомендуется узнать UUID расшифрованной (монтированной) файловой системы:

root #blkid /dev/mapper/home
/dev/mapper/home: UUID="4321421a-4321-a6c9-de52-ba6421efab76" TYPE="ext4"

Затем, соответственно обновите файл /etc/fstab:

ФАЙЛ /etc/fstabАвтоматическое монтирование расшифрованных файловых систем
UUID="4321421a-4321-a6c9-de52-ba6421efab76"   /home        ext4   defaults   0   0
UUID="bdef2432-3bd1-4ab4-523d-badcf234a342"   /usr/local   ext4   defaults   0   0

Добавление init-скрипта в bootlevel

Не забудьте добавить init-скрипт dmcrypt для запуска во время загрузки:

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

Монтирование томов TrueCrypt/tcplay/VeraCrypt

root #cryptsetup --type tcrypt open контейнер-для-монтирования название-контейнера

Замените контейнер-для-монтирования на файл устройства из /dev или путь к файлу, который хотите открыть. После успешного открытия в /dev/mapper/название-контейнера появится незашифрованное устройство, которое можно монтировать как и любое нормальное устройство.

Если вы используете файлы ключей, укажите их с помощью параметра --key-file, для открытия скрытого тома используйте параметр --tcrypt-hidden, а для раздела или всего диска, зашифрованного в системном режиме, укажите параметр --tcrypt-system.

Когда закончите, размонтируйте том и закройте контейнер, используя следующую команду:

root #cryptsetup close название-контейнера

Смотрите также

Внешние ресурсы

  • The cryptsetup FAQ hosted on GitLab covers a wide range of frequently asked questions.