@ Карта сайта News Автора!

Bog BOS: Шифрование блочного устройства в Linux (dm-crypt, LUKS, cryptsetup)

Последние изменения:
2017.05.19: sysadmin: Файловая система zfs под Linux для архива

Последнее изменение файла: 2010.07.22
Скопировано с www.bog.pp.ru: 2017.06.26

Bog BOS: Шифрование блочного устройства в Linux (dm-crypt, LUKS, cryptsetup)

В статье описывются:

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

Утилита cryptsetup

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

Файл /etc/crypttab содержит таблицу зашифрованных блочных устройств, которые необходимо отобразить при загрузке. Создаётся при установке и форматировании устройства. Каждая строка описывает одно устройство, комментарии начинаются с '#', поля разделяются пробелами:

TKS1 - общий шаблон разработки методики шифрования блочного устройства

TKS1 (Template Key Setup 1) описывает общую схему (шаблон разработки), подходящую для шифрования носителей данных:

Двухуровневая схема позволяет:

LUKS - реализация TKS2

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 с поддержкой LUKS

Усовершенствованная версия 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.

Ссылки

@ Карта сайта News Автора!

Bog BOS: Шифрование блочного устройства в Linux (dm-crypt, LUKS, cryptsetup)

Последние изменения:
2017.05.19: sysadmin: Файловая система zfs под Linux для архива

TopList

Copyright © 1996-2017 Sergey E. Bogomolov; www.bog.pp.ru (КГБ знает все, даже то что у Вас на диске ;)