Создание шифрованного тома в Linux или cryptsetup - crypto

Материал из support.qbpro.ru

Создание шифрованного тома в Linux

Материал из 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, дабы получить домашний каталог как до эксперементов. ...


Ссылки по теме: