encryption
August 21, 2023
Шифрование диска Linux с помощью TPM2
Обязательные условия:
- Наличие модуля TPM2 на материнской плате
- Использование SecureBoot
- Использование LUKS шифрования при установке системы
- Пароль BIOS, SecureBoot, LVM и пароль от учетной записи в системе должны отличаться (для безопасности)
Этапы настройки:
- Устанавливаем пароль доступа в BIOS
- Включаем SecureBoot
BIOS → Security → Secure Boot → Secure Boot [Enabled] (active), ................................Secure Boot mode [Standard]
- Проверяем доступность модуля
TPM2: BIOS → Advanced → Trusted Computing → Security Device Support [Enable], ......................................SHA256 PCR Bank [Enabled], ......................................Device select [auto]
- Устанавливаем ОС Ubuntu 22.04.3 (актуально на 15 августа 2023)
- На этапе установки "Updates and other software" обязательно включаем пароль в SecureBoot
- На шаге "Installation type" Включаем LVM + Encrypt
- На следующем шаге вводим пароль для шифрования LVM диска.
- Далее проводим стандартную установку системы.
- После установки при первом включении нужно выбрать Continue boot
- После установки ОС обновляем все пакеты
sudo apt update && sudo apt upgrade -y
- Устанавливаем недостающие пакеты:
Сначала ставим openssh-server и потом можно копипастить все остальное уже через терминал по sshsudo apt install -y openssh-server sudo apt install -y clevis clevis-tpm2 clevis-luks clevis-dracut
- Предварительно cоздадим резервную копию LUKS-заголовка на случай возникновения каких-либо проблем в будущем:
sudo cryptsetup luksHeaderBackup /dev/nvme0n1p3 --header-backup-file ~/header-nvme0n1p3.img # сделать бэкап заголовков
Данный файл следует надёжно хранить в безопасном месте на другом носителе. Внутри него находится LUKS заголовок с включением всех созданных ключевых слотов и соответствующих им ключей шифрования. Его восстановление позволит откатить все произведённые ниже изменения. - Сгенерируем ключевую пару внутри 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: Содержит измерения, связанные с процессом загрузки, включая загрузчики, файлы конфигурации и компоненты для конкретных платформ.
- Проверим, появился ли пункт clevis в списке доступных слотов:
sudo cryptsetup luksDump /dev/nvme0n1p3 Вывод команды: ... ... Tokens: 0: clevis Keyslot: 1 ... ... Если видим подобный вывод, значит токен добавился.
Для сведения: при необходимости можно добавлять несколько таких токенов, они будут пронумерованы по порядку кейслотами начиная с Keyslot: 1, так же можно удалить кейслот командой:sudo clevis luks unbind -d /dev/nvme0n1p3 -s 1 # ВНИМАНИЕ! эта команда УДАЛЯЕТ добавленный токен
- При успешном добавлении токена пересоздаем образ initrd ядра, который будет включать в себя модуль работы с TPM для ранней стадии загрузки системы:
sudo dracut -f
# при изменении\добавлении новых токенов снова запускать dracut не требуется - Перезагружаем систему:
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