encryption
August 21, 2023

Шифрование диска Linux с помощью TPM2

Обязательные условия:

  • Наличие модуля TPM2 на материнской плате
  • Использование SecureBoot
  • Использование LUKS шифрования при установке системы
  • Пароль BIOS, SecureBoot, LVM и пароль от учетной записи в системе должны отличаться (для безопасности)

Этапы настройки:

  1. Устанавливаем пароль доступа в BIOS
  2. Включаем SecureBoot
    BIOS → Security → Secure Boot → Secure Boot [Enabled] (active), ................................Secure Boot mode [Standard]
  3. Проверяем доступность модуляTPM2: BIOS → Advanced → Trusted Computing → Security Device Support [Enable], ......................................SHA256 PCR Bank [Enabled], ......................................Device select [auto]
  4. Устанавливаем ОС Ubuntu 22.04.3 (актуально на 15 августа 2023)
  5. На этапе установки "Updates and other software" обязательно включаем пароль в SecureBoot
  6. На шаге "Installation type" Включаем LVM + Encrypt
  7. На следующем шаге вводим пароль для шифрования LVM диска.
  8. Далее проводим стандартную установку системы.
  9. После установки при первом включении нужно выбрать Continue boot
  10. После установки ОС обновляем все пакеты
    sudo apt update && sudo apt upgrade -y
  11. Устанавливаем недостающие пакеты:
    Сначала ставим openssh-server и потом можно копипастить все остальное уже через терминал по ssh
    sudo apt install -y openssh-server sudo apt install -y clevis clevis-tpm2 clevis-luks clevis-dracut
  12. Предварительно cоздадим резервную копию LUKS-заголовка на случай возникновения каких-либо проблем в будущем:
    sudo cryptsetup luksHeaderBackup /dev/nvme0n1p3 --header-backup-file ~/header-nvme0n1p3.img # сделать бэкап заголовков
    Данный файл следует надёжно хранить в безопасном месте на другом носителе. Внутри него находится LUKS заголовок с включением всех созданных ключевых слотов и соответствующих им ключей шифрования. Его восстановление позволит откатить все произведённые ниже изменения.
  13. Сгенерируем ключевую пару внутри TPM, "pcr_bank":"sha256" и "pcr_ids":"0,1" и привяжем её к зашифрованному разделу:
    sudo clevis luks bind -d /dev/nvme0n1p3 tpm2 '{"pcr_bank":"sha256","pcr_ids":"0,1"}'
    # /dev/nvme0n1p3 - наш зашифрованный раздел, можно посмотреть через lsblk

    На ошибку:
    Warning: Value 512 is outside of the allowed entropy range, adjusting it. можно не обращать внимания

    Вот краткий обзор наиболее часто используемых идентификаторов PCR:
    • PCR 0: Содержит измерения, связанные с прошивкой, включая поставщика прошивки, версию и дату выпуска.
    • PCR 1: Содержит измерения, связанные с конфигурацией платформы, включая тип и производителя аппаратной платформы.
    • PCR 2: Содержит измерения, связанные с конфигурацией загрузчика, включая версию загрузчика и параметры конфигурации.
    • PCR 3: Содержит измерения, связанные с конфигурацией ядра, включая версию ядра и параметры конфигурации.
    • PCR 4: Содержит измерения, относящиеся к начальному виртуальному диску (initrd), который используется для загрузки ядра.
    • PCR 5-7: Содержит измерения, связанные с процессом загрузки, включая загрузчики, файлы конфигурации и компоненты для конкретных платформ.
  14. Проверим, появился ли пункт clevis в списке доступных слотов:
    sudo cryptsetup luksDump /dev/nvme0n1p3  Вывод команды: ... ... Tokens: 0: clevis Keyslot: 1 ... ... Если видим подобный вывод, значит токен добавился.
    Для сведения: при необходимости  можно добавлять несколько таких токенов, они будут пронумерованы по порядку кейслотами начиная с Keyslot: 1, так же можно удалить кейслот командой:
    sudo clevis luks unbind -d /dev/nvme0n1p3 -s 1 # ВНИМАНИЕ! эта команда УДАЛЯЕТ добавленный токен
  15. При успешном добавлении токена пересоздаем образ initrd ядра, который будет включать в себя модуль работы с TPM для ранней стадии загрузки системы:
    sudo dracut -f # при изменении\добавлении новых токенов снова запускать dracut не требуется
  16. Перезагружаем систему:
    sudo systemctl reboot
    После этого при включении будет выполнен запрос на ввод пароля, а Clevis подставит пин разблокировки из модуля TPM

Примечания:

sudo tpm2_pcrread # Отобразить PCR значения из модуля TPM

Авторизация от TPM происходит примерно на 24 секунде, полная загрузка ОС на 34 секунде

Решение проблем:

  • При сбросе BIOS или при попытке подключить другой SSD к материнке - настроки будут сбиты.
  • Если подключить флешку и перезагрузиться - потребуется пароль. После отключения флешки снова загрузится стандартно.
  • Для восстановления работоспособности нужно вернуть SecureBoot в режим Active (Standard) и проверить загрузку.
  • Если LUKS не расшифровывается, то  удаляем существующий токен командой:
    sudo clevis luks unbind -d /dev/nvme0n1p3 -s 1 
    и затем повторяем шаги 13, 14.

Источники:

https://www.easycoding.org/2019/09/24/avtomaticheski-razblokiruem-luks-diski-pri-pomoshhi-tpm.html
https://techjungle.gitlab.io/post/binding_luks_with_tpm/
https://github.com/latchset/clevis