Полнодисковое шифрование

В данной статье будет рассмотрен вопрос полнодискового шифрования накопителей информации, таких как жёсткие диски, flash-память и подобных устройств с блочным доступом.

Подразумевается что такого рода шифрование используется как контрмера попыткам восстановления удалённых данных. О надёжном удалении данных с накопителей можно более подробно прочитать здесь.

Особенности

Полнодисковое шифрование существенно отличается от того, которым обычно шифруют файлы (системы PGP, OpenSSL enc модуль, и подобные), так как появляется ряд требований (кроме автоматически явного — обеспечение конфиденциальности):

  • все операции чтения/записи должны быть желательно также быстры как и при использовании не зашифрованного диска;
  • в идеале, не должно использоваться больше места чем того требует полезная нагрузка.

Предполагается, что злоумышленник:

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

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

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

Режимы шифрования и атаки

Так как сектор представляет из себя длинную цепочку блоков, то хорошим вариантом было бы применение режима сцепления блоков шифротекста (Cipher Block Chaining — CBC), где каждый последующий шифруемый блок данных складывается по модулю 2 (XOR-преобразование; исключающее логическое ИЛИ) с предыдущим. Так как каждый сектор диска независим от предыдущего, то необходимо вычисление начального вектора инициализации для каждого сектора.

Хорошей основой более полного представления об используемой здесь терминологии является книга Брюса Шнайера “Прикладная криптография”.

Здесь возникает множество возможных атак и сложностей:

  • Для всех методов шифрования использующих CBC существует возможность получения незашифрованных данных (утечка данных — content leak). Если атакующий найдёт два идентичных шифроблока (вероятность этого), то простыми XOR-преобразованиями он найдёт разницу между двумя открытыми текстами. Если один из простых текстов будет нулевым, то второй открытый текст атакующий получит в чистом виде.
  • Системы с простым способом вычисления вектора инициализации (публичный IV) подвержены атаке “водяным знаком” (watermark attack). Злоумышленник может легко вычислить вектор инициализации и заставить зашифровать такой набор данных, который оставит отчётливый “след” на зашифрованном жёстком диске (полностью нули или череда нулей и единиц). Это докажет что определённый набор данных присутствует на жёстком диске. Очень опасная и легко осуществимая атака.
  • Все методы шифрования использующие CBC имеют возможность определения точки начала изменения данных (data modification leak). Если до какого-то места данные не меняются (в пределах одного сектора), то и шифроблоки останутся неизменными.
  • Во всех методах, использующих CBC, можно подменить шифротекст с ожидаемым изменением открытого текста (malleable plain text).
  • Для всех методов шифрования использующих CBC есть возможность подмены открытого текста путём перемещения зашифрованных секторов с одного места на другое. При этом открытый текст каждого перемещённого блока, кроме первого (зависящего от вектора инициализации), может быть дешифрован.

Для борьбы с атакой водяным знаком можно применять технологию ESSIV (Encrypted Salt-Sector Initialization Vector). Её суть заключается в том, что вектор инициализации каждого сектора вычисляется шифрованием номера сектора и хэша ключа шифрования.

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

Избежать утечку открытого текста сектора и подмену шифротекста может режим шифрования CMC: CBC-mask-CBC. Его суть заключается в трёх этапах обработки сектора: обычное CBC шифрование, “маскировку” шифротекста, CBC шифрование с конца сектора. Это существенно уменьшает производительность обработки одного сектора.

