|
Bog BOS: Шифрование блочного устройства в Linux (dm-crypt, LUKS, cryptsetup) |
Последние изменения: |
Последнее изменение файла: 2010.07.22
Скопировано с www.bog.pp.ru: 2024.11.23
В статье описывются:
dm-crypt - шифрование блочного устройства с использованием device-mapper |
Модуль dm-crypt (CONFIG_DM_CRYPT) из набора device-mapper реализует метод crypt отображения виртуального блочного устройства (/dev/mapper/luks-УИД) на низлежащее блочное устройство (возможно тоже виртуальное) или файл (с помощью loopback) с прозрачным для пользователя шифрованием с использованием Linux 2.6 cryptoapi. Для шифрования задаются алгоритм и метод симметричного шифрования (AES), ключ, режим генерации начального вектора. При записи на созданное виртуальное устройство данные шифруются перед записью на низлежащее блочное устройство, при чтении с нового устройства зашифрованные ранее данные считываются с низлежащего блочного устройства и дешифруются. Формат служебной информации совпадает с форматом cryptoloop. Может работать поверх loop-устройства (шифрованная файловая система в файле). Файловая система на виртуальном устройстве создаётся обычным образом. Необходимо учесть, что при использовании журналирования шифрование будет производитьсяя дважды. Тип раздела низлежащего блочного устройства необходимо устанавливать в соответствии с конечными целями.
Параметры доступных алгоритмов и методов шифрования (cbc(aes)) и хеширования (sha224, sha256, sha1, md5) можно посмотреть в /proc/crypto:
Формат таблицы интервалов секторов (512 байт):
При выборе длины ключа необходимо учесть, что вам вряд ли удастся подобрать парольную фразу, содержащую хотя бы 128 бит энтропии (22 случайных символа).
Пример - зашифрованный физический том LVM:
# lsmod # используемые модули sha256_generic 17408 0 # SHA-224 and SHA-256 Secure Hash Algorithm cbc 12032 1 # CBC block cipher algorithm aes_x86_64 16256 2 # Rijndael (AES) Cipher Algorithm, asm optimized aes_generic 35496 1 aes_x86_64 # Rijndael (AES) Cipher Algorithm dm_crypt 21128 1 # device-mapper target for transparent encryption/decryption crypto_blkcipher 24068 3 cbc,dm_crypt # Generic block chaining cipher type # dmsetup -v ls # полный список устройств, управляемых device-mapper system10-swap (253, 2) # /dev/dm-2, /dev/mapper/system10-swap system10-root (253, 1) # /dev/dm-1, /dev/mapper/system10-root, /dev/root luks-УИД (253, 0) # /dev/dm-0, /dev/mapper/luks-УИД # dmsetup -v deps # иерархия отображений устройств (вывод порезан) Name: system10-swap 1 dependencies : (253, 0) Name: system10-root 1 dependencies : (253, 0) Name: luks-УИД 1 dependencies : (8, 2) # /dev/sda2 # dmsetup -v info # параметры и состояние Name: system10-swap State: ACTIVE Read Ahead: 256 Tables present: LIVE Open count: 1 Event number: 0 Major, minor: 253, 2 Number of targets: 1 UUID: LVM-УИД Name: system10-root State: ACTIVE Read Ahead: 256 Tables present: LIVE Open count: 1 Event number: 0 Major, minor: 253, 1 Number of targets: 1 UUID: LVM-УИД Name: luks-УИД State: ACTIVE Read Ahead: 256 Tables present: LIVE Open count: 2 Event number: 0 Major, minor: 253, 0 Number of targets: 1 # dmsetup -v table # таблицы отображений Name: system10-swap 0 20447232 linear 253:0 102367616 Name: system10-root 0 102367232 linear 253:0 384 Name: luks-УИД 0 487989408 crypt aes-cbc-essiv:sha256 00000000000000000000000000000000 0 8:2 1032
Для упрощения работы с dm-crypt авторы предлагают воспользоваться утилитой cryptsetup, которая позволяет создавать виртуальное устройство, запрашивая парольную фразу. Парольная фраза преобразуется в ключ, который не хранится на устройстве. Для смены парольной фразы необходимо перешифровать устройство (сохранить файлы, пересоздать устройство и файловую систему, восстановить файлы), предполагается (предполагалось) создание dmconvert (перешифрование на лету).
Файл /etc/crypttab содержит таблицу зашифрованных блочных устройств, которые необходимо отобразить при загрузке. Создаётся при установке и форматировании устройства. Каждая строка описывает одно устройство, комментарии начинаются с '#', поля разделяются пробелами:
TKS1 - общий шаблон разработки методики шифрования блочного устройства |
TKS1 (Template Key Setup 1) описывает общую схему (шаблон разработки), подходящую для шифрования носителей данных:
Двухуровневая схема позволяет:
LUKS (Linux Unified Key Setup, Clemens Fruhwirth, 1.1.1 на 8 декабря 2008) - реализация удовлетворяющей TKS1/TKS2 методики шифрования блочного устройства в Linux с использованием dm-crypt и модифицированной утилиты cryptsetup.
До разработки LUKS существовало 4 несовместимых методики шифрования блочных устройств в Linux: kerneli (cryptoloop), loop-AES, util-linux 2.12 (losetup), dm-crypt (cryptsetup). Теперь их осталось всего 5 ;).
С точки зрения конечного пользователя LUKS позволяет
LUKS стандартизовал метаданные зашифрованного блочного устройства (516kB?):
Реализация LUKS под MS Windows - FreeOTFE.
Усовершенствованная версия cryptsetup (пакет cryptsetup-luks, начиная с FC4) с поддержкой LUKS (переехал ?) была выполнена в рамках проектов Google. Усовершенстввованная утилита cryptsetup позволяет производить как базовые операции с устройствами dm-crypt, так и операции расширения LUKS. При вводе ключевого материала с терминала чтение заканчивается по концу строки ('\n'), прочитанная строка хешируется (--hash) и обрезается или дополняется нулями до размера ключа. При вводе ключевого материала с stdin чтение заканчивается по концу файла, прочитанный текст (кроме последнего конца строки) хешируется ('--hash plain' отключает хеширование) и обрезается или дополняется нулями. При вводе ключевого материала из файла он обрезается.
Базовые операции:
Операции расширения LUKS
Ключи cryptsetup:
Настройки HAL (hal-luks-setup, hal-luks-remove, hal-luks-teardown, /usr/share/hal/fdi/policy/10osvendor/15-storage-luks.fdi) позволяют при получении извещения о появившемся блочном устройстве от udev, проверить его на заголовок LUKS, известить заинтересованных через D-BUS, например, gnome-volume-manager, который запрашивает парольную фразу и выдаёт через D-BUS запрос HAL на привязку зашифрованного виртуального блочного устройства и монтирование тома (hal-luks-setup, luks_crypto_УИД), при этом к параметрам устройства привязывается функция закрытия hal-luks-remove. gnome-volume-manager пропал в Fedora 9, заменён на gnome-mount (gnome-vfs-daemon? gvfs-hal-volume-monitor?), который не только запрашивает парольную фразу, но и использует gnome-keyring для её безопасного хранения. gnome-device-manager показывает низлежащее блочное устройство как "Encrypted Data" в формате "Linux Unified Key Setup".
Начиная с Fedora 9 anaconda (/usr/lib/anaconda/cryptodev.py) позволяет зашифровать при установке файловую систему или физический том LVM (кроме загрузочного раздела /boot). В kickstart добавлены ключи --encrypted и --passphrase= команд autopart, part и raid. Также модифицированы mkinitrd (/sbin/mkinitrd) и initscripts (/etc/rc.d/rc.sysinit, /etc/rc.d/init.d/halt), средства восстановления (rescue). В результате при загрузке запрашивается парольная фраза, которая передаётся в cryptsetup.
Пример использования случайного числа на USB носителе в качестве ключа в качестве дополнительной парольной фразы:
dd if=/dev/random of=/mnt/usbstick/keyfile bs=1 count=256 cryptsetup luksAddKey /dev/sdXY /mnt/usbstick/keyfile ... cryptsetup --key-file /mnt/usbstick/keyfile luksOpen /dev/sdXY luks-UUID mount /dev/mapper/luks-UUID /secure
Пример использования зашифрованного случайного числа в качестве ключа:
gpg --decrypt ./root-key.gpg 2>/dev/null | cryptsetup luksOpen /dev/sdXY root
Пример преобразования физического тома LVM с использованием pvmove (описываю вкратце, требуется место под хранение копии, требуется немного больше места, чем ранее):
В принципе, можно конвертировать на месте, но не советую (при использовании LUKS замучаетесь сдвигать раздел, вычислять смещения и начальные вектора, luksConvert, при любой версии прерывание процесса доставит немалые неприятности - продолжать надо ровно с точки останова).
Смена парольной фразы:
Для защиты от криптоаналитиков (а не просто случайных любопытных) рекомендуется предварительно заполнить раздел с помощью /dev/urandom (/dev/random ещё лучше, но очень медленно; можно также использовать "shred -v [-n 1] /dev/sdaXY" или "wipe [-qQ 1] -i -M a -k /dev/sdXY). В крайнем случае, обнулить зашифрованный виртуальный раздел. Использования "badblocks -w -t random" недостаточно, хотя и полезно само по себе.
Использованная методика не защищает загрузочный раздел, что позволяет незаметно подменить загрузчик или kernel/initrd на "усовершенствованную" версию, записывающую ключевую фразу для дальнейшего её использования злоумышленником. Для борьбы с этим можно хранить загрузчик, раздел /boot и [зашифрованный] ключ на носимом с собой USB носителе (или здесь).
Устаревший (?) пакет luks-tools (последний раз замечен в FC6) содержит утилиты форматирования LUKS-устройств luks-format и gnome-luks-format и отображения виртуального устройства luks-setup.
|
Bog BOS: Шифрование блочного устройства в Linux (dm-crypt, LUKS, cryptsetup) |
Последние изменения: |