шифрование разделов с помощью dm-crypt и ядра серии 2.6
В феврале 2004 года Эндрю Мортеном (Andrew Morten) было объявлено о постепенном переходе от cryptoloop к более перспективному пакету - dm-crypt (http://www.saout.de/misc/dm-crypt/).Несмотря на то, что данное заявление вызвало определенное недоумение, dm-crypt был включен в стабильную ветвь ядра 2.6.4. Данная статья содержит описание процесса создания зашифрованных разделов средствами dm-crypt.
Dm-crypt предоставляет возможности шифрования для Device-mapper, который позволяет создавать новые разделы или логические диски, указывая область секторов на существующих устройствах. Данная область секторов определяется с помощью соответствующей таблицы. Dm-crypt может быть использован для прозрачного шифрования устройства с применением нового cryptoAPI ядра 2.6.
Изначально в cryptoloop для шифрования применялось устройство loopback. Dm-crypt является более изящной реализацией и предлагает значительно большую гибкость в работе. По мнению Фрувиса Клеменса (Fruwirth Clemens), поддерживающего cryptoloop, dm-crypt предпочтительнее по целому ряду причин, среди которых он называет следующие:
- dm-crypt не страшны ошибки loop.c (которых довольно много – сказывается отсутствие должной поддержки);
- dm-crypt не зависит от инструментов пространства пользователя (util-linux);
- dm-crypt использует mempool, что означает завидный уровень стабильности по сравнению с cryptoloop.
Несмотря на использование сильных криптоалгоритмов, cryptoloop представляется довольно нестойким решением, уязвимым к определенным типам атак. Слабые стороны cryptoloop подробно обсуждались на LVN.net (http://lwn.net/Articles/67216/).
Dm-crypt также использует сильные криптоалгоритмы, отличаясь улучшенным уровнем их реализации.
установка dm-crypt
Перед шифрованием любых важных данных с помощью dm-crypt, убедитесь, что у вас есть их актуальные резервные копии.
Непосредственно установка начинается с загрузки требуемых файлов. Вам потребуется свежее ядро. Подойдут версии 2.6.4 и более новые. Я рекомендую использовать хотя бы 2.6.5, поскольку на некоторых системах с ядром 2.6.4 наблюдались определенные проблемы при работе с dm-crypt. Кроме ядра загрузите Device-mapper сhttp://sources.redhat.com/dm/,а также, по желанию, hashalot (http://www.paranoiacs.org/~sluskyb/hacks/hashalot/)и скрипт установки cryptsetup.sh (http://www.saout.de/misc/dm-crypt/cryptsetup.sh).
Сконфигурируйте свое ядро, добавив к нему поддержку Device-mapper и dm-crypt, которые можно найти в Multi-device support (RAID and LVM) под обозначениями Device Mapper Support и Crypt Target Support. Вам также потребуется включить желаемый шифр в разделе Cryptographic Options.
Если вы сконфигурировали Device-mapper в качестве модуля, то, как только вы установите и загрузите новое ядро, вам потребуется активировать его с помощью modprobe dm-mod. Модуль dm-crypt при необходимости будет загружаться ядром. Добавьте команды modprobe в стартовый скрипт для всех нужных вам криптомодулей.
Device-mapper использует каталог /dev/mapper и устройство /dev/mapper/control. Для их создания запустите скрипт scripts/devmap_mknod.sh из комплекта Device-mapper. В случае успеха скрипт выдает номера (major и minor) нового узла, или же, в случае неудачи, просто завершает свою работу.
Теперь скомпилируйте и установите пакет Device-mapper. Распакуйте файлы и выполните обычную процедуру ./configure, make, make install. Это установит необходимые библиотеки и утилиту dmsetup в /sbin. Для создания и удаления устройств, получения информации о них и перезагрузки таблиц мы использовали dmsetup.
В результате выполнения комманды
Если это выглядит несколько непонятно, не волнуйтесь. Скрипт cryptsetup.sh делает процесс куда менее хлопотным. Для создания ключа скрипт использует hexdump и hashalot. Вы также можете обойтись без hashalot и воспользоваться опцией –h plain.
Разместите скрипт cryptsetup.sh в $PATH и не забудьте сделать его исполняемым. Если вы планируете использовать hashalot, установите его (./configure, make, make install).
Для шифрования устройства Cryptsetup.sh вызывает dmsetup с указанными вами опциями. Приведенный ниже пример настроит /dev/hdb2 для использования /dev/mapper/cryptvol1.
Первым делом отмонтируйте устройство и убедитесь в том, что файловая система не имеет ошибок, для чего запустите fsck:
Теперь все готово для копирования данных на новое устройство:
В случае необходимости вы сможете произвести обратное конвертирование от зашифрованного к незашифрованному состоянию, скопировав ваши данные на обычное устройство. Если вам потребуется изменить какую-либо опцию, например, зашифровать данные еще раз или поменять идентификационную фразу, вы можете перемещать данные между соответствующими устройствами. В настоящее время ведется работа над утилитой, которая позволит производить это «на лету».
Устройства, которые больше не нужны, могут быть удалены с помощью команды
Dm-crypt предоставляет возможности шифрования для Device-mapper, который позволяет создавать новые разделы или логические диски, указывая область секторов на существующих устройствах. Данная область секторов определяется с помощью соответствующей таблицы. Dm-crypt может быть использован для прозрачного шифрования устройства с применением нового cryptoAPI ядра 2.6.
Изначально в cryptoloop для шифрования применялось устройство loopback. Dm-crypt является более изящной реализацией и предлагает значительно большую гибкость в работе. По мнению Фрувиса Клеменса (Fruwirth Clemens), поддерживающего cryptoloop, dm-crypt предпочтительнее по целому ряду причин, среди которых он называет следующие:
- dm-crypt не страшны ошибки loop.c (которых довольно много – сказывается отсутствие должной поддержки);
- dm-crypt не зависит от инструментов пространства пользователя (util-linux);
- dm-crypt использует mempool, что означает завидный уровень стабильности по сравнению с cryptoloop.
Несмотря на использование сильных криптоалгоритмов, cryptoloop представляется довольно нестойким решением, уязвимым к определенным типам атак. Слабые стороны cryptoloop подробно обсуждались на LVN.net (http://lwn.net/Articles/67216/).
Dm-crypt также использует сильные криптоалгоритмы, отличаясь улучшенным уровнем их реализации.
установка dm-crypt
Перед шифрованием любых важных данных с помощью dm-crypt, убедитесь, что у вас есть их актуальные резервные копии.
Непосредственно установка начинается с загрузки требуемых файлов. Вам потребуется свежее ядро. Подойдут версии 2.6.4 и более новые. Я рекомендую использовать хотя бы 2.6.5, поскольку на некоторых системах с ядром 2.6.4 наблюдались определенные проблемы при работе с dm-crypt. Кроме ядра загрузите Device-mapper сhttp://sources.redhat.com/dm/,а также, по желанию, hashalot (http://www.paranoiacs.org/~sluskyb/hacks/hashalot/)и скрипт установки cryptsetup.sh (http://www.saout.de/misc/dm-crypt/cryptsetup.sh).
Сконфигурируйте свое ядро, добавив к нему поддержку Device-mapper и dm-crypt, которые можно найти в Multi-device support (RAID and LVM) под обозначениями Device Mapper Support и Crypt Target Support. Вам также потребуется включить желаемый шифр в разделе Cryptographic Options.
Если вы сконфигурировали Device-mapper в качестве модуля, то, как только вы установите и загрузите новое ядро, вам потребуется активировать его с помощью modprobe dm-mod. Модуль dm-crypt при необходимости будет загружаться ядром. Добавьте команды modprobe в стартовый скрипт для всех нужных вам криптомодулей.
Device-mapper использует каталог /dev/mapper и устройство /dev/mapper/control. Для их создания запустите скрипт scripts/devmap_mknod.sh из комплекта Device-mapper. В случае успеха скрипт выдает номера (major и minor) нового узла, или же, в случае неудачи, просто завершает свою работу.
Теперь скомпилируйте и установите пакет Device-mapper. Распакуйте файлы и выполните обычную процедуру ./configure, make, make install. Это установит необходимые библиотеки и утилиту dmsetup в /sbin. Для создания и удаления устройств, получения информации о них и перезагрузки таблиц мы использовали dmsetup.
В результате выполнения комманды
dmsetup create <name>создается устройство <name> в /dev/mapper/control. Затем dmsetup должен получить таблицу от stdin. Как вариант, вы можете предложить ему третьим параметром команды файл, содержащий требуемые данные. Таблица приобретает такой вид:
<start sector> <sector count> <target type> <arguments>
Таблица dm-crypt получает вид:
0 <sector count> crypt <sector format> <key> <IV offset> <real device> <sector offset>Параметры <sector format> и <key> - это используемый шифр (например, AES) и ключ (в виде шестнадцатеричного числа), используемые для шифрования устройства. Вы можете просмотреть доступные шифры в checking /proc/crypto или загрузив соответствующий модуль с помощью modprobe. Значение <IV offset> обычно равно 0, за исключением особых случаев. <real device> - это предназначенное для шифрования устройство, которое также может быть обозначено как /dev/xxxx или номером в виде major:minor, <sector offset> - это указание начала зашифрованных данных на реальном устройстве.
Если это выглядит несколько непонятно, не волнуйтесь. Скрипт cryptsetup.sh делает процесс куда менее хлопотным. Для создания ключа скрипт использует hexdump и hashalot. Вы также можете обойтись без hashalot и воспользоваться опцией –h plain.
Разместите скрипт cryptsetup.sh в $PATH и не забудьте сделать его исполняемым. Если вы планируете использовать hashalot, установите его (./configure, make, make install).
Для шифрования устройства Cryptsetup.sh вызывает dmsetup с указанными вами опциями. Приведенный ниже пример настроит /dev/hdb2 для использования /dev/mapper/cryptvol1.
Первым делом отмонтируйте устройство и убедитесь в том, что файловая система не имеет ошибок, для чего запустите fsck:
umount /dev/hdb2Теперь создайте устройство dm-crypt:
fsck /dev/hdb2
cryptsetup.sh -c aes -h ripemd160 -y -b `blockdev --getsizeВам потребуется задать идентификационную фразу, которую вы затем будете использовать. В результате данных операций вы получите из /dev/hdb2 зашифрованное устройство /dev/mapper/cryptvol1, при этом будет использован алгоритм шифрования AES и hashalot, который сгенерирует ключ на основе вашей идентификационной фразы. Если вы не используете hashalot, используйте здесь опцию –h plain. Полный список опций cryptsetup можно просмотреть, выполнив cryptsetup.sh -- help.
/dev/hdb2` create cryptvol1 /dev/hdb2
Теперь все готово для копирования данных на новое устройство:
dd if=/dev/hdb2 of=/dev/mapper/cryptvol1 bs=4kПеред выполнением этой команды внимательно проверьте ее правильность, поскольку она перепишет на указанном устройстве все данные. Когда команда будет выполнена, проверьте новое устройство на ошибки с помощью fsck. Если все пройдет гладко, вы можете примонтировать новое устройство
mount /dev/mapper/cryptvol1 /data(подразумевается, что обычно вы монтируете раздел /dev/hdb2 в /data).
В случае необходимости вы сможете произвести обратное конвертирование от зашифрованного к незашифрованному состоянию, скопировав ваши данные на обычное устройство. Если вам потребуется изменить какую-либо опцию, например, зашифровать данные еще раз или поменять идентификационную фразу, вы можете перемещать данные между соответствующими устройствами. В настоящее время ведется работа над утилитой, которая позволит производить это «на лету».
Устройства, которые больше не нужны, могут быть удалены с помощью команды
dmsetup remove <name>Поскольку cryptsetup мэппирует ваше устройство, для перемонтирования вашей файловой системы после перезагрузки вам понадобится только вызвать cryptsetup.sh еще раз, внеся ту же идентифицирующую фразу. Если вы, например, поместите нижеследующее в стартовый скрипт, у вас в ходе загрузки будет затребован пароль и ваше устройство будет создано заново.
if [ -b /dev/mapper/cryptvol1 ] ; thenрезюме
/usr/local/sbin/cryptsetup.sh remove cryptvol1
fi
/usr/local/sbin/cryptsetup.sh -c aes -h ripemd160 -b `blockdev --getsize /dev/hdb2` create cryptvol1 /dev/hdb2
/sbin/mount /dev/mapper/cryptvol1 /data
Dm-crypt – это решение, которое действительно внушает доверие. Он предлагает большую гибкость в работе по сравнению с cryptoloop за счет использования Device-mapper. Уже сегодня dm-crypt обладает функциональными возможностями, сравнимыми с характеристиками cryptoloop, и его функциональность со временем будет расширяться. Несмотря на то, что полное исключение cryptoloop в ближайшем будущем из ядра представляется маловероятным, вам определенно следует обратить внимание на dm-crypt в том случае, если вы планируете использовать зашифрованную файловую систему.
Mike Peters, перевод Алексея Кутовенко.
Сетевые решения. Статья была опубликована в номере 10 за 2004 год в рубрике software