Существует и множество других режимов:

  • EME (ECB-Mix-ECB) режим схож с CMC, но требует меньше криптографических операций по обработке одного сектора и его можно распараллеливать.
  • LRW (Liskov, Rivest, Wagner) работает не с целым сектором диска, а всего-лишь с одним блоком (narrow-block encryption). Для его работы необходимо использование двух ключей: один для шифрования, а другой для побелки (whitening; технология осложнения проведения атак на блочные шифры, путём XOR-преобразования открытого текста до самого шифрования с ключом и XOR-преобразования шифротекста после) до и после шифрования, с учётом логического номера блока на диске. Данный режим более быстр чем CMC и EME, но не обеспечивает защиту от возможности обнаружения модификации.
  • XEX (XOR-Encryption-XOR). XOR-преобразование данных производится с довольно сложно генерируемым вектором инициализации (называемым tweak-ом). Данный алгоритм имеет меньшую производительность чем LRW.
  • MCB (Masked CodeBook). Данный режим использует уже три ключа: первый для маскирования данных, второй для шифрования вектора инициализации, третий для шифрования самих данных.
  • XTS (XEX-based Tweakable CodeBook mode with Ciphertext Stealing — XEX-TCB-CTS (что должно писаться как XTC, но из-за созвучия с “ecstasy” именуется “XTS”) являющийся NIST и IEEE стандартом. Отличием XTS от XEX является использование двух ключей: один для шифрования самих данных, а другой для шифрования адреса позиции блока. TCB является на самом деле ECB режимом, но с двумя дополнительными входами на каждом из этапов шифрования (что и является tweak-ом). Кроме того, применяется технология “кражи шифротекста” (ciphertext stealing), предотвращающая рост шифротекста когда открытый текст не ровно (по длине) умещается в шифроблоки. Нередко для увеличения энтропии случайных данных применяют ESSIV совместно с XTS режимом.

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

Сравнение режимов

Сравнение криптостойкости некоторых алгоритмов:

Режим вектора инициализации Режим шифрования Утечка данных Атака водяным знаком Атака подмены Атака перемещения Определение точки изменения данных

публичный

CBC

Да

Да

Да

Да

Да

ESSIV

CBC

Да

Нет

Да

Да

Да

plumb-IV

CBC

Да

Нет

Да

Да

Нет

публичный

CMC

Нет

Нет

Нет

Нет

Нет

публичный

EME

Нет

Нет

Нет

Нет

Нет

публичный

LRW

Нет

Нет

Нет

Нет

Да

публичный

XTS

Нет

Нет

Нет

Нет

Нет

Сравнение производительности некоторых алгоритмов:

Режим вектора инициализации Режим шифрования Вызовов шифра XOR операций Дополнительно

публичный

CBC

n

n

ESSIV

CBC

n+1

n

plumb-IV

CBC

2n-1

2n

публичный

CMC

2n+1

2n+1

LW GF

публичный

EME

2n+1

5n

3n-1 LW GF

публичный

LRW

n

2n

n HW GF

публичный

XTS

2n

2n

n HW GF

ESSIV

XTS

2n+1

2n

n HW GF

где LW GF и HW GF являются функциями перемножения “легковесных” и “тяжеловесных” конечных полей.

Меры предосторожности при использовании

Самое главное что необходимо держать надёжно в секрете — ключи шифрования диска. Они являются самым уязвимым местом всей системы.

Наиболее удобнее для пользователя — хранить ключи для доступа к накопителю прямо на нём самом, безусловно храня их тоже в зашифрованном виде. Более надёжный вариант это хранить ключи отдельно:

  • На смарт-карте (или USB-устройствах со встроенным аналогом смарт-карты), которую необходимо разблокировать посредством ввода PIN-а. Как правило, память хранящая ключи защищена от физического вскрытия. Кроме того, при вводе PIN-кода несколько раз неправильно, ключи будут полностью уничтожены в памяти.
  • В качестве ключей использовать биометрические данные. Как показывает практика, биометрия очень легко подделывается. Более того, сама по себе она считываются с низким показателем отношения сигнал-шум и при попытке его увеличения (например более грубая оценка контуров отпечатков пальцев) количество и энтропия получаемых данных очень мала, что не позволит, например, на одном отпечатке пальца хранить криптографически стойкие ключи.
  • Получение ключей дешифрования по сети, во время загрузки системы. В данном подходе минимизируется человеческий фактор, нестойкость человеческих паролей и биометрических данных. Однако возникает очередная сложность с безопасной и авторизованной отправкой ключей с удалённого сервера по сетям где могут быть злоумышленники.

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

Более лучшим решением является использование парольных фраз (passphrases): последовательность слов, фраз, предложений, стихов и подобных данных. Парольные фразы, как правило, достаточно легко запоминаемы. Не смотря на то, что энтропия, например письменного английского языка, очень низка: около 1.1 бита на символ, количество этих символов достаточно велико и оно сложно поддаётся словарной атаке, то суммарная энтропия случайных данных парольных фраз достаточно велика для создания криптографически стойкого ключа.

Парольные фразы, как правило, пропускают через криптографическую хэш-функцию и уже её вывод используют в качестве криптостойкого ключа.

Аппаратное шифрование

Многие современные производители жёстких дисков предлагают аппаратно реализованное полнодисковое шифрование: Hitachi, Samsung, Seagate, Toshiba, Western Digital.

Предлагаемые жёсткие диски отличаются от обычных накопителей наличием собственно самой схемы шифрования и памяти для хранения ключей шифрования.

Преимущества аппаратных реализаций перед программными очевидны:

  • высокая производительность, за счёт криптопроцессоров внутри накопителей;
  • нередко использование памяти защищённой от вскрытия и прямого доступа для хранения ключей шифрования;
  • полная прозрачность работы для пользователя (за исключением процесса разблокирования ключей шифрования).

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

Использование подсистемы LUKS

Рассмотрим использование подсистемы Linux Unified Key Setup — распространённой технологии полнодискового шифрования.

Note
Подразумевается, что диск который мы хотим зашифровать будет /dev/sda.

Подготовка жёсткого диска к работе: для увеличения энтропии случайных данных на диске, его желательно предварительно заполнить этими случайными данными. Это можно сделать следующим образом:

# dd if=/dev/urandom of=/dev/sda

Генерирование ключа шифрования: LUKS может использовать или парольную фразу (passphrase) в качестве ключа шифрования или заранее сгенерированный файл с ключом. Мы будем использовать заранее сгенерированный ключ. Ключом является набор случайных данных. Поэтому для генерирования, например, двухкилобитного ключа мы можем применить следующую команду:

# dd if=/dev/random of=luks-key bs=256 count=1
Caution
Очень желательно для этого использовать криптографические сильные генераторы псевдослучайных чисел. /dev/random устройство считается довольно сильным, но желательно обработать вывод с него специальными алгоритмами (таким как Yarrow или Fortuna).

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

# cryptsetup --hash <HASH> --cipher <CIPHER> --key-file luks-key --key-size <KEY_SIZE> luksFormat /dev/sda

Где HASH это используемая хэш-функция для обработки входного ключа, KEY_SIZE это размер ключа в битах, а CIPHER это режим шифрования в контексте LUKS, обычно в формате “ENC-MODE-IV”:

  • ENC — используемый алгоритм шифрования (например “aes”, “serpent”, “twofish”);
  • MODE — режим шифрования (например “cbc”, “xts”);
  • IV — режим генерирования вектора инициализации (например “plain”, “essiv”).
Note
Информацию о Linux загруженных криптографических модулях шифрования, размеров ключей, хэш-функциях, можно получить выполнив команду cat /proc/crypto.

Подключение зашифрованного диска: подключение зашифрованного диска означает его открытие в контексте LUKS.

# cryptsetup --key-file luks-key luksOpen /dev/sda myencrypteddrive

Device mapper модуль ядра создаст новое блочное устройство доступное в /dev/mapper/myencrypteddrive. Работать с ним можно как с обычным жёстким диском.

При завершении работы с ним, его необходимо закрыть:

# cryptsetup luksClose myencrypteddrive

Вывод

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

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

Сергей Матвеев, руководитель отдела исследования и разработки <sergey.matveev@etegro.com>,
отдельное спасибо за помощь в написании статьи:
Андрею Сапронову, технический директору <andrey.sapronov@etegro.com>