Глава 13. Драйвер криптографического устройства

Глава 13. Драйвер криптографического устройства

Русский перевод: Михаил Сгибнев

Драйвер cgd предоставляет возможность использовать диски или разделы для хранения зашифрованной информации. После аутентификации зашифрованная информация становится доступна через псевдо-устройство cgd.

13.1. Введение

У каждого человека есть, что скрывать. Люди хранят важную информацию на жестких дисках, сменных накопителях; такая информация может находиться на ноутбуке и к любому из этих устройств может быть осуществлен несанкционированный доступ, или оно может быть утеряно.

13.1.1. Почему используется шифрование диска?

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

Как вариант, на жестком диске могли остаться вполне читаемые копии файлов и даже их удаление (с помощью команды rm -P) не может гарантировать того, что не остались копии во временных каталогах, в области подкачки или в разделах жесткого диска, помеченных как сбойные.

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

13.1.2. Драйвер логического диска

Устройство cgd видно системе и ведет себя точно также как и любое другое дисковое устройство. Драйвер cgd не занимается непосредственно управлением работой диска, а лишь обеспечивает функции шифрации/дешифрации. Для создания и конфигурирования устройства cgd существует специальная утилита cgdconfig.

В состав NetBSD входят несколько подобных логических устройств, каждое из которых реализует некоторую функцию. Например, cgd предоставляет возможность шифрования дисков и разделов; с помощью vnd возможна организация дисковых разделов внутри файла, а raid позволяет защитить данные в случае отказа жесткого диска. Соединив эти технологии можно добиться высоких показателей защиты от несанкционированного доступа и надежности в работе.

После создания cgd диска, Вы можете использовать команду disklabel для разделения его на разделы. Команда swapctl позволяет создать область подкачки на этом диске, команда newfs организовывает файловую систему, с помощью команды mount мы монтируем диск для дальнейшего его использования, как и любой другой диск.

13.1.3. Доступность

Драйвер cgd был написан Roland C. Dowdeswell, и анансирован в NetBSD-current между релизами 1.6 и 2.0. В результате, он не был включен в релиз 1.6, но представлен в релизе 2.0

13.2. Компоненты системы Crypto-Graphic Disk

Для того, чтобы сделать эффективной систему cgd вместе должно работать много компонентов.

13.2.1. Драйвер псевдо-устройства ядра

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

pseudo-device cgd  4  # cryptographic disk driver
 

Число указывает на количество одновременно примонтированных устройств cgd. После внесения изменений в ядро, необходимо его перекомпилировать, установить и перезагрузить систему.

13.2.2. Алгоритмы шифрования

Драйвер cgd поддерживает следующие алгоритмы шифрования:

  • aes-cbc: AES (Rijndael).В AES используется 128 размер блока и принимает ключи длиной 128, 192 или 256 бит

  • blowfish-cbc:В Blowfish используется 64 размер блока и принимает ключи длиной 128 бит

  • 3des-cbc:В Triple DES используется 64 размер блока и принимает ключи длиной 192 бит (в настоящий момент для шифрования используется ключ 168 бит)

Все три шифра используются в режиме цепочки блоков шифротекста (Cipher Block Chaining). Это означает, что к каждому блоку применяется XOR с предыдущим зашифрованным блоком перед кодированием. Это снижает риск обнаружения образца и, соответственно, риск взлома.

13.2.3. Методы верификации

Другой аспект cgd, который нуждается в рассмотрении - это методы верификации, обеспечиваемые утилитой cgdconfig. Они используются для проверки правильности ключевой фразы. Доступны следующие:

  • none: без проверки. Это опасно, так как ключ не проверяется вообще. cgdconfig примонтирует cgd устройство нормально, но данные окажутся разрушенными в случае ввода неправильного ключа (расшифровка блоков с неправильным ключом приведет к появлению совершенно непредсказуемых данных)

  • disklabel: cgdconfig сканирует сответствие раздела. Если и раздел и ключ верны, то верификация будет пройдена

  • ffs: cgdconfig сканирует файловую систему. Если файловая система и ключ верны, то верификация будет пройдена

13.3. Пример: зашифровываем диск

В этом разделе мы по шагам разберем пример конфигурирования существующей системы для работы cgd, выполнив следующие действия:

  1. Подготовим диск и разделы

  2. Уничтожим все данные

  3. Создадим cgd

  4. Напишем файл конфигурации

  5. Восстановим данные на шифрованный диск

13.3.1. Подготавливаем диск

Сперва определимся, какие файловые системы Вы хотите зашифровать. Сразу оговоримся, что необходимо оставить / в незашифрованном виде, для того чтобы загрузить ядро и выполнить init, cgdconfig и скрипт rc.d для конфигурирования устройства cgd. В нашем примере будем шифровать все, за исключением корневой (/) файловой системы.

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

Загрузив систему в однопользовательском режиме, примонтируйте / для чтения/записи и отмонтируйте все остальные файловый системы, используя команду disklabel удалите все разделы, которые вы хотите переместить в cgd.

