LUKS – Слишком большой размер отстегнутого заголовка при большом смещении

Вопрос или проблема

Я считаю, что cryptsetup имеет непоследовательный способ работы с заголовками, мне хочется назвать это ошибкой
Я хотел бы добиться очень большого смещения LUKS, не получая при этом очень громоздкий отсоединенный заголовок
Вот что я пробовал:

$ cryptsetup --version
cryptsetup 2.2.0

$ # Сначала установим размер заголовка по умолчанию 
$ cryptsetup --header header_default luksFormat /dev/sdc
$ stat -c '%s' header_default
16777216
$ # это ровно 16 Миб

$ # Теперь я попробую с нулевым смещением
$ cryptsetup --header header_0 --offset 0 luksFormat /dev/sdc
$ stat -c '%s' header_0
16777216
$ # очень хорошо, все необходимые данные все еще хранятся в заголовке размером 16 Миб

$ # Давайте посмотрим, что произойдет с очень маленьким смещением 1 Миб
$ cryptsetup --header header_1MiB --offset $((2**11)) luksFormat /dev/sdc
WARNING: ключевые области (1015808 байтов) слишком малы, доступное количество ключевых слотов LUKS2 очень ограничено.
$ stat -c '%s' header_1MiB
1048576
$ # размер заголовка очень мал, точно соответствует заданному смещению, но у меня есть предупреждение
$ # Я хотел бы, чтобы я мог установить любое смещение по своему усмотрению, не получая отсоединенный заголовок с ограничениями 

$ # Давайте попробуем снова с несколько большим смещением 4 Миб
$ cryptsetup --header header_4MiB --offset $((2**11*4)) luksFormat /dev/sdc
$ stat -c '%s' header_4MiB
4194304
$ # снова размер заголовка точно соответствует заданному смещению, cryptsetup завершился без ошибок или предупреждений
$ # кажется, что правильный заголовок может быть достигнут с размером меньше, чем размер по умолчанию

$ # Теперь давайте попробуем с очень большим смещением
$ cryptsetup --header header_1GiB --offset $((2**21)) luksFormat /dev/sdc
$ stat -c '%s' header_1GiB
1073741824
$ # снова размер заголовка точно соответствует заданному смещению
$ # проблема в том, что файл заголовка слишком неразумно громоздкий!

$ # Давайте попробуем что-то другое
$ cryptsetup --header-backup-file header_1GiB_backup luksHeaderBackup header_1GiB
$ stat -c '%s' header_1GiB_backup
134250496
$ # header_1GiB_backup чуть больше 128 Миб, точно "$((2**15*4097))"

$ # Давайте посмотрим, в чем разница между header_1GiB и header_1GiB_backup
$ cmp header_1GiB header_1GiB_backup
cmp: EOF на header_1GiB_backup после байта 134250496, в строке 523167
$ xxd -s $((134250496-16)) header_1GiB | head -n2
08007ff0: 9d3a e917 4327 f9e5 6dfb bdcb 3890 6168  .:..C'..m...8.ah
08008000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
$ xxd -p -s 134250496 header_1GiB | { grep '[^0]' || echo 'найдены только нулевые байты'; }
найдены только нулевые байты
$ # Как я и подозревал:  header_1GiB  =  header_1GiB_backup дополненный нулями
$ # Я пробовал 'luksHeaderBackup' другие большие заголовки, полученный размер всегда одинаков: 134250496 байт

$ # Другие заголовки дополнены нулями? Давайте посмотрим
$ tail -c 32 header_* | cat --show-nonprinting
==> header_0 <==
M-NM-^WM-PM-0M-LM-`M-^^BM-;M-,JM-+M-dM-:g1UM-/`M-"^Con header_1GiB <==
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
==> header_1GiB_backup <==
QM-^HM-^CM-^XM-i^_M-*GM-x~KM-i'M-^NM-^G]M-^]:M-i^WC'M-yM-emM-{M-=M-K8M-^Pah
==> header_1MiB <==
sM-KM-&=`~^FM-^PM-'M-G(AM-jM-_M-&l~>WM-^ZM-a^_M-^^M-qhs^R)M-2M-TM-eS
==> header_4MiB <==
~^@KM--F^U^[M-dM-_M-<M-;^FM-/M-^MM-'M-^\M-m?M-\dM-"M-^DM-sM-fEM-C^WeM-GTM-\M-^[
==> header_default <==
UM-_V
M-^^+M-z3M-^M-\M-*pM-jM-\M-^@"M-}|^OM-0M-6M-FM-DM-NM-b^ZM-!M-IM-^KM-^MR[
$ # Только 'header_1GiB' дополнен нулями, все остальные, как я полагаю, дополнены случайными байтами

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

# losetup --offset 1GiB /dev/loop0 /dev/sdc
# cryptsetup --header header_1GiB --offset $((2**21)) luksFormat /dev/loop0

Размер заголовка будет 16777216 байт.

https://gitlab.com/cryptsetup/cryptsetup/-/issues/452

Ответ или решение

Решение проблемы: "LUKS - Слишком большой размер отсоединенного заголовка при большом смещении"

Введение

Системы шифрования на основе LUKS (Linux Unified Key Setup) становятся всё более популярными среди пользователей, стремящихся защитить свои данные. Однако, как показывает практика, работа с заголовками LUKS может быть не такой простой, как хотелось бы. Эта статья подробно рассматривает ошибку, с которой сталкиваются пользователи, желающие установить большое смещение, но обнаруживающие при этом слишком большой размер отсоединенного заголовка. Мы рассмотрим пример, проведем анализ и предложим оптимальные решения.

Проблема

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

  • При запуске команды cryptsetup --header header_1GiB --offset $((2**21)) luksFormat /dev/sdc, размер заголовка составляет 1 ГБ, что является чрезмерным для хранения необходимой информации о шифровании.
  • В то же время, при меньших смещениях, таких как 1 МБ или 4 МБ, размер заголовка уменьшался пропорционально, что указывает на определённые ограничения и поведение утилиты.

Анализ

Из предоставленного примера видно, что:

  1. Размер заголовка:

    • При нулевом смещении и малом смещении (до 4 МБ) размер заголовка соответствует стандартному размеру 16 МБ или меньше.
    • При значительном смещении (например, 1 ГБ) размер заголовка взрывается до 1 ГБ, несмотря на то, что для хранения ключевой информации достаточно меньшего объёма.
  2. Предупреждения:

    • Утилита cryptsetup выдает предупреждения о недостаточном размере области для ключевых слотов, что может вызвать дополнительные ограничения на количество доступных ключей, если вы попытаетесь использовать слишком малый заголовок.
  3. Проблемы с согласованностью:

    • Разные размеры заголовка при различных смещениях указывают на потенциальные проблемы с управлением заголовками и несоответствие их размеров из-за модуляции внутри системы. Например, заголовок, созданный с помощью luksHeaderBackup, оказывается меньше в сравнении с заголовками, созданными непосредственно с заданным смещением.

Решения

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

  1. Использовать стандартный размер заголовка:

    • При создании заголовка LUKS с использованием больших смещений, рекомендуется использовать стандартный размер заголовка (16 МБ) вне зависимости от смещения. Это обеспечит достаточный объём для хранения ключевой информации, а также избежит избыточной сложности и ненужного увеличения размера.
  2. Создание дополнительного монитора:

    • Используйте опцию --header-backup-file, чтобы создать резервную копию заголовка. Однако следите за размером создаваемого файла, так как это может привести к созданию избыточных данных.
  3. Обратиться к документации и сообществу:

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

Заключение

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

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

Оцените материал
Добавить комментарий

Капча загружается...