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

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

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

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

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

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

Иерархия ключей править

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

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

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

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

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

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

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

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

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

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

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

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

Решение править

Простая схема создания подобной зависимости может быть такой: для структуры данных   сгенерировать блоки   случайных данных и вычислить  . Тогда восстановление можно произвести как   При этом невосстановимое уничтожение хотя бы одного блока приводит к невосстановимости исходной информации. Эту конструкцию можно рассматривать как вариант схемы Шамира, за тем исключением, что все части секрета хранятся в одном месте.[7]

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

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

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

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

TKS1 и TKS2 править

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

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

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

Формат LUKS править

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

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

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

Структура раздела править

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

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

Заголовок править

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

magic сигнатура заголовка раздела LUKS
version версия LUKS
cipher-name название шифра
cipher-mode параметры шифра
hash-spec хеш, используемый в режиме HMAC для всех операций PBKDF2
payload-offset смещение начала зашифрованных данных (в секторах)
key-bytes размер ключа в байтах
mk-digest контрольная сумма мастер-ключа
mk-digest-salt соль, применяемая в PBKDF2
mk-digest-iter количество итераций PBKDF2
uuid UUID раздела
key-slot-1 слот ключа 1
key-slot-2 слот ключа 2
key-slot-8 слот ключа 8

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

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

active состояние слота (включён/выключен)
iterations количество итераций PBKDF2
salt соль для PBKDF2
key-material-offset смещение начала секции содержимого ключа
stripes количество полос для защиты от восстановления

Примечания править

  1. 1 2 3 4 5 6 LUKS1 On-Disk Format Specification Version 1.2.3, Clemens Fruhwirth 2018
  2. LUKS2 On-Disk Format Specification Version 1.0.0, Milan Brož 2018
  3. 1 2 3 4 5 6 7 Aus Linux Magazin, № 10 2006 [1] Архивная копия от 12 октября 2019 на Wayback Machine
  4. LUKS/cryptsetup official website, [2] Архивная копия от 7 апреля 2015 на Wayback Machine
  5. 1 2 3 4 5 6 7 8 9 10 11 12 New Methods in Hard Disk Encryption, Clemens Fruhwirth 2005
  6. What users should know about Full Disk Encryption based on LUKS; Simone Bossi, Andrea Visconti, Universit`a degli Studi di Milano[3] Архивная копия от 6 мая 2021 на Wayback Machine
  7. 1 2 Adi Shamir, How To Share A Secret (MIT, 1979)[4] Архивная копия от 2 февраля 2020 на Wayback Machine
  8. 1 2 3 4 Security Analysis of Cryptsetup/LUKS, Ubuntu Team, 2012[5] Архивная копия от 26 июня 2021 на Wayback Machine
  9. Implementation and Performance Analysis of PBKDF2, Bcrypt, Scrypt Algorithms[6] Архивная копия от 25 декабря 2019 на Wayback Machine

Ссылки править