Шифрование файловых систем


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

Механизм GBDE, или Geom-Based Disk Encryption (шифрование диска на базе GEOM), обладает специализированными возможностями для применения в системах с высокой степенью секретности, где защита пользователей так же важна, как и скрытие данных. В дополнение к ключу шифрования, предоставляемому пользователем, механизм GBDE использует ключи, сохраняемые в определенных секторах на жестком диске. Если какой-либо ключ окажется недоступен, расшифровать раздел не удастся. Почему это так важно? Если вычислительный центр с высокими требованиями к секретности (например, в посольстве) подвергнется нападению, оператору потребуется совсем немного времени, чтобы уничтожить ключи на жестком диске и тем самым исключить возможность восстановления данных. Если плохие парни, приставив пистолет к моей голове, потребуют: «Введи пароль — или…», я предпочел бы, чтобы файловая система ответила: «Пароль принят, но ключи уничтожены». Мне не нужны универсальные сообщения вроде: «Диск не может быть расшифрован». Если в первом случае я еще могу представлять ценность как заложник, то во второй меня либо убьют, либо придумают что-нибудь похуже.*

Механизм шифрования GELI более гибок, но он не сможет защитить меня от телесных повреждений, как GBDE. Если кто-то захватит мой ноутбук с конфиденциальными документами или пользователь, которому я не доверяю, пожелает исследовать пространство свопинга на наличие секретной информации, механизма GELI будет вполне достаточно. Но GELI даже не попытается защитить мою персону — только мои данные. Поскольку я не собираюсь устраиваться на работу, которая не предполагает высокую степень защищенности от огнестрельного оружия (при том, что я живу в Детройте), этот механизм подходит для меня как нельзя лучше. Кроме того, GELI использует криптографический драйвер устройства FreeBSD, а это означает, что при наличии на сервере аппаратных средств шифрования GELI задействует их.

Следует заметить, что в большинстве случаев применение механизма шифрования файловых систем не только излишне, но и увеличивает риск потери данных. Из-за неправильных настроек шифрования или из-за утраты ключей данных было потеряно гораздо больше, чем из-за краж. Когда я слышу: «Я зашифровал весь свой жесткий диск!», — мне легко представить будущее, когда тот же самый человек скажет: «Я потерял все, что было на жестком диске!» Я оказываюсь прав более чем часто. Задумайтесь, так ли вам необходимо шифрование диска.

В этом примере мы будем использовать механизм CELI для шифрования раздела на диске /dev/da0, а ключи шифрования будут храниться на устройстве USB, монтируемом в каталог /media. Более разумным может оказаться решение использовать в качестве шифруемого раздела файловую систему внутри файла (глава 8). Шифрование всего жесткого диска требуется очень немногим и при весьма специфических обстоятельствах, потому что это может увеличить подозрения. У меня есть опыт объяснений со службой безопасности аэропорта, сотрудники которой пытались выяснить «почему мой ноутбук выглядит так странно». На их взгляд, от приглашения к вводу «Вставьте ключ и введите пароль», появляющегося перед загрузкой, до решения «этот человек подозрительно выглядит, и его нужно полностью обыскать» — всего один шаг. Если вам действительно необходимо зашифровать некоторые документы, скорее всего они занимают всего несколько мегабайт, и тогда лучше использовать файловую систему в файле.

Конфигурирование ядра

Для работы механизма GELI необходим модуль ядра geom_eli.ko, которому, в свою очередь, требуется модуль crypto.ko. Загрузить эти модули можно на этапе загрузки системы, с помощью файла /boot/loader.conf или добавить соответствующие устройства в конфигурацию ядра:

options GE0M_ELI
device crypto

Создание и использование ключа шифрования

Для работы с зашифрованным устройством механизм GELI позволяет использовать файл ключа и/или секретную фразу в качестве ключа. Мы будем использовать и то и другое. Чтобы создать файл ключа, с помощью утилиты dd(1) извлеките достаточно большой объем данных из устройства /dev/random и запишите их в файл. Не забывайте, каталог /media — это точка монтирования устройства USB. Если вы действительно хотите защитить свои данные, создайте ключ непосредственно на устройстве USB — не оставляйте его в своей файловой системе, откуда предполагаемый злоумышленник смог бы восстановить его. (Даже в случае удаления файла на диске по-прежнему остаются данные, которые могут быть восстановлены квалифицированным злоумышленником.)

# dd if=/dev/random of=/media/da0.key bs=64 count=1
1+0 records in
1+0 records out
64 bytes transferred in 0.000149 secs (429497 bytes/sec)

