LUKS



LUKS (от Linux Unified Key Setup) — спецификация формата шифрования дисков, изначально нацеленная на использование в ОС на основе ядра Linux. Первоочередной целью технологии было обеспечить удобный для пользователя стандартизированный способ управления ключами расшифровки. Одной из особенностей формата является поддержка нескольких ключей, используемых наравне друг с другом для доступа к одному зашифрованному носителю, с возможностью их добавления и изъятия по запросу пользователя.

Первая версия LUKS, названная впоследствии LUKS1, была разработана и реализована Клеменсом Фрувиртом в 2005 году на основе криптографической схемы TKS1, впервые описанной им годом ранее. В дальнейшем спецификация была доработана Миланом Брожем. В 2018 году М. Брож выпустил описание LUKS2 — расширения стандарта LUKS1 с поддержкой дополнительных возможностей — например, контроля целостности. На сегодняшний день этот документ имеет статус WIP («в работе»).

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

Эталонные реализации LUKS1 и LUKS2 существуют для Linux и доступны посредством утилиты cryptsetup. Использование подсистемы прозрачного шифрования дисков dm-crypt, встроенной в ядро Linux, лежит в основе реализации. Под Microsoft Windows зашифрованные LUKS1 носители могут использоваться с помощью программы FreeOTFE.

Теоретические основы

В работе «New Methods in Hard Disk Encryption» за 2005 год Фрувирт приводит анализ требований к криптосистеме, обеспечивающей удовлетворительную защищённость и производительность на широко используемом пользовательском оборудовании. По итогам этого анализа предлагается криптографическая схема «Template Key Setup 1», или TKS1, а также её модификация TKS2, оптимизированная для прикладной реализации и ставшая основой спецификации LUKS.

Иерархия ключей

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

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

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

Разделение секрета

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

Защита данных от восстановления

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

Постановка задачи

Задача минимизации вероятности восстановления массива данных (например, скомпрометированной копии мастер-ключа) после попытки его уничтожения сводится к построению особой «хрупкой» структуры данных, то есть такой, необратимое уничтожение любой малой части которой сильно снизит шансы на восстановление всех исходных данных.

Пусть D {displaystyle D} — информация, для которой требуется возможность необратимого уничтожения, S {displaystyle S} — структура данных, состоящая из n {displaystyle n} блоков s 1 , … , s i , … , s n {displaystyle s_{1},ldots ,s_{i},ldots ,s_{n}} . Пусть D {displaystyle D} принимает значения из D {displaystyle mathbb {D} } , s i {displaystyle s_{i}} — из S {displaystyle mathbb {S} } для всех i ∈ 1 , … , n {displaystyle iin 1,ldots ,n} . Тогда должна существовать функция S {displaystyle {mathfrak {S}}} , D → S n {displaystyle mathbb {D} o mathbb {S} ^{n}} , строящая S {displaystyle S} по D {displaystyle D} , и функция D {displaystyle {mathfrak {D}}} , S n → D {displaystyle mathbb {S} ^{n} o mathbb {D} } , восстанавливающая D {displaystyle D} . Тогда требуется, чтобы восстановить D {displaystyle D} было невозможно при порче хотя бы одного s i {displaystyle s_{i}} из составляющих S {displaystyle S} , иными словами, P [ D ( s 1 , … , s i − 1 , x , s i + 1 , … , s n ) = D ] = 1 | D | {displaystyle P[{mathfrak {D}}(s_{1},ldots ,s_{i-1},x,s_{i+1},ldots ,s_{n})=D]={frac {1}{|mathbb {D} |}}} для всех s 1 , … , s i − 1 , s i + 1 , … ∈ S {displaystyle s_{1},ldots ,s_{i-1},s_{i+1},ldots in mathbb {S} } и всех i ∈ 1 , … , n {displaystyle iin 1,ldots ,n} . Любое D {displaystyle D} может быть получено с одинаковой вероятностью, когда хотя бы одного s i {displaystyle s_{i}} не хватает. Проще говоря, D {displaystyle D} сильно зависит от каждого аргумента D {displaystyle {mathfrak {D}}} .

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

Решение

