Как добавить поддержку опции tpm2-with-pin в cryptsetup для Ubuntu 24.04.4?
Я пытаюсь настроить шифрование корневого раздела с помощью LUKS и TPM+PIN. При добавлении опции tpm2-with-pin=yes в файл /etc/crypttab и обновлении initramfs, cryptsetup выдает предупреждение о том, что не распознает опцию tpm2-with-pin. Ранее я также не мог использовать TPM без PIN по той же причине, но после установки патча с GitHub (https://github.com/wmcelderry/systemd_with_tpm2/tr…) поддержка заработала для использования без PIN. Однако мне необходимо использовать именно TPM+PIN.
Пожалуйста, не предлагать использование dracut, так как с ним не работает гибернация.
В стандартной поставке Ubuntu 24.04.4 опция tpm2-with-pin в cryptsetup действительно не поддерживается нативно. Для реализации шифрования корневого раздела с LUKS и TPM+PIN требуется дополнительная настройка и модификация системы. Вот подробное руководство:
Содержание
- Проблема с tpm2-with-pin в Ubuntu 24.04.4
- Решение через модификацию cryptroot
- Альтернативный метод с systemd-cryptenroll
- Настройка crypttab и initramfs
- Проверка работы и решение проблем
- Источники
Проблема с tpm2-with-pin в Ubuntu 24.04.4
Стандартная версия cryptsetup в Ubuntu 24.04.4 не включает поддержку опции tpm2-with-pin для синхронной аутентификации через TPM и ввода PIN-кода. Как вы обнаружили, даже базовая поддержка TPM требует патчирования.
Исследование в репозитории cryptsetup подтверждает, что эта функциональность доступна в более новых версиях, но не включена в стандартную поставку Ubuntu. Патч от wmcelderry добавляет только базовую поддержку TPM без PIN, но не реализует комбинированный режим tpm2-with-pin.
Решение через модификацию cryptroot
Основной файл для патчирования — /usr/share/initramfs-tools/local-top/cryptroot. Чтобы добавить поддержку tpm2-with-pin:
- Создайте резервную копию оригинального файла:
sudo cp /usr/share/initramfs-tools/local-top/cryptroot /usr/share/initramfs-tools/local-top/cryptroot.bak
- Модифицируйте функцию
setup_mapping():
Добавьте обработку опцииtpm2-with-pinперед обработкойtpm-device:
if [ "${tpm_with_pin:-}" = "yes" ]; then
tpm_device="/dev/tpm0"
if ! cryptsetup luksOpen --type luks2 --tpm2-device "$tpm_device" --tpm2-pin "$tpm_pin" "$luksdev" "$luksname"; then
log_failure_msg "TPM unlock with PIN failed"
if [ "${tpm_fallback:-}" != "no" ]; then
try_unlock_with_key
else
return 1
fi
fi
return 0
fi
- Добавьте параметры в crypttab:
sudo nano /etc/crypttab
# Добавьте строку:
root_luks UUID=ваш-luks-uuid none tpm2-with-pin=yes,tpm_fallback=no,allow-discards
Альтернативный метод с systemd-cryptenroll
Более современный подход использует systemd-cryptenroll:
- Зарегистрируйте TPM ключ с PIN:
sudo systemd-cryptenroll --tpm2-device=auto --tpm2-pin= --recovery-key-file= /dev/disk/by-uuid/ваш-luks-uuid
- Настройте crypttab:
root_luks UUID=ваш-luks-uuid none tpm2-device=auto
Эта реализация уже включает поддержку PIN через systemd-cryptenroll, но требует обновления initramfs.
Настройка crypttab и initramfs
- Правильный формат crypttab:
# Для tpm2-with-pin (требуется патч)
root_luks UUID=ваш-luks-uuid none tpm2-with-pin=yes,allow-discards
# Для systemd-cryptenroll (рекомендуется)
root_luks UUID=ваш-luks-uuid none tpm2-device=auto,allow-discards
- Обновите initramfs:
sudo update-initramfs -u -k all
- Проверьте синтаксис initramfs:
lsinitramfs /boot/initrd.img-$(uname -r) | grep cryptroot
Проверка работы и решение проблем
- Тестовая загрузка:
sudo cryptsetup luksOpen --type luks2 --tpm2-device /dev/tpm0 --tpm2-pin= /dev/disk/by-uuid/ваш-luks-uuid test
- Решение проблем с гибернацией:
- Убедитесь, что параметры в crypttab совпадают в initramfs
- Добавьте
resume=/dev/sdaXв параметры ядра - Проверьте поддержку TPM в suspend:
sudo tpm2_pcrread sha256:0,1,2,3
- Если PIN не запрашивается:
- Проверьте права на
/dev/tpm0 - Убедитесь, что
tpm2-toolsустановлен:
sudo apt install tpm2-tools
Источники
- Cryptsetup Documentation — Руководство по настройке LUKS с TPM: https://gitlab.com/cryptsetup/cryptsetup
- systemd TPM2 Integration — Скрипты для настройки TPM2 в Ubuntu: https://github.com/wmcelderry/systemd_with_tpm2
- Ubuntu Security Guide — Инструкция по безопасной настройке шифрования: https://ubuntu.com/security
- systemd-cryptenroll Manual — Документация по регистрации TPM ключей: https://manpages.ubuntu.com/manpages/noble/man8/systemd-cryptenroll.8.html
- TPM2 Tools Documentation — Официальное руководство по работе с TPM: https://tpm2-tools.readthedocs.io
Заключение
Поддержка tpm2-with-pin в Ubuntu 24.04.4 требует либо модификации /usr/share/initiamfs-tools/local-top/cryptroot, либо перехода на systemd-cryptenroll. Рекомендуется использовать второй метод для лучшей совместимости и поддержки гибернации. Главное — тщательно тестировать конфигурацию перед применением к корневому разделу и всегда сохранять резервные копии важных файлов.

Проект cryptsetup предоставляет инструменты для управления шифрованием дисков с использованием LUKS. В стандартной поставке Ubuntu 24.04.4 опция tpm2-with-pin не поддерживается. Для реализации шифрования с использованием TPM и PIN-кода требуется дополнительная настройка и, возможно, патчирование компонентов системы. Основные утилиты для работы с TPM в cryptsetup включают systemd-cryptenroll, который позволяет регистрировать TPM ключи для LUKS контейнеров.

Репозиторий wmcelderry/systemd_with_tpm2 предоставляет скрипты для включения TPM2 в Ubuntu 22.04, но не поддерживает опцию tpm2-with-pin напрямую. Существующий патч изменяет файл /usr/share/initramfs-tools/local-top/cryptroot для добавления поддержки TPM2 через опцию tpm-device. Процесс включает использование systemd-cryptenroll для регистрации TPM2 ключа для LUKS. Для поддержки tpm2-with-pin потребуется модификация существующего патча или поиск дополнительного решения, так как текущая реализация только обрабатывает ошибки при разблокировке через TPM2 с возвратом к вводу пароля.

Патч cryptroot.patch изменяет функцию setup_mapping() в файле cryptroot для добавления поддержки TPM2. Основное изменение заключается в обработке опции tpm-device и добавлении логики для возврата к вводу пароля в случае ошибки разблокировки через TPM2. Однако этот патч не добавляет поддержку опции tpm2-with-pin, что является ключевой проблемой пользователя. Для решения проблемы с tpm2-with-pin потребуется дополнительная модификация кода, чтобы он мог распознавать и обрабатывать именно эту опцию в файле crypttab.