64 байта данных составляют 512-битовый ключ. При желании вы можете увеличить размер ключа ценой увеличения нагрузки на процессор при обращении к зашифрованной файловой системе. Не забывайте, что секретная фраза также увеличивает сложность ключа.

Связать секретную фразу с ключом позволяет команда geli_init. Ключ -s определяет желаемый размер сектора на шифруемой файловой системе; обычно 4 096 байтов, или 4 Кбайт вполне достаточно для данного применения. Ключ -K определяет имя файла ключа. Кроме того, нужно указать устройство, которое будет шифроваться.

# geli init -s 4096 -К /media/da0.key /dev/da0
Enter new passphrase:
(Перевод: Введите секретную фразу)
Reenter new passphrase:
(Перевод: Повторите ввод секретной фразы)

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

Теперь, когда у нас есть ключ, подключим его к устройству, которое будет шифроваться.

# geli attach -k /media/da0.key /dev/da0
Enter passphrase:

Теперь geli(8) знает, что /dev/da0 — это шифруемый диск и что файл /media/da0.key — это файл ключа шифрования. После ввода секретной фразы вы сможете получить доступ к расшифрованному содержимому зашифрованного диска через устройство /dev/da0.eli. Безусловно, чтобы можно было помещать на этот диск какие-либо данные, вам понадобится файловая система.

Файловые системы на шифруемых устройствах

Прежде чем создать файловую систему на шифруемом устройстве, следует очистить диск от старых данных. На самом деле, newfs(8) не удаляет с диска никакие данные; эта утилита просто добавляет суперблок, который указывает местоположение индексных дескрипторов. Если этот диск ранее использовался, злоумышленник сможет просмотреть оставшиеся на нем части файлов. Хуже того, он сможет просматривать остатки зашифрованных данных, помещенных туда механизмом GELI. Прежде чем поместить на диск файловую систему, лучше всего покрыть диск «дымовой завесой» из случайных данных, чтобы существенно осложнить злоумышленнику возможность идентифицировать блоки с данными. Снова воспользуемся утилитой dd(1):

# dd if=/dev/random of=/dev/da0.eli bs=1m
8684+0 records in
8683+1 records out
9105014784 bytes transferred in 1575.226434 secs (5780131 bytes/sec)

Как видите, этой древней системе потребовалось больше 25 минут, чтобы покрыть весь 8,5-гигабайтный диск высококачественными случайными данными. Требуемое время зависит от быстродействия системы и объема доступных случайных данных. Аппаратное устройство шифрования может существенно увеличить объем доступных случайных данных.

Теперь, когда диск забит мусором под завязку, можно установить на него файловую систему и подключить ее к системе. Не используйте механизм Soft Updates для работы с шифруемыми дисками. В любом случае шифрование диска снизит производительность системы.

# newfs /dev/da0.eli
# mount /dev/da0.eli /mnt

Теперь ваш шифруемый диск доступен в каталоге /mnt и можно сохранять на нем конфиденциальные файлы.

Деактивизация шифруемых дисков

По окончании работы с шифруемым разделом нужно остановить механизм GELI и вернуть раздел в недоступное, то есть зашифрованное состояние. Для начала следует отмонтировать раздел, а затем командой geli detach отсоединить шифруемый диск от ключа.

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

Шифрование пространства свопинга с помощью geli(8)

Если вы позволяете входить в систему пользователям, не вызывающим доверия, возможно, не лишено смысла зашифровать пространство свопинга. Я нахожу это полезным на серверах, куда может заходить множество пользователей, чтобы работать со своими приложениями. Вместо того чтобы создавать ключ шифрования, который требует защиты секретной фразой, FreeBSD будет во время загрузки генерировать случайный ключ без секретной фразы и применять его для шифрования пространства свопинга. Это обеспечит шифрование данных в разделе свопинга, чтобы ни один злоумышленник не смог извлечь секретные даны из пространства свопинга. Хотя оба механизма, и GBDE и GELI, поддерживают шифрование пространства свопинга таким способом, мы по-прежнему будем использовать GELI.

В дополнение к загрузке модуля ядра geom_eli во время запуска системы вы должны немного изменить файл /etc/fstab. Добавьте расширение .eli к имени устройства пространства свопинга и в результате FreeBSD будет автоматически шифровать его средствами механизма GELI. Например, запись в файле /etc/fstab, описывающая раздел свопинга на моей машине, изменится с:

на:

Небольшое изменение (1) — это все, что необходимо для обеспечения шифрования пространства свопинга. Лично я считаю более полезным наращивать объем памяти на сервере с секретными данными, чтобы вообще отказаться от раздела свопинга, но для вас это может оказаться неприемлемо.

Комментарии запрещены.