Затем создайте один единственный новый раздел на все пространство, которое вы будете использовать, например, на wd0e. Установите в качестве типа раздела ccd (поскольку нет кода для cgd, но они похожи). Хотя это и не имеет никакого значения, цель этого состоит в том, чтобы напомнить вам, что вы используете не совсем обычную файловую систему. Когда закончите, сохраните новую таблицу разделов.

13.3.2. Очистка диска

Мы удалили таблицу разделов, но файловая система и данные все еще остались на диске. Даже после создания устройства cgd, файловой системы и восстановления на ней наших данных, будут существовать некоторые блоки с незашифрованным текстом. Это особенно вероятно при низком проценте использованого объема диска. Прежде, чем пойдем дальше, необходимо очистить диск.

Мы можем использовать команду dd, для записи /dev/zero поверх раздела wd0e, но тогда мы получим полный диск нулей, за исключением самого зашифрованного раздела. Это может помочь злоумышленнику определить блоки с данными, что не входит в наши цели. Нам необходим "шум". Так что для решения этой проблемы создадим временное устройство cgd со случайным, неизвестным нам ключом.

Сначала конфигурируем cgd на использование случайного ключа:

# cgdconfig -s cgd0 /dev/wd0e aes-cbc 128 < /dev/urandom 

Теперь записываем нули в раздел cgd (/dev/rcgd0d в NetBSD/i386, /dev/rcgd0c на некоторых других платформах):

# dd if=/dev/zero of=/dev/rcgd0d bs=32k

Зашифрованные нули будут требуемыми случайными данными на диске. Этот процесс может занять довольно много времени при большом диске. В заключении, расконфигурируем случайный ключ cgd:

# cgdconfig -u cgd0

13.3.3. Создание cgd

Для управления устройством cgd применяется программа cgdconfig, использующая файлы конфигурации для хранения информации о типе шифрования, длине ключа, соли пароля (параметр, позволяющий увеличить энтропию) и других параметров. Эти файлы очень важны, без них невозможна будет дешифровка данных!

Сейчас мы составим файл конфигурации и поместим его в каталог по умолчанию (в каталог /etc/cgd, права доступа к нему поставим 700):

# cgdconfig -g -V disklabel -o /etc/cgd/wd0e aes-cbc 256

Эта операция создаст файл /etc/cgd/wd0e, описывающий cgd, использующий метод шифрования aes-cbc, проверку по disklabel и длину ключа в 256 бит. Смотреться это будет примерно так:

algorithm aes-cbc;
iv-method encblkno;
keylength 256;
verify_method disklabel;
keygen pkcs5_pbkdf2/sha1 {
	iterations 6275;
	salt AAAAgHTg/jKCd2ZJiOSGrgnadGw=;
};

Замечание

Помните, что вам необходимо позаботиться о безопасности этого файла.

Подсказка

При создании файла конфигурации cgdconfig читает /dev/random для создания соли пароля. Это действие может быть заблокировано, если в пуле случайных чисел не будет создана достаточная энтропия. Если вы выполнили действия по перезаписи диска, указанные выше, то вероятность блокировки черезвычайно мала. Но если это произошло, нажмите клавиши на консоли и/или двигайте мышью, пока устройство rnd не наберет достаточную энтропию.

Теперь подошло время создания cgd, для чего нам необходима кодовая фраза. Эта фраза нам потребуется при каждом открытии cgd, например, после перезагрузки. Убедитесь, что запомнили пароль и он не является очевидным для посторонних.

Теперь необходимо сконфигурировать cgd, поскольку у нас не имеется раздела на логическом устройстве:

# cgdconfig -V re-enter cgd0 /dev/wd0e

Кодовая фраза будет запрошена у вас дважды, на случай если вы опечатаетесь и останетесь с зашифрованным диском и неизвестной кодовой фразой.

Теперь, когда мы имеем новое устройство cgd, нам необходимо создать разделы и файловые системы . Создадим точно такие же разделы как и были, с теми же самыми именами.

Подсказка

Не забудьте использовать аргумент disklabel -I, так как вы создаете метку инициализации для нового диска.

Замечание

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

Затем, используя команду newfs, создаем файловые системы на всех разделах. Теперь требуется указывать имена дисков, относительно cgd:

# newfs /dev/rcgd0h

13.3.4. Модифицирование файлов конфигурации

Поскольку мы переместили несколько файловых систем на другой (логический) диск, нам необходимо обновить записи в /etc/fstab. Каждый раздел будет обозначаться прежней буквой, только в качестве диска вместо wd0 будет использоваться cgd0. Окончательный вариант /etc/fstab будет выглядеть так:

 /dev/wd0a /  ffs  rw,softdep 1 1
 /dev/cgd0b none swap sw   0 0
 /dev/cgd0b /tmp mfs  rw,-s=132m 0 0
 /dev/cgd0e /var ffs  rw,softdep 1 2
 /dev/cgd0f /usr ffs  rw,softdep 1 2
 /dev/cgd0h /home ffs  rw,softdep 1 2

