@node Disk encryption @section Полнодисковое шифрование В данной статье будет рассмотрен вопрос полнодискового шифрования накопителей информации, таких как жёсткие диски, flash-память и подобных устройств с блочным доступом. @subsection Особенности Полнодисковое шифрование существенно отличается от того, которым обычно шифруют файлы (системы PGP, OpenSSL enc модуль, и подобные), так как появляется ряд требований (кроме автоматически явного -- обеспечение конфиденциальности): @itemize @item все операции чтения/записи должны быть желательно также быстры как и при использовании не зашифрованного диска; @item в идеале, не должно использоваться больше места чем того требует полезная нагрузка. @end itemize Предполагается, что злоумышленник: @itemize @item может прочитать зашифрованные данные с диска в любое время; @item может сохранить на диске любую информацию, шифруя её подсистемой полнодискового шифрования; @item может модифицировать любые секторы диска; @item может считать данные, дешифруя их подсистемой полнодискового шифрования. @end itemize Данные предположения должны свести всю информацию которую может получить злоумышленник только к фактам изменения секторов. Из этих предположений следуют особенности методов полнодискового шифрования: весь диск разбивается на сектора, каждый из которых обрабатывается независимо друг от друга. Это диктует необходимость настройки параметров шифрования (tweaking), что исключает возможность применения режимов шифрования с отсутствием начального состояния (вектором инициализации). @subsection Режимы шифрования и атаки Так как сектор представляет из себя длинную цепочку блоков, то хорошим вариантом было бы применение режима сцепления блоков шифротекста (Cipher Block Chaining -- CBC), где каждый последующий шифруемый блок данных складывается по модулю 2 (XOR-преобразование; исключающее логическое ИЛИ) с предыдущим. Так как каждый сектор диска независим от предыдущего, то необходимо вычисление начального вектора инициализации для каждого сектора. Хорошей основой более полного представления об используемой здесь терминологии является книга Брюса Шнайера "Прикладная криптография". Здесь возникает множество возможных атак и сложностей: @itemize @item Для всех методов шифрования использующих CBC существует возможность получения незашифрованных данных (утечка данных -- @strong{content leak}). Если атакующий найдёт два идентичных шифроблока, то простыми XOR-преобразованиями он найдёт разницу между двумя открытыми текстами. Если один из простых текстов будет нулевым, то второй открытый текст атакующий получит в чистом виде. @item Системы с простым способом вычисления вектора инициализации (публичный IV) подвержены атаке "водяным знаком" (@strong{watermark attack}). Злоумышленник может легко вычислить вектор инициализации и заставить зашифровать такой набор данных, который оставит отчётливый "след" на зашифрованном жёстком диске (полностью нули или череда нулей и единиц). Это докажет что определённый набор данных присутствует на жёстком диске. Очень опасная и легко осуществимая атака. @item Все методы шифрования использующие CBC имеют возможность определения точки начала изменения данных (@strong{data modification leak}). Если до какого-то места данные не меняются (в пределах одного сектора), то и шифроблоки останутся неизменными. @item Во всех методах, использующих CBC, можно подменить шифротекст с ожидаемым изменением открытого текста (@strong{malleable plain text}). @item Для всех методов шифрования использующих CBC есть возможность @strong{подмены открытого текста} путём перемещения зашифрованных секторов с одного места на другое. При этом открытый текст каждого перемещённого блока, кроме первого (зависящего от вектора инициализации), может быть дешифрован. @end itemize Для борьбы с атакой водяным знаком можно применять технологию @strong{ESSIV} (Encrypted Salt-Sector Initialization Vector). Её суть заключается в том, что вектор инициализации каждого сектора вычисляется шифрованием номера сектора и хэша ключа шифрования. Для борьбы с возможностью обнаружения модификации можно применять @strong{Plumb-IV} метод вычисления вектора инициализации. Его суть заключается в хэшировании данных сектора со второго блока и до конца, и номеров сектора и ключа шифрования. Любое изменение данных приводит к полному изменению всего сектора. Но это требует их двойной обработки сектора. Избежать утечку открытого текста сектора и подмену шифротекста может режим шифрования @strong{CMC}: CBC-mask-CBC. Его суть заключается в трёх этапах обработки сектора: обычное CBC шифрование, "маскировку" шифротекста, CBC шифрование с конца сектора. Это существенно уменьшает производительность обработки одного сектора. Существует и множество других режимов: @table @strong @item EME (ECB-Mix-ECB) режим схож с CMC, но требует меньше криптографических операций по обработке одного сектора и его можно распараллеливать. @item LRW (Liskov, Rivest, Wagner) работает не с целым сектором диска, а всего-лишь с одним блоком (narrow-block encryption). Для его работы необходимо использование двух ключей: один для шифрования, а другой для побелки (@strong{whitening}; технология осложнения проведения атак на блочные шифры, путём XOR-преобразования открытого текста до самого шифрования с ключом и XOR-преобразования шифротекста после) до и после шифрования, с учётом логического номера блока на диске. Данный режим более быстр чем CMC и EME, но не обеспечивает защиту от возможности обнаружения модификации. @item XEX (XOR-Encryption-XOR) XOR-преобразование данных производится с довольно сложно генерируемым вектором инициализации (называемым tweak-ом). Данный алгоритм имеет меньшую производительность чем LRW. @item MCB (Masked CodeBook) Данный режим использует уже три ключа: первый для маскирования данных, второй для шифрования вектора инициализации, третий для шифрования самих данных. @item 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 режимом. @end table Компромиссом остаётся вопрос выбора маленького размера шифруемого сектора или большого. Последний безусловно более криптографически стоек к атакам, однако требует больших вычислительных мощностей для его обработки. @subsection Сравнение режимов Сравнение криптостойкости некоторых алгоритмов: @multitable @columnfractions .16 .14 .14 .14 .14 .14 .14 @headitem Режим вектора инициализации @tab Режим шифрования @tab Утечка данных @tab Атака водяным знаком @tab Атака подмены @tab Атака перемещения @tab Определение точки изменения данных @item публичный @tab CBC @tab Да @tab Да @tab Да @tab Да @tab Да @item ESSIV @tab CBC @tab Да @tab Нет @tab Да @tab Да @tab Да @item plumb-IV @tab CBC @tab Да @tab Нет @tab Да @tab Да @tab Нет @item публичный @tab CMC @tab Нет @tab Нет @tab Нет @tab Нет @tab Нет @item публичный @tab EME @tab Нет @tab Нет @tab Нет @tab Нет @tab Нет @item публичный @tab LRW @tab Нет @tab Нет @tab Нет @tab Нет @tab Да @item публичный @tab XTS @tab Нет @tab Нет @tab Нет @tab Нет @tab Нет @end multitable Сравнение производительности некоторых алгоритмов: @multitable @columnfractions .40 .15 .15 .15 .15 @headitem Режим вектора инициализации @tab Режим шифрования @tab Вызовов шифра @tab XOR операций @tab Дополнительно @item публичный @tab CBC @tab n @tab n @item ESSIV @tab CBC @tab n+1 @tab n @item plumb-IV @tab CBC @tab 2n-1 @tab 2n @item публичный @tab CMC @tab 2n+1 @tab 2n+1 @tab LW GF @item публичный @tab EME @tab 2n+1 @tab 5n @tab 3n-1 LW GF @item публичный @tab LRW @tab n @tab 2n @tab n HW GF @item публичный @tab XTS @tab 2n @tab 2n @tab n HW GF @item ESSIV @tab XTS @tab 2n+1 @tab 2n @tab n HW GF @end multitable где @emph{LW GF} и @emph{HW GF} являются функциями перемножения "легковесных" и "тяжеловесных" конечных полей. @subsection Меры предосторожности при использовании Самое главное что необходимо держать надёжно в секрете -- ключи шифрования диска. Они являются самым уязвимым местом всей системы. Наиболее удобнее для пользователя -- хранить ключи для доступа к накопителю прямо на нём самом, безусловно храня их тоже в зашифрованном виде. Более надёжный вариант это хранить ключи отдельно: @itemize @item На @strong{смарт-карте} (или USB-устройствах со встроенным аналогом смарт-карты), которую необходимо разблокировать посредством ввода PIN-а. Как правило, память хранящая ключи защищена от физического вскрытия. Кроме того, при вводе PIN-кода несколько раз неправильно, ключи будут полностью уничтожены в памяти. @item В качестве ключей использовать @strong{биометрические данные}. Как показывает практика, биометрия очень легко подделывается. Более того, сама по себе она считываются с низким показателем отношения сигнал-шум и при попытке его увеличения (например более грубая оценка контуров отпечатков пальцев) количество и энтропия получаемых данных очень мала, что не позволит, например, на одном отпечатке пальца хранить криптографически стойкие ключи. @item Получение ключей дешифрования по @strong{сети}, во время загрузки системы. В данном подходе минимизируется человеческий фактор, нестойкость человеческих паролей и биометрических данных. Однако возникает очередная сложность с безопасной и авторизованной отправкой ключей с удалённого сервера по сетям где могут быть злоумышленники. @end itemize При хранении ключей прямо на диске их необходимо зашифровать (достаточно простого симметричного шифра). Ключом дешифрования может являться введённый пользователем пароль. В большинстве случаев, люди не в состоянии ни сгенерировать криптостойкие пароли, ни, тем более, запомнить. Более лучшим решением является использование парольных фраз (@strong{passphrases}): последовательность слов, фраз, предложений, стихов и подобных данных. Парольные фразы, как правило, достаточно легко запоминаемы. Не смотря на то, что энтропия, например письменного английского языка, очень низка: около 1.1 бита на символ, количество этих символов достаточно велико и оно сложно поддаётся словарной атаке, то суммарная энтропия случайных данных парольных фраз достаточно велика для создания криптографически стойкого ключа. Парольные фразы, как правило, пропускают через криптографическую хэш-функцию и уже её вывод используют в качестве криптостойкого ключа. @subsection Аппаратное шифрование Многие современные производители жёстких дисков предлагают аппаратно реализованное полнодисковое шифрование: Hitachi, Samsung, Seagate, Toshiba, Western Digital. Предлагаемые жёсткие диски отличаются от обычных накопителей наличием собственно самой схемы шифрования и памяти для хранения ключей шифрования. Преимущества аппаратных реализаций перед программными очевидны: @itemize @item высокая производительность, за счёт криптопроцессоров внутри накопителей; @item нередко использование памяти защищённой от вскрытия и прямого доступа для хранения ключей шифрования; @item полная прозрачность работы для пользователя (за исключением процесса разблокирования ключей шифрования). @end itemize Однако, рекомендовать подобные решения нельзя. К сожалению, практически все производители умалчивают о конкретной реализации режимов шифрования внутри их накопителей, а в реализациях, про которые хоть что-то известно, используется простой CBC режим с публичным вектором инициализации. Данная схема подвержена множеству атак. @subsection Вывод Полнодисковое шифрование, кроме обычных разделов с пользовательскими данными, может защитить как раздел подкачки (@strong{swap}), так и раздел с временными файлами. Это устраняет ряд возможных уязвимостей в безопасности операционной системы, связанных с человеческим фактором. Оно также эффективно используется как возможность моментального удаления информации, за счёт уничтожения всего-лишь ключа шифрования. Выбор метода шифрования это поиск компромисса между эффективностью и производительностью. Сергей Матвеев, руководитель отдела исследования и разработки ETegro Technologies. Отдельное спасибо за помощь в написании статьи: Андрею Сапронову, техническому директору ETegro Technologies.