Создание шифрованного тома в Linux или cryptsetup - crypto
Создание шифрованного тома в Linux или cryptsetup
Материал из Belgorod Linux User Group - Белгород.
Создание шифрованного тома в Linux Зачастую для хранения важных данных требуется их шифрование. В Linux есть встроенные средства шифрования. Это cryptoloop и dm-crypt. Первое – довольно старое решение, превалировало в версиях ядра 2.4, второе – более предпочтительное, присутствует как правило в ядрах версии 2.6. Их мы и будем рассматривать. То есть настоятельно рекомендую использовать систему с ядром ветки 2.6. Во времена ветки 2.4 (особенно старых версий) на территории США действовали патенты на крипто-алгоритмы, по этому в большинстве ядер они небыли включены и добавить их можно только специальными патчами к ядру.
Итак, приступим к созданию шифрованных томов. Предположительно что жесткий диск вы уже подготовили. Рекомендуется статья Создание программного RAID в Linux, а так же документации или статьи по
LVM2 если шифрованный том будем хранить
целиком на разделе LVM-партиции. Комплекс этих мер (RAID+dm-crypt) позволяет создать современную надежную систему хранения важных данных в зашифрованном виде, придавая в то же время уникальную гибкость этой системе и обеспечивая невероятное удобство в работе с ней администратору.
Шифрованные данные принято как правило хранить либо в файле (через loopback устройство) либо делать зашифрованный раздел целиком. Преимущества хранения в файле – легкое перемещение. Рекомендуется для хранения малого количества файлов (конфигурационные файлы, особо важные документы и т.п.). Недостатки – слабая масштабируемость, замедление работы из-за «файловой системы внутри файла на файловой системе». Преимущества хранения на разделе целиком – гибкость (особенно с LVM), удобная интеграция. Плюс вкупе с LVM – вы получаете все прелести «резиновых», зеркальных, переносимых и других LVM-томов, только уже в зашифрованном виде.
Итак, способ хранения выбрали. Это либо хранения шифрованной файловой системы внутри отдельного файла, либо шифрование тома целиком (я лично рекомендую последний способ вкупе с LVM).
Способ: Хранение шифрованных данных в файле
Что необходимо проделать, для хранения шифрованных данных в одном файле
Шаг 1. Создаем файл
Создаем сам файл, на котором будет храниться шифрованная файловая система
touch /var/db/file
Шаг 2. Забиваем файл случайными данными
Заполняем его случайными данными, чтобы сложнее было дешифровать
shred -n1 -s500M /var/db/file
в данном случаи мы указали размер в 500Мб.
Шаг 3. Подгружаем модули
Подгружаем нужные модули:
modprobe dm-crypt modprobe aes
(aes - быстрый алгоритм шифрования, можно использовать blowfish, des и пр. - см. раздел Cryptographic options ядра)
Шаг 4. Создаем loopback устройство
Создаем loopback устройство из файла:
losetup /dev/loop0 /var/db/file
наше устройство теперь называется /dev/loop0, а находится оно в файле /var/db/file
Шаг 5. Создаем шифрованный том
Создаем шифрованный том из устройства /dev/loop0
cryptsetup -c aes -y create mycrypt /dev/loop0
шифрованный том в этом примере будет называться mycrypt
Шаг 6. Форматируем файловую систему
Форматируем его:
mkreiserfs /dev/mapper/mycrypt
Все. После этих операций в устройстве /dev/mapper/mycrypt находится файловая система с шифрованными данными. Ее уже можно монтировать / писать на нее / размонтировать.
Шаг 7. Монтируем
Монтирование:
losetup /dev/loop0 /var/db/file cryptsetup create mycrypt /dev/loop0 mount /dev/mapper/mycrypt /home/mnt
Шаг 8. Размонтируем
Размонтирование:
umount /dev/mapper/mycrypt /home/mnt cryptsetup remove mycrypt losetup -d /dev/loop0
Способ: Хранение шифрованных данных на отдельной партиции LVM
Что необходимо проделать для хранения данных на шифрованной партиции LVM:
Шаг 1. Создаем партицию
Создаем партицию
lvcreate -L2G -nstorage vg
в данном случаи мы задали размер 2Гб для тома с именем storage в группе vg. Подробнее в документации по LVM2.
Шаг 2. Подгружаем модули
Подгружаем нужные модули:
modprobe dm-crypt modprobe aes
(aes - быстрый алгоритм шифрования, можно использовать blowfish, des и пр. - см. раздел Cryptographic options ядра)
Шаг 3. Создаем шифрованный том
Создаем шифрованный том из устройства /dev/vg/storage
cryptsetup -c aes -y create mycrypt /dev/vg/storage
шифрованный том в этом примере будет называться mycrypt
Шаг 4. Форматируем файловую систему
Форматируем его:
mkreiserfs /dev/mapper/mycrypt
Все. После этих операций в устройстве /dev/mapper/mycrypt находится файловая система с шифрованными данными. Ее уже можно монтировать / писать на нее / размонтировать.
Шаг 5. Монтируем
Монтирование:
cryptsetup create mycrypt /dev/vg/storage mount /dev/mapper/mycrypt /mnt/storage
Шаг 6. Размонтируем
Размонтирование:
umount /dev/mapper/mycrypt /mnt/storage cryptsetup remove mycrypt
Использование LUKS
О LUKS
Шифрование с помощью LUKS отличается от обычного тем, что требует не сам ключ на шифр, а ключ на ключ шифрования, который хранится уже на шифрованном устройстве в зашифрованном виде. То есть данные шифруются ключем, который потом хранится вместе с данными, но зашифрован вашим ключем. И для расшифровки данных достаточно расшифровать ключ шифрования. :)
Таким образом при смене пароля - меняется только ваш ключ, а тот ключ с которым был зашифрован раздел - остается неизменным. Следовательно для смены пароля не нужно перешифровывать весь том.
LUKS использует улучшенную версию программы cryptsetup, и обладает рядом преимуществ по сравнению с ней.
Преимущества LUKS:
- возможность смены пароля без перешифрования раздела;
- возможность иметь несколько паролей;
- работа с зашифрованными дисками в Windows-системах с помощью FreeOTFE и TrueCrypt
Модули
LUKS использует dm-crypt с которым должно быть скомпилировано ваше ядро. Прежде чем запускать компиляцию модулей проверьте следующие пункты в menuconfig:
Device Drivers ---> Multi-device support (RAID and LVM) ---> <M> Device mapper support <M> Crypt target support
- в данном случае dm-crypt скомпилируется в виде модулей.
...также вам потребуются собственно сами криптоалгоритмы. Выберите необходимые через menuconfig, например:
Cryptographic options ---> <M> DES and Triple DES EDE cipher algorithms <M> Blowfish cipher algorithm <M> AES cipher algorithms (i586)
- таким образом выбранные криптоалгоритмы будут собраны в виде модулей.
После компиляции модулей, загрузите их:
modprobe dm-mod modprobe dm-crypt modprobe aes
Программа
Устанавливаем программу cryptsetup-luks:
emerge cryptsetup-luks
Будут доступны команды в виде параметров к cryptsetup, такие к примеру как:
cryptsetup luksFormat <device> - форматирование устройства <device> cryptsetup luksOpen <device> <name> - открытие устройства <device> как /dev/mapper/<name> cryptsetup luksClose <name> - закрытие устройства /dev/mapper/<name> cryptsetup luksAddKey <device> - добавить ключ (пароль) в следующий свободный слот cryptsetup luksKillSlot <device> <key slot number> - удалить ключ (пароль) из слота с номером <key slot number> cryptsetup luksDump <device> - вывод информации о устройстве <device> (со списком слотов)
Ключи так же можно хранить в файлах (к примеру на USB-флешке), для этого при добавлении ключа - надо указать к нему путь:
cryptsetup luksAddKey <device> <key file>
Подготавливаем
Подготавливаем физический носитель для шифрованного тома. Это может быть файл, логический раздел. Создаем [#.D0.A8.D0.B0.D0.B3_1._.D0.A1.D0.BE.D0.B7.D0.B4.D0.B0.D0.B5.D0.BC_.D1.84.D0.B0.D0.B9.D0.BB файл ]или [#.D0.A8.D0.B0.D0.B3_1._.D0.A1.D0.BE.D0.B7.D0.B4.D0.B0.D0.B5.D0.BC_.D0.BF.D0.B0.D1.80.D1.82.D0.B8.D1.86.D0.B8.D1.8E партицию] в зависимости от того какой способ хранения вы выбрали (см. способы хранения в самом начале).
И далее по шагам.
Останавливаемся только на 5м (или 3м) шаге - на создании шифрованного тома. Вместо него делаем:
Создаем шифрованный том
cryptsetup -c aes --verify-passphrase luksFormat /dev/vg/storage
или
cryptsetup -c aes --verify-passphrase luksFormat /dev/loop0
Открываем
Далее открываем его:
cryptsetup luksOpen /dev/loop0 mycrypt
При этом запросит ваш пароль. После этого шифрованный том будет доступен как /dev/mapper/mycrypt
Форматируем файловую систему
Форматируем его:
mkreiserfs /dev/mapper/mycrypt
Все. После этих операций в устройстве /dev/mapper/mycrypt находится файловая система с шифрованными данными. Ее уже можно монтировать / писать на нее / размонтировать.
Монтируем
Монтирование:
из файла
losetup /dev/loop0 /var/db/file cryptsetup luksOpen /dev/loop0 mycrypt mount /dev/mapper/mycrypt /mnt/storage
из устройства
cryptsetup luksOpen /dev/vg/storage mycrypt mount /dev/mapper/mycrypt /mnt/storage
Размонтируем
Размонтирование:
из файла
umount /dev/mapper/mycrypt /mnt/storage cryptsetup luksClose mycrypt losetup -d /dev/loop0
из устройства
umount /dev/mapper/mycrypt /mnt/storage cryptsetup luksClose mycrypt
Меняем пароль / создаем новый
Перед этим рекомендуется [#.D0.A0.D0.B0.D0.B7.D0.BC.D0.BE.D0.BD.D1.82.D0.B8.D1.80.D1.83.D0.B5.D0.BC размонтировать] устройство.
Добавляем слот
Просмотрим информацию о состоянии слотов с паролями:
cryptsetup luksDump /dev/loop0
Добавляем пароль в следующий доступный слот
cryptsetup luksAddKey /dev/loop0
при этом вам потребуется ввести пароль из какого-либо существующего слота, чтобы удостовериться что у вас есть доступ к нему. Если вы ввели корректный пароль к примеру из слота 0, то будет выдано сообщение:
key slot 0 unlocked.
и будет предложено ввести пароль для нового слота.
Просмотрим информацию о состоянии слотов после добавления:
cryptsetup luksDump /dev/loop0
Как видим, появился новый доступный слот, к примеру:
Key Slot 1: ENABLED
Теперь доступ к устройству будет по двум паролям - из 0 и из 1 слотов.
Удаляем слот
Если хотим удалить один из слотов (со старым паролем) - выполняем команду:
cryptsetup luksKillSlot /dev/loop0 0
Тем самым мы удалили 0й слот, просмотрим информацию что получилось:
cryptsetup luksDump /dev/loop0
Будет выведено что-то на подобие:
Key Slot 0: DISABLED Key Slot 1: ENABLED
Следовательно 0-го слота, со старым паролем более не существует, а действительный только 1й слот, с новым паролем. При следующей смене - доступным будет уже 0й слот, и туда ляжет новый пароль. Одновременно можно использовать до 8 слотов.
Вывод
Как видно способы для хранения данных в файле или целиком на томе очень похожи. В обеих случаях при создании шифрованного тома у вас будет запрошен пароль на шифрованный том. Его лучше придумать по сложнее, и конечно же не забывать :) так как сообщений о том что «пароль не верен» у вас не будет – просто данных вы не сможете получить, и mount просто выдаст что-то типа unknown partition. В автозагрузку монтирование можно не включать, т.к. вам все равно придется вводить пароль при активации тома. Но последние два пунтка по монтированию / размонтированию полезно вынести в отдельные скрипты.
Шифрование раздела
...
шифрование /home
Когда я первый раз это дело настраивал, пользовался статьёй, которая теперь осталась только в google cache: вот тут. Собственно, её же опять и воспользуемся. Ставим необходимые пакеты
# aptitude install cryptsetup mdadm lvm2
На /home у меня отведён целый диск(в eee1000 их два: 8G системный и 32G под данные, который у меня /home). Готовим шифрованный раздел:
# cd ~ # cryptsetup luksFormat /dev/sdb1 // обратить внимание на "Are you sure? (Type __uppercase__ yes):" # cryptsetup luksDump /dev/sdb1 > slashhome # cryptsetup luksOpen /dev/sdb1 luks // открываем раздел # mkfs.ext4 -L home /dev/mapper/luks // создаём файловую систему
редактируем /etc/crypttab:
luks /dev/disk/by-uuid/<здесь UUID из /root/slashhome> none luks
редактируем /etc/fstab:
/dev/mapper/luks /home ext4 defaults 0 0
тестируем файловую полученный результат:
# cd /mnt # /etc/init.d/cryptdisks restart // вводим пароль, когда спросит # mount /dev/mapper/luks tmp/ # cd tmp/ # touch test
Вот и всё. Можно перемонтировать(или перезагрузиться и оно само смонтируется куда надо) на /home и наинать заливать backup, дабы получить домашний каталог как до эксперементов. ...
Ссылки по теме: