Работа с зашифрованными дисками в Linux/FreeBSD/NetBSD/OpenBSD

В данной заметке рассказывается про создание и использование зашифрованного флэш-диска в операционных системах Linux/FreeBSD/NetBSD/OpenBSD. Рассматриваются только низкоуровневые методы шифрования дисков встроенные в ядра операционных систем(рассматриваемых версий). Для использования дополнительных опций и расширенных возможностей(использование нескольких ключей, шифрование корневой файловой системы, шифрование файла подкачки и пр.) см. документацию и ссылки в конце статьи.

[Mark Silinio (silinio AT mail DOT ru)]

При подготовке статьи использовались следующие операционные системы:

Содержание:



Linux

CryptoLoop (Linux 2.4)

Поддержка CryptoLoop(крипрографического loopback-устройства) появилась в Linux впервые в ядрах серии 2.4, причём для ранних версий должена была устанавливаться в виде отдельного патча в связи с действующими в то время ограничениями на экспорт криптографических систем в США. Работа с устройствами зашифрованными CryptoLoop в Windows возможна с помощью программ FreeOTFE и TrueCrypt. На сегодняшний день рекомендуется использовать систему dm-crypt ядер 2.6 заместо CryptoLoop.
Использование журналируемых файловых систем(EXT3, ReiserFS, XFS, JFS) с CryptoLoop устройствами небезопасно и может привести к потере данных.


Для работы с CryptoLoop ваше ядро должно быть скомпилировано с его поддержкой. Прежде чем запускать компиляцию модулей проверьте следующие пункты в menuconfig:
Block devices  --->
 <M> Loopback device support 
  <M> Cryptoloop support 

- в данном случае CryptoLoop скомпилируется в виде модулей.

...также вам потребуются собственно сами криптоалгоритмы. Выберите необходимые через menuconfig, например:
Cryptographic options  --->

 <M> DES and Triple DES EDE cipher algorithms
 <M> Blowfish cipher algorithm
 <M> AES cipher algorithms

- таким образом выбранные криптоалгоритмы будут собраны в виде модулей.

После компиляции модулей, загрузите их:
# modprobe loop
# modprobe cryptoloop
# modprobe aes


Теперь создаём ассоциацию устройства sda(флэшка) с loop-устройсвом loop0, используя для шифрования алгоритм AES:
# losetup -e aes /dev/loop0 /dev/sda

- при выполнении команды у вас попросят ввести пароль для этого устройства.

Создаём файловую систему FAT32 на устройстве(FAT используется для возможности работы в Windows):
# mkfs.vfat -F 32 /dev/loop0

Создадим каталог для монтирования:
# mkdir /mnt/cryptoflash


примонтируем эту файловую систему:
# mount -t vfat /dev/loop0 /mnt/cryptoflash

размонтируем файловую систему по окончании работы с ней:
# umount /dev/loop0

Отключение зашифрованного устройства:
# losetup -d /dev/loop0

всё, теперь флэшка может быть извлечена.

dm-crypt: a device-mapper crypto target (Linux 2.6)

Device-mapper представляет собой новую систему работы с mapping'ом устройсв в Linux 2.6 и шифрование устройств является лишь одной из её возможностей,- LVM2 , EVMS2 также используют подсистему device-mapper. Dm-crypt возможно использовать также для шифрования раздела подкачки, а также поверх иного mapping'а, такого как LVM2, например.

Для работы с 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

- таким образом выбранные криптоалгоритмы будут собраны в виде модулей.

После компиляции модулей, загрузите их:
# modprobe dm-mod
# modprobe dm-crypt
# modprobe aes


Устанавливаем программу cryptsetup:
# emerge cryptsetup

Теперь шифруем устройство sda(флэшка) с помощью алгоритма AES:
# cryptsetup --verify-passphrase -c aes create flashcrypt /dev/sda

- при выполнении команды у вас попросят ввести пароль для этого устройства.

Создаём файловую систему FAT32 на устройстве(FAT используется для возможности работы в Windows):
# mkfs.vfat -F 32 /dev/mapper/flashcrypt

Создадим каталог для монтирования:
# mkdir /mnt/cryptoflash

примонтируем эту файловую систему:
# mount -t vfat /dev/mapper/flashcrypt /mnt/cryptoflash

размонтируем файловую систему по окончании работы с ней:
# umount /dev/mapper/flashcrypt


Отключение зашифрованного устройства:
# cryptsetup remove flashcrypt

всё, теперь флэшка может быть извлечена.

LUKS - Linux Unified Key Setup (Linux 2.6)

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

Первичное форматирование устройства sda(флэшка) с помощью алгоритма AES(по-умолчанию):
# cryptsetup --verify-passphrase luksFormat /dev/sda

- при выполнении команды у вас попросят ввести пароль для этого устройства.

Подключение зашифрованного устройства(нужно будет ввести пароль):
# cryptsetup luksOpen /dev/sda flashcrypt

Создаём файловую систему FAT32 на устройстве(FAT используется для возможности работы в Windows):
# mkfs.vfat -F 32 /dev/mapper/flashcrypt

Создадим каталог для монтирования:
# mkdir /mnt/cryptoflash

примонтируем эту файловую систему:
# mount -t vfat /dev/mapper/flashcrypt /mnt/cryptoflash

размонтируем файловую систему по окончании работы с ней:
# umount /dev/mapper/flashcrypt

Отключение зашифрованного устройства:
# cryptsetup luksClose flashcrypt

всё, теперь флэшка может быть извлечена.

FreeBSD

GBDE - GEOM Based Disk Encryption (FreeBSD >= 5.0)

GBDE шифрует содержимое секторов при помощи 128-битного AES в режиме CBC. Каждый сектор диска шифруется различным ключом AES. Код GBDE не проанализирован в достаточной степени квалифицированными криптографами, кроме того, разработчики не гарантируют что формат хранения данных GBDE не изменится в результате исправлений ошибок или иных изменений кода. Потенциальные пользователи GBDE должны быть готовы к возможной миграции их данных с помощью утилит dump(8)/restore(8) в будущем.

Для работы с GBDE ваше ядро должно быть скомпилировано с его поддержкой. Добавте следующи строки в конфигурационных файл ядра:

options GEOM_BDE

После необходимо перекомпилировать ядро.

Либо подгружать модуль gbde во время загрузки системы. Добавьте следующую строку в /boot/loader.conf:
geom_bde_load="YES"

после этого устройства gbde(4) должны поддерживаться системой.

Первичная инициализация раздела GBDE (флэшки) с помощью gbde(8):
# gbde init /dev/da0

при выполнении команды у вас попросят два раза ввести пароль.

Подключение зашифрованного устройства к системе(нужно ввести пароль):
# gbde attach /dev/da0

создадим новую файловую систему командой newfs(8):
# newfs /dev/da0.bde

Создадим каталог для монтирования:
# mkdir /mnt/cryptoflash

примонтируем эту файловую систему:
# mount /dev/da0.bde /mnt/cryptoflash

размонтируем файловую систему по окончании работы с ней:
# umount /dev/da0.bde

Отключение зашифрованного устройства:
# geli detach /dev/da0

всё, теперь флэшка может быть извлечена.

GELI (FreeBSD >= 6.0)

GELI - это новый GEOM класс для шифрования диска. Он имеет ряд новых функций, отличающих его от уже существующего класса GBDE. Сам автор не утверждает, что GELI лучше или хуже GBDE, он просто другой. Пользователям предлагается самим выбирать, какой модуль им больше подходит по функциональности.

Некоторые возможности GELI:
  • использование специализированного оборудования для шифрования (если доступно);
  • поддержка нескольких алгоритмов шифрования (AES, Blowfish и 3DES);
  • возможность шифрования корневого раздела файловой системы;
  • возможность использования двух независимых ключей;
  • возможность использования для временных разделов и разделов подкачки
Для работы с GELI ваше ядро должно быть скомпилировано с его поддержкой. Добавте следующи строки в конфигурационных файл ядра:

options GEOM_ELI
device crypto

После необходимо перекомпилировать ядро.

Либо подгружать модуль geli во время загрузки системы. Добавьте следующую строку в /boot/loader.conf:
geom_eli_load="YES"

после этого geli(8) должен поддерживаться системой.

Первичная инициализация раздела GELI (флэшки):

# geli init /dev/da0

при выполнении команды у вас попросят два раза ввести пароль.

Подключение зашифрованного устройства к системе(нужно ввести пароль):
# geli attach /dev/da0

создадим новую файловую систему командой newfs(8):
# newfs /dev/da0.eli

Создадим каталог для монтирования:
# mkdir /mnt/cryptoflash

примонтируем эту файловую систему:
# mount /dev/da0.eli /mnt/cryptoflash

размонтируем файловую систему по окончании работы с ней:
# umount /dev/da0.eli

Отключение зашифрованного устройства:

# geli detach /dev/da0

всё, теперь флэшка может быть извлечена.

NetBSD

CGD - Cryptographic Device Driver (NetBSD >= 2.0)

Начиная с версии 2.0, NetBSD имеет собственную систему шифрования дисков CGD - Cryptographic Device Driver. Данная система также портирована под OpenBSD 3.2, но не интегрирована в основную ветвь.

Некоторые возможности CGD:
  • обеспечивает такие алгоритмы кодирования как AES, Blowfish и 3DES в режиме CBC;
  • различные методы верификации для проверки правильности ключевой фразы:
    • none: без проверки. Это опасно, так как ключ не проверяется вообще. cgdconfig примонтирует cgd устройство нормально, но данные окажутся разрушенными в случае ввода неправильного ключа (расшифровка блоков с неправильным ключом приведет к появлению совершенно передсказуемых данных),
    • disklabel: cgdconfig сканирует сответствие раздела. Если и раздел и ключ верны, то верификация будет пройдена,
    • ffs: cgdconfig сканирует файловую систему. Если файловая система и ключ верны, то верификация будет пройдена;
  • возможность использования для временных разделов и разделов подкачки
Для работы с устройствами cgd, ядро должно быть скомпилированно с поддержкой хотя бы одного(далее возьмём четыре):
pseudo-device cgd     4       # cryptographic disk driver

Создаём файл конфигурации(/etc/cgd/sd0) cgd для устройства sd0(флэшка):
# cgdconfig -g -o /etc/cgd/sd0 -V ffs blowfish-cbc

- используем алгоритм Blowfish и проводим верификацию по FFS.

Конфигурируем устройство cgd:
# cgdconfig -V none cgd0 /dev/sd0

при выполнении команды у вас попросят ввести пароль для этого cgd устройства.

создадим новую файловую систему командой newfs(8):
# newfs /dev/cgd0

Создадим каталог для монтирования:
# mkdir /mnt/cryptoflash

примонтируем эту файловую систему:
# mount /dev/cgd0 /mnt/cryptoflash

размонтируем файловую систему по окончании работы с ней:
# umount /dev/cgd0

после окончания работы cgd устройство должно быть расконфигурировано:
# cgdconfig -u cgd0

всё, теперь флэшка может быть извлечена.

OpenBSD

SVND - Safe Vnode Disk Driver (OpenBSD >= 2.1)

Вместо добавления криптографии поверх существующей семантики файловой системы, виртуальная шифрованная файловая система была добавлена в существующую в OpenBSD систему vnode(9) через vnd(4), Vnode Disk Driver.

SVND имеет следующие ограничения:
  • использование единственного криптоалгоритма Blowfish (blowfish(3));
  • ограничение на максимальный размер шифрованной файловой системы (около 8.2Гб);
  • отсутствие поддержки HMAC;
  • опасность повреждения шифрованной файловой системы при ненормальном размотировании
Для работы с устройствами vnd, ядро должно быть скомпилированно с поддержкой хотя бы одного(далее возьмём четыре):
pseudo-device vnd 4

следует заметить что поддержка vnd устройств присутствует в GENERIC ядре.

Для работы с vnd устройствами используется утилита vnconfig(8). Далее создадим зашифрованную файловую систему на устройстве sd0(флэш-диск):
# vnconfig -ck -v /dev/svnd0c /dev/sd0

при выполнении команды у вас попросят ввести пароль для этой зашифрованной файловой системы.

создадим новую файловую систему командой newfs(8):
# newfs /dev/svnd0c


Создадим каталог для монтирования:
# mkdir /mnt/cryptoflash

примонтируем эту файловую систему:
# mount /dev/svnd0c /mnt/cryptoflash

размонтируем файловую систему по окончании работы с ней:
# umount /dev/svnd0c

отключим ассоциацию vnd-устройства с реальным устройством(sd0):
# vnconfig -u -v /dev/svnd0c

всё, теперь флэшка может быть извлечена.

Ссылки

Статья взята с сайта OpenNet.

[ опубликовано 07/03/2006 ]

Mark Silinio (silinio AT mail DOT ru) - Работа с зашифрованными дисками в Linux/FreeBSD/NetBSD/OpenBSD   Версия для печати