Шифрование диска в Linux средствами loop-AES 2
Администрирование
Статья была опубликована 1 февраля 2010 года в 00:00, а последний раз правилась 10 февраля 2020 года в 03:31.
Постоянная ссылка: http://www.nixp.ru/articles/2.html
В нашем современном мире защита информации играет немалую роль. Особенно, если дело касается важных или секретных данных. Данная статья познакомит вас с одним из способов их защиты.
Примечание: Статья была впервые опубликована в электронном издании «Open Source» (выпуск №028 от 10.07.2008). Ее размещение на nixp.ru производится в соответствии с разрешением со стороны редакции и автора материала.
Предисловие
В нашем современном мире защита информации играет немалую роль. Особенно, если дело касается важных или секретных данных. Данная статья познакомит вас с одним из способов их защиты. Все мы люди, и ни для кого не секрет, что иногда попадаем в самые разнообразные ситуации. Например, человек в аэропорте оставляет ноутбук на пару минут для того, чтобы выпить чашечку кофе. По возвращении он констатирует факт кражи этого устройства. Конечно, если на нём кроме семейного альбома ничего другого не было, то цена стоимостью ноутбука будет являться платой за невнимательность и нерасторопность. Однако зачастую не такие люди оставляют подобную технику без присмотра, а те, у кого с ней плотно связана работа или собственное дело. Поэтому «подаренный» бизнес-план может обернуться скорее убытками нежели прибылью, если, конечно, мошенники не собираются сдать этот «подарок судьбы» на металлолом. Под впечатлением от подобного сообщения потерпевшего (пользователя OpenBSD) в одном из списков рассылки и была написана эта статья.
Средства и принцип работы
В статье рассматривается ядро операционной системы GNU/Linux (преимущественно, 2.6), для которого в своё время был разработан модуль, позволяющий «на лету» шифровать данные, записываемые на жёсткий диск. Основа работы такого алгоритма уходит далеко к корням создания псевдоустройства «loop device» («loopback device», vnd (vnode disk) или lofi (loopback file interface)) в UNIX-подобных операционных системах. Оно находится выше уровня диска и раздел на нём и представляет собой виртуальное устройство — некую прослойку между файловой системой и самим физическим носителем. Таким образом, все данные, которые записываются на физический диск, проходят через это устройство. Подобный подход используется при создании решений RAID. Большинству же это устройство знакомо по монтированию ISO-образов (mount -o loop -t iso9660 /path/to/image.iso /path/to/folder).
Итак, loop-AES — это модифицированная версия модуля loop для Linux-ядра. На стадии передачи данных от псевдоустройства к реальному этот модуль позволяет их шифровать с минимальной долей потери производительности при чтении/записи. После размонтирования устройства, естественно, файловая система на носителе остаётся зашифрованной и недоступной для обычного монтирования диска. Как видно из названия, используется один из лучших алгоритмов шифрования в настоящее время — AES (Rijndael). Также доступны модули с использованием алгоритмов Blowfish, Serpent, Twofish. Длина ключа варьируется от 128 до 256 бит.
Необходимый инструментарий
- В первую очередь понадобится рабочее ядро Linux (2.0—2.6) с отключенным модулем loop (CONFIG_BLK_DEV_LOOP=n). Он будет заменён на модуль с тем же самым названием, но с расширенным функционалом loop-AES.
- Небезызвестный GnuPG (см. его обзор в статье «Защищаем себя средствами GnuPG»), а также sharutils — для генерирования ключей, которыми будут защищены псевдоустройства.
- Сам loop-AES.
- util-linux или util-linux-ng.
Если планируется шифровать также и основной (корневой) раздел на жёстком диске, то нужно будет установить ещё программу <a>aespipe</a> и dietlibc для создания и использования образа initrd (init RAM disk) и достать образ LiveCD-дистрибутива, в котором бы была поддержка нужных файловых систем, используемых в текущей рабочей системе.
Приступая к работе
Основное условие, которое следует выполнить перед началом работы, — это сделать резервные копии всех важных данных (особенно, если в дальнейшем будет зашифрован основной раздел).
Пересборка ядра необходима, потому что нужно убрать стандартную поддержку loop-устройства (если она включена в виде модуля или встроена в ядро) и обеспечить соответствие текущего ядра ветке исходников (обычно это /usr/src/linux). Итак, для этого нужно поставить в конфигурационном файле ядра константу CONFIG_BLK_DEV_LOOP равную n и пересобрать его.
Затем следует этап пересборки пакетов util-linux (until-linux-ng) с предварительно применённым патчем loop-AES, который можно найти в самом дистрибутиве loop-AES, либо по ссылкам (на момент написания статьи): util-linux-2.12r-20080303.diff.bz2 и util-linux-ng-2.13.1-20080303.diff.bz2 для util-linux 2.12r и util-linux-ng 2.13.1 соответственно. Программы, которые будут изменены — это swapon/swapoff (для возможности шифрования файлов подкачки), losetup (для создания шифрованных псевдоустройств) и mount (для поддержки монтирования зашифрованных loop-устройств).
Пересобрать GnuPG и aespipe статически (с флагом GCC -s) нужно для того, чтобы в дальнейшем они не зависели от библиотек, находящихся на основном разделе диска, что позволит его зашифровать без надобности доступа к разделу.
Компиляция самого loop-AES тоже очень проста, и, если вы хотите использовать не только алгоритм шифрования AES (Rijndael), но и Blowfish, Serpent и Twofish — то команде make нужно передать в качестве параметра EXTRA_CIPHERS=y. Стоит отметить, что дополнительные модули алгоритмов шифрования включены в дистрибутив loop-AES, начиная с версии 3.2a.
Шифрование файла подкачки
Сразу приступим к делу: на начальных этапах загрузки ОС нужно подключить модуль loop.ko (loop.o в более ранних версиях ядра Linux: 2.0—2.4) с помощью команды modprobe loop или прописав loop в файле /etc/modules (зависит от дистрибутива Linux), чтобы до монтирования файловых систем модуль был готов к работе.
После подключения модуля по умолчанию создаётся 8 loop-псевдоустройств (/dev/loop0 .. /dev/loop7). Любое из них по желанию можно использовать в качестве точки монтирования для раздела/файла подкачки и записать его в /etc/fstab:
/dev/sda2 none swap sw,loop=/dev/loop6,encryption=AES128 0 0
Здесь /dev/sda2 — раздел подкачки (swap), /dev/loop6 — псевдоустройство, которое используется для монтирования, AES128 — алгоритм шифрования.
После создания такой записи в /etc/fstab выполнение команды: swapoff -a && swapon -a — приведет к созданию и шифрованию раздела/файла подкачки. Проверить, так ли это, можно командой losetup -a, она должна вывести примерно следующее:
/dev/loop/6: [000d]:3804 (/dev/sda2) offset=4096 encryption=AES128 multi-key-v3
Шифрование пользовательского раздела
Основные «личные» данные всё же хранятся в домашнем каталоге пользователя, который, в свою очередь, часто бывает расположен на отдельном разделе жёсткого диска (чаще всего /home). Далее будет показано, как можно зашифровать раздел /home, хотя этот алгоритм подойдёт и для любого другого (за исключением основного, т.е. /).
Сначала нужно перенести все данные на другой раздел/носитель/компьютер, т.к. структура раздела будет уничтожена. Затем генерируется ключ, с помощью которого будет осуществляться доступ к разделу. Здесь используется симметричный ключ (флаг --symmetric), а в противном случае — понадобится приватный ключ для расшифровки раздела:
# head -c 3705 /dev/random | uuencode -m — | head -n 66 | tail -n 65 | gpg --symmetric -a > /path/to/keyfile.gpg
После этой команды необходимо дважды ввести секретную фразу для доступа. (Чтобы сократить время генерирования ключа, нужно увеличить процессорное время: максимально использовать нагрузку на него (например, при помощи компиляции чего-то массивного), «побродить» по Интернету, передвигать курсор мыши и т.д.
Теперь этот ключ можно использовать для создания псевдоустройства:
# echo -n "$PASSPHRASE" | losetup -p 0 -e AES128 -K /path/to/keyfile.gpg /dev/loop7 /dev/sda3
$PASSPHRASE — секретная фраза, которую вы вводили для генерирования ключа, AES128 — алгоритм шифрования раздела, /path/to/keyfile.gpg — путь к сгенерированному ключу, /dev/loop7 — псевдоустройство loop, /dev/sda3 — дескриптор раздела.
Далее заполняем физическое устройство «случайными» данными через псевдоустройство loop:
# dd if=/dev/zero of=/dev/loop7 bs=4k conv=notrunc > /dev/null 2>&1
И удаляем ассоциируемое с разделом loop-устройство:
# losetup -d /dev/loop7
В завершении необходимо отредактировать запись в /etc/fstab:
/dev/sda3 /home ext3 defaults,noauto,loop=/dev/loop7,encryption=AES128,gpgkey=/path/to/keyfile.gpg 0 0
Теперь всё готово к созданию файловой системы на уровне loop. Для этого нужно воспользоваться командой:
# losetup -F /dev/loop7
(Она потребует ввода секретной фразы.)
Остаётся лишь создать файловую систему на псевдоустройстве:
# mkfs -t ext3 /dev/loop7
Перед проверкой опять удаляем ассоциируемое с разделом loop-устройство:
# losetup -d /dev/loop7
После этого можно монтировать зашифрованный раздел командой:
# mount /home
Для автоматического монтирования раздела (удобно, если зашифрован основной — тогда не нужно вводить ключевую фразу перед каждым монтированием нового раздела) можно перенести информацию о шифровании из файла /etc/fstab в скрипт, который бы на этапе загрузки автоматически создавал эти loop-псевдоустройства:
echo -n "$PASSPHRASE" | losetup -p 0 -e AES128 -K /path/to/keyfile.gpg /dev/loop7 /dev/sda3
Права у такого скрипта должны быть выставлены на исполнение и чтение только для суперпользователя, чтобы обычные пользователи не смогли примонтировать раздел, зная ключевую фразу:
# chmod 700 /path/to/script.sh # chown root:root /path/to/script.sh
Для проверки зашифрованных разделов нужно использовать команду fsck применительно к loop-устройствам (в это время раздел, проверка которого производится в данный момент, должен быть размонтирован):
# umount /home # losetup -F /dev/loop7 # fsck -t ext3 -f -y /dev/loop7 # losetup -d /dev/loop7
Альтернативы и оценка производительности
loop-AES — не единственный способ зашифровать жёсткий диск. Наряду с ним существует и другая реализация подобной технологии: dm-crypt. Она также представляет собой модуль к ядру Linux. Управление осуществляется несколькими программами, входящими в пакет LUKS. LUKS предоставляют целую систему для управления зашифрованными разделами. Однако, судя по проведённым тестам, dm-crypt хоть и не намного, но уступает loop-AES в производительности: http://dev.riseup.net/grimoire/storage/encryption/benchmarks/dmcrypt-v-loopaes/. Как видно из графиков, loop-AES немного быстрее dm-crypt, если дело касается файловых операций (чтения/записи) — в том числе, при использовании RAID-массивов.
Также экспертиза показала, что с использованием оптимизаций для x86 алгоритм AES является лидером в скорости даже с длиной ключа в 256 бит.
-
Популярные в этом разделе:
- «Настройка сервера SSH (теория и практика)»,
- «Реализация отправки и приёма SMS с помощью Gnokii»,
- «Настройка сервера OpenLDAP».
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
Кстати, этим же способом вместо шифрования раздела целиком можно создавать криптоконтейнеры (грубо говоря, зашифрованные файлы, которые монтируются в системе как съемные носители). Надо поработать с конфиденциальной информацией — подключил контейнер. Завершил работу с информацией — отключил контейнер.
P.S. Зачем шифровать swap?
как то на рабочем прокси сервере я сделал strings /dev/swap, забавная инфа полилась :-)
OpenBSD
Кстати, так уж совпало, что автор статьи тоже предпочитает OpenBSD :-)
Видимо, в этом что-то есть :-)
Ребят, я о вот этом:
«Права у такого скрипта должны быть выставлены на исполнение и чтение только для суперпользователя, чтобы обычные пользователи не смогли примонтировать раздел, зная ключевую фразу:»
А если винт подключить к другой ОС, то там при загрузке системы скрипт выполнится и вся работа была напрасной!
Как быть? Существует такая проблема — как сделать винт не монтируемым к другим системам.
Если что, ссылки или ответы жду на gafarov_@inbox.ru
Спасибо
Очевидно, не писать скрипт с ключевой фразой?
Печальная новость, господа в связи с AES128: http://eprint.iacr.org/2010/594