Замечание

/tmp должнна быть отдельной файловой системой типа mfs или ffs, расположенной внутри cgd, если вы не хотите, чтобы ваши временные файлы не сохранялись в виде открытого текста.

После каждой перезагрузки вам необходимо будет конфигурировать cgd перед запуском fsck и монтированием файлововых систем.

Вставьте следующие строки в /etc/cgd/cgd.conf:

 cgd0 /dev/wd0e

Это укажет использовать файл конфигурации /etc/cgd/wd0e для cgd0.

В заключении, установим cgd на активацию при начальной загрузке, добавив в /etc/rc.conf:

 cgd=YES

Теперь, каждый раз при старте /etc/rc необходимо вводить кодовую фразу для /dev/cgd0.

13.3.5. Восстановление данных

Затем, с помощью команды mount монтируем новые файловые системы и восстанавливаем данные, используя команду restore. Часто бывает полезным иметь примонтированую /tmp, так как restore может использовать временные файлы при распаковке большого файла дампа.

Для проверки работы устройства после перезагрузки, отмонтируйте файловые системы и расконфигурируйте cgd, например перейдя в однопользовательский режим. Выполните rc, имитировав процесс загрузки, введите кодовую фразу и удостоверьтесь, что файловые системы примонтировались. Теперь можно перейти в многопользовательский режим и проверить работоспособность системы.

13.4. Предложения и предупреждения

Теперь мы имеем зашифрованную файловую систему на cgd. Когда ваша машина выключена, данные защищены и не могут быть дешифрованы без знания кодовой фразы. Однако, существует еще много опасностей, которых можно избежать, если использовать cgd. Этот раздел посвящен рассказу о более эффективном использовании cgd.

  • Используйте различные устройства cgd для различных данных, монтируя зашифрованные разделы по мере необходимости.

  • Конфигурируйте cgd перед vnd из файла удаленных файловых систем (NFS, SMBFS, CODA, etc) и не сохраняйте данные на общих файловых системах.

13.4.1. Использование random-key cgd для шифрования файла подкачки

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

Мы создавали временное устройство cgd со случайным ключом в примере выше, для того, чтобы очистить диск от наших старых данных, а параметр cgdconfig -s указывал нам не создавать файл конфигурации.

Файл конфигурации cgdconfig включает в себя метод генерации ключа «randomkey». Это облегчает задачу "постоянного" использования случайного ключа и предоставляет возможность работы в автоматическом режиме.

Для примера, если вы хотите сконвертировать существующий раздел /dev/wd0b в cgd1, использующий случайный ключ, выполните следующую команду для генерации /etc/cgd/wd0b:

# cgdconfig -g -o /etc/cgd/wd0b -V none -k randomkey blowfish-cbc
  

Когда используется случайный метод генерации ключа, может использоваться только метод верификации "none", потому что содержимое нового cgd будет случайно после каждой перезагрузки (так как предыдущие данные зашифрованы случайным ключом). Аналогично, новый диск не будет иметь метки или разделов и команда swapctl будет жаловаться на конфигурирование устройство подкачки, не имеющего раздела.

Чтобы автоматизировать процесс разметки диска, подготовьте список разделов и сохраните его в файл, для примера в /etc/cgd/wd0b.disklabel. Пожалуйста, изучите disklabel(8) для получения более подробной информации.

Для восстановления разделов в новом устройстве cgd после каждой перезагрузки, создайте файл /etc/rc.conf.d/cgd, как показано ниже (спасибо Lubomir Sedlacik):

swap_device="cgd0"
swap_disklabel="/etc/cgd/wd0b.disklabel"
start_postcmd="cgd_swap"

cgd_swap()
{
	if [ -f $swap_disklabel ]; then
		disklabel -R -r $swap_device $swap_disklabel
	fi
}
 

Та же самая методика может быть применена и при использовании newfs, при пересоздании файловой системы ffs для /tmp, если вы не хотите использовать mfs.

13.4.2. Предупреждения

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

Хранение данных на зашифрованном диске, это конечно хорошо, но что делать с другими копиями, например резервными? Использование конвеера для команды dump на инструмент шифрования файлов gpg может стать одним из решений данной проблемы, только убедитесь, что у вас наличествуют ключи и необходимые утилиты для предварительной расшифровки перед выполнением команды restore.

Подобно любой программной реализации алгоритма кодирования, ключ cgd находится в памяти ядра, когда устройство сконфигурировано к нему может получить доступ привилегированный пользователь или программа, такая как /dev/kmem.

Когда раздел cgd примонтирован, то он становится доступен, как любая другая файловая система. Позаботьтесь о правах доступа к файлам, защите от программных и сетевых атак.

Избегайте частого отключения/присоединения, особенно для ноутбуков с функциями BIOS suspend-to-disk. Если злоумышленник сможет получить доступ к вашей машине с ключом в памяти или прочитает из памяти образ suspend-to-disk, использование cgd потеряет смысл.

Обновлено: 16.03.2015