This is Gentoo's testing wiki. It is a non-operational environment and its textual content is outdated.
Please visit our production wiki at https://wiki.gentoo.org
Dm-crypt
dm-crypt – это система шифрования дисков с использованием платформы ядра crypto API и подсистемы определения устройств. С помощью dm-crypt администраторы могут зашифровать весь диск, логические тома, разделы, а также отдельные файлы.
Подсистема dm-crypt поддерживает структуру Linux Unified Key Setup (LUKS), которая позволяет с помощью различных ключей получать доступ к зашифрованным данным, а также управлять ключами (например, изменять ключи, добавлять дополнительные пароли, и др.) Хотя dm-crypt поддерживает установку без LUKS, данная статья будет в основном посвящена функционалу LUKS, в силу её гибкости, управляемости, а также широкой поддержки в обществе.
Конфигурация
Существует два условия, необходимых для использования dm-crypt:
- Настройка ядра Linux
- Установка пакета sys-fs/cryptsetup
Конфигурация ядра
Для использования dm-crypt необходимо настроить несколько параметров конфигурации.
Прежде всего, должна быть включена поддержка инфраструктуры device mapper и crypt target:
[*] Enable loadable module support Device Drivers ---> [*] Multiple devices driver support (RAID and LVM) ---> <*> Device mapper support <*> Crypt target support
Далее, ядро Linux должно поддерживать набор криптографических функций, которые администратор хочет использовать для шифрования. Они могут быть найдены в разделе 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
Если также будет зашифрована корневая файловая система, необходимо создать initramfs, в которой корневая файловая система будет расшифрована перед монтированием. Таким образом, требуется поддержка initramfs:
General setup ---> [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
Установка Cryptsetup
Пакет sys-fs/cryptsetup предоставляет команду cryptsetup, которая используется для открытия или закрытия зашифрованного хранилища, а также для управления паролями и связанными с ними ключами.
root #
emerge --ask sys-fs/cryptsetup
Зашифрованное хранилище
Ключевой файл или пароль
Чтобы начать работу с зашифрованным хранилищем, администратор должен решить, какой метод использовать для создания ключа шифрования. Если используется cryptsetup, можно выбрать пароль или ключевой файл. Ключевой файл может быть любым файлом, но рекомендуется использовать надлежащим образом защищённый (ввиду того, что доступ к ключевому файлу подразумевает доступ к зашифрованным данным) файл с случайными данными.
Для создания ключевого файла, можно использовать команду dd:
root #
dd if=/dev/urandom of=/etc/keys/enc.key bs=1 count=4096
В следующих разделах мы будем указывать каждую команду для обоих случаев: пароля и ключевого файла. Конечно, необходим только один метод.
Создание платформы зашифрованного хранилища
Чтобы создать платформу защищённого хранилища (которое может быть диском, разделом, файлом, ...) вызовите команду cryptsetup с параметром luksFormat
.
К примеру, что использовать /dev/vdb2 как носитель зашифрованных данных:
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: ...
Для использования ключевого файла вместо пароля:
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
Параметр -s 512
сообщает cryptsetup, какую длину ключа использовать для настоящего ключа шифрования (который, в отличие от пароля или ключевого файла, используется непосредственно для доступа к данным).
Открытие зашифрованного хранилища
Чтобы открыть зашифрованное хранилище (т.е. сделать реальные данные доступными благодаря незаметной расшифровке), используйте параметр 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
Настройка 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
Дополнительные ресурсы
- Dm-crypt full disk encryption на Gentoo Wiki предоставляет дополнительную информацию по использованию зашифрованных файловых систем в Gentoo Linux
- cryptsetup FAQ, размещённый на GitLab, освещает широкий диапазон часто задаваемых вопросов.