Простая схема создания подобной зависимости может быть такой: для структуры данных S = s 1 , s 2 , … , s n {displaystyle S=s_{1},s_{2},ldots ,s_{n}} сгенерировать блоки s 1 , … , s n − 1 {displaystyle s_{1},ldots ,s_{n-1}} случайных данных и вычислить s n = s 1 ⊕ ⋯ ⊕ s n − 1 ⊕ D {displaystyle s_{n}=s_{1}oplus cdots oplus s_{n-1}oplus D} . Тогда восстановление можно произвести как D = ⨁ i = 1 n s i {displaystyle D=igoplus _{i=1}^{n}s_{i}} При этом невосстановимое уничтожение хотя бы одного блока приводит к невосстановимости исходной информации. Эту конструкцию можно рассматривать как вариант схемы Шамира, за тем исключением, что все части секрета хранятся в одном месте.

Улучшить эту схему можно внеся элемент побитовой диффузии в цепь XOR-ов. Тогда даже частичная порча любого элемента s i {displaystyle s_{i}} в объёме одного или нескольких бит значительно повлияет на результат восстановления. Для этого можно использовать некоторую криптографическую хеш-функцию H {displaystyle H} . Пусть s 1 , … , s n − 1 {displaystyle s_{1},ldots ,s_{n-1}} — блоки случайных данных, тогда нужно вычислить цепь хеш-значений: q 1 = s 1 {displaystyle q_{1}=s_{1}} , q i = H ( q i − 1 ) ⊕ s i {displaystyle q_{i}=H(q_{i-1})oplus s_{i}} , а s n {displaystyle s_{n}} вычислить как s n = q n − 1 ⊕ D {displaystyle s_{n}=q_{n-1}oplus D} . Cоответственно, для восстановления D {displaystyle D} снова высчитывается цепь хеш-значений и D = q n − 1 ⊕ s n {displaystyle D=q_{n-1}oplus s_{n}}

Этот алгоритм хранения данных называется AFSplitter и используется в криптосхеме TKS1 для хранения зашифрованных пользовательскими ключами копий мастер-ключа.

Защита от полного перебора

Как часть защиты от brute force атак на пароли, сгенерированные пользователем и, как правило, обладающие низкой энтропией, в схеме TKS1 для получения пользовательского ключа из пароля используется стандарт PBKDF2, позволяющий увеличить затраты на перебор, не снижая производительности при обычном использовании.

TKS1 и TKS2

Итоговая последовательность действий, выполняемая по схеме TKS1, чтобы получить доступ к зашифрованному носителю:

  • Из хранилища ключей считываются параметры PBKDF2: соль, количество итераций;
  • Оттуда же считывается обработанный AFSplitter’ом ключ, представляющий собой зашифрованный пользовательским ключом мастер-ключ. Он помещается в память после обработки обратным алгоритмом AFMerge;
  • Запрашивается пароль у пользователя;
  • С помощью пароля и считанных ранее параметров с помощью PBKDF2 выводится ключ шифрования мастер-ключа;
  • Мастер-ключ расшифровывается полученным ключом и помещается в память;
  • Инициализируется потоковый шифр с помощью мастер-ключа для осуществления доступа к данным;
  • Копия незашифрованного мастер-ключа стирается из памяти.

TKS2 аналогична TKS1 во всех отношениях, кроме того, что хранимая копия мастер-ключа сначала обрабатывается AFSplitter-ом, а затем шифруется пользовательским ключом. Таким образом при расшифровке сначала полученым из PBKDF2 ключом расшифровывается хранимая структура данных, затем обрабатывается AFMerge для получения итогового пользовательского ключа. Такая схема лучше подходит для реализации прозрачного шифрования, и именно она легла в основу стандарта LUKS 1.0..

Формат LUKS

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

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

Кроме того, среди преимуществ LUKS указывается обеспечение совместимости через стандартизацию и свободная лицензия (GNU GPL).

Структура раздела

Раздел LUKS1 состоит из следующих частей:

  • Заголовок LUKS;
  • Хранилища содержимого ключей KM1 — KM8;
  • Зашифрованные данные.
+-------------+-------+-------+-------+-------+-----------------+ | LUKS phdr | KM1 | KM2 | ... | KM8 | bulk data | +-------------+-------+-------+-------+-------+-----------------+

Заголовок

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

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

Каждый из 8 слотов ключей в phdr соответствует одной секции содержимого ключа и содержит следующую информацию: