Шифрование файловых систем [331.3]

Рейтинг: 65.7% · 17 голосов
Специализация LPIC-3 303 (v3.0): криптография и PKI/X.509, шифрование ФС (LUKS/TPM2/Clevis), DNSSEC, hardening хоста, IDS, контроль доступа (SELinux/AppArmor), сетевая безопасность, nftables, VPN, пентест.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

Шифрование файловых систем [331.3]

Сообщение Sergey_Sysadmin »

Оглавление курса (16)
  1. Введение в LPIC-3 303: безопасность Linux
  2. X.509 и инфраструктура открытых ключей [331.1]
  3. X.509 для шифрования, подписи и аутентификации [331.2]
  4. Шифрование файловых систем [331.3] (вы здесь)
  5. DNS и криптография [331.4]
  6. Усиление защиты хоста [332.1]
  7. Урок 6. Обнаружение вторжений на хосте: AIDE, auditd, сканеры руткитов и OpenSCAP
  8. Контроль ресурсов [332.3]
  9. Дискреционный контроль доступа: ACL и атрибуты [333.1]
  10. Мандатный контроль доступа: SELinux и AppArmor [333.2]
  11. Усиление сетевой защиты [334.1]
  12. Сетевое обнаружение вторжений
  13. Фильтрация пакетов [334.3]
  14. Виртуальные частные сети (VPN) [334.4]
  15. Уязвимости и угрозы [335.1]
  16. Основы тестирования на проникновение [335.2]
Урок 3. Шифрование файловых систем [331.3]

Потеря ноутбука или вывод диска из дата-центра не должны превращаться в утечку данных. Задача администратора - сделать так, чтобы блочное устройство без ключа выглядело как случайный шум, и при этом не убить удобство загрузки сервера. В этом уроке разберём LUKS2 как стандарт шифрования блочных устройств в Linux, научимся управлять ключевыми слотами через cryptsetup, опишем автомонтирование через /etc/crypttab, настроим автоматическую разблокировку без ручного ввода пароля через Clevis с привязкой к TPM2 и к сетевому серверу Tang (схема NBDE), зашифруем swap и кратко закроем eCryptfs как легаси.

Изображение

Как это работает

LUKS (Linux Unified Key Setup) - это не алгоритм шифрования, а формат заголовка и протокол управления ключами поверх dm-crypt. Сам dm-crypt прозрачно шифрует и расшифровывает блоки между виртуальным устройством /dev/mapper/имя и реальным разделом. Данные на диске шифруются мастер-ключом тома. Этот мастер-ключ никогда не вводится руками - он лежит в заголовке, зашифрованный вашей парольной фразой.

Ключевой приём - разделение мастер-ключа и пользовательских секретов. В заголовке есть несколько слотов (в LUKS2 их до 32). Каждый слот хранит свою копию мастер-ключа, обёрнутую отдельной парольной фразой или файлом-ключом. Поэтому можно дать разным людям разные пароли к одному тому, отозвать один из них и не трогать остальные, а главное - сменить пароль без перешифровки терабайтов: меняется только обёртка в слоте, а не сам мастер-ключ.

LUKS2 (формат по умолчанию с 2018 года и обязательный в RHEL начиная с 8) отличается от LUKS1 принципиально. Заголовок дублируется для устойчивости к повреждению, метаданные хранятся в JSON, а для защиты слотов от перебора используется Argon2id - memory-hard функция, которую трудно ускорить на GPU и ASIC. LUKS1 применял PBKDF2 и нужен лишь там, где загрузчик не умеет читать LUKS2 (старый GRUB на /boot).

NBDE (Network-Bound Disk Encryption) решает проблему серверов без человека у клавиатуры. Идея в том, что диск разблокируется автоматически, но только пока машина находится в доверенной сети. Демон Clevis при загрузке получает часть секрета от сервера Tang по сети (по протоколу McCallum-Relyea, при котором сам секрет по проводам не передаётся), собирает ключ и открывает том. Унесли диск из стойки - Tang недоступен - том не открывается. Альтернативная привязка - к чипу TPM2 на самой материнской плате: ключ освобождается, только если значения PCR (хеши состояния прошивки и загрузчика) совпадают с эталоном.

Команды и примеры

Создание тома LUKS2 и его открытие. Параметр --type luks2 в свежих дистрибутивах подразумевается по умолчанию, но указываем явно.

Код: Выделить всё

cryptsetup luksFormat --type luks2 \
  --cipher aes-xts-plain64 --key-size 512 \
  --pbkdf argon2id /dev/sdb1

cryptsetup open /dev/sdb1 secure_data
mkfs.ext4 /dev/mapper/secure_data
mount /dev/mapper/secure_data /mnt/secure
Управление слотами и просмотр заголовка. luksDump покажет занятые слоты, используемый PBKDF и токены Clevis.

Код: Выделить всё

cryptsetup luksDump /dev/sdb1
cryptsetup luksAddKey /dev/sdb1      # добавить пароль в новый слот
cryptsetup luksChangeKey /dev/sdb1   # сменить пароль в своём слоте
cryptsetup luksKillSlot /dev/sdb1 2  # отозвать слот 2
Установка пакетов различается по семействам. Debian 13 / Ubuntu 24.04:

Код: Выделить всё

apt install cryptsetup clevis clevis-luks clevis-tpm2 \
            clevis-initramfs tang
RHEL 10 / Fedora 41+:

Код: Выделить всё

dnf install cryptsetup clevis clevis-luks clevis-dracut tang
Привязка к TPM2 через нативный systemd-cryptenroll (современный путь, не требует Clevis для TPM). PCR 7 отвечает за состояние Secure Boot.

Код: Выделить всё

systemd-cryptenroll --tpm2-device=auto \
  --tpm2-pcrs=7 /dev/sdb1
Сетевая разблокировка через Clevis и Tang. На сервере Tang включаем сокет-юнит, на клиенте привязываем том к серверу:

Код: Выделить всё

systemctl enable --now tangd.socket
clevis luks bind -d /dev/sdb1 tang \
  '{"url":"http://tang.local"}'
Файл /etc/crypttab описывает тома, открываемые при загрузке. Поля: имя устройства mapper, источник (лучше по UUID), файл-ключ (none - спросить пароль), опции.

Код: Выделить всё

# name      source                    keyfile  options
secure_data UUID=xxxx-xxxx            none     luks,discard
swap        /dev/sdb2                 /dev/urandom  swap,cipher=aes-xts-plain64,size=512
После правки crypttab и fstab обязательно пересоберите initramfs, иначе при загрузке система не узнает про новый том. Debian/Ubuntu - update-initramfs -u, RHEL/Fedora - dracut -f.

Шифрованный swap имеет два режима. Если swap не нужен для гибернации, удобнее эфемерный ключ из /dev/urandom (строка выше) - при каждой загрузке новый случайный ключ, ничего хранить не надо. Если нужна гибернация, swap должен быть постоянным LUKS-томом с сохраняемым ключом.

Частые грабли
  • Забыли пересобрать initramfs после изменения crypttab - система зависает на ранней загрузке и просит пароль от тома, которого initramfs не знает.
  • Указали в crypttab /dev/sdb1 вместо UUID. После добавления диска буквы устройств съезжают, и шифрованный том ищется не там.
  • Привязка TPM2 только к PCR 7 ломается после штатного обновления загрузчика или прошивки UEFI - значения PCR меняются, ключ не освобождается. Держите запасную парольную фразу в отдельном слоте всегда.
  • Один сервер Tang - единственная точка отказа. Делайте sss-привязку Clevis с порогом (например, 1 из 2 серверов Tang плюс TPM), иначе падение Tang заблокирует загрузку всего парка.
  • Tang по голому http внутри доверенного сегмента допустим, но ротацию ключей сервера (tang-show-keys, ротация в /var/db/tang) забывают - скомпрометированный старый ключ остаётся валидным.
  • eCryptfs (шифрование на уровне каталога, ecryptfs-utils) в 2026 считается устаревшим и в Ubuntu вынесен в отдельный пакет. Для новых систем используйте LUKS на блочном уровне или fscrypt; eCryptfs учите только для экзамена и миграции старых home-каталогов.
  • После luksKillSlot нет undo. Перед отзывом слота убедитесь, что хотя бы один рабочий секрет остаётся, иначе том станет нечитаемым навсегда.
Мини-лаба
  • Создайте файл-образ на 200 МБ (dd if=/dev/zero of=/root/vault.img bs=1M count=200) и подключите его как loop-устройство через losetup.
  • Отформатируйте loop в LUKS2 с argon2id, откройте как vault, создайте ext4 и смонтируйте.
  • Добавьте второй пароль через luksAddKey, посмотрите два занятых слота в luksDump, затем отзовите второй слот через luksKillSlot.
  • Если есть TPM2 (или виртуальный swtpm), привяжите том через systemd-cryptenroll к PCR 7 и проверьте появление токена в luksDump.
  • Поднимите tangd.socket локально и выполните clevis luks bind к http://localhost, убедитесь, что в заголовке появился токен Clevis.
  • Пропишите том в /etc/crypttab по UUID, пересоберите initramfs нужной для вашего дистрибутива командой и перезагрузитесь, проверив автооткрытие.
  • Настройте эфемерный шифрованный swap через /dev/urandom и подтвердите его работу командой swapon --show.
Контрольные вопросы
  • Почему смена парольной фразы LUKS происходит мгновенно даже на многотерабайтном томе, и что именно при этом изменяется в заголовке?
  • Чем Argon2id в LUKS2 предпочтительнее PBKDF2 из LUKS1 с точки зрения защиты от перебора?
  • Как протокол Tang позволяет разблокировать диск, не передавая сам ключ по сети, и что мешает атакующему открыть унесённый из стойки диск?
  • Какие риски несёт привязка тома исключительно к PCR 7 и как от них застраховаться?
  • В каких случаях для swap корректно использовать ключ из /dev/urandom, а когда нужен постоянный ключ?
  • Почему изменение /etc/crypttab без пересборки initramfs приводит к сбою загрузки и какими командами это исправляется в Debian и в RHEL?
👍5 ❤️1 🔥 😄 🤔3
Аватара пользователя
rossk1
Сообщения: 1
Зарегистрирован: 14 май 2026, 03:35

Re: Шифрование файловых систем [331.3]

Сообщение rossk1 »

А если TPM привязать к PCR 7, а потом прилетит обновление shim - том же перестанет открываться? Получается каждый раз после апдейта загрузчика руками перепривязывать?
👍1 ❤️1 🔥 😄 🤔
Аватара пользователя
larry45
Сообщения: 1
Зарегистрирован: 12 май 2026, 19:52

Re: Шифрование файловых систем [331.3]

Сообщение larry45 »

Поднял два Tang и sss с порогом 1 - один сервер гасил, всё открывается. Но забыл, что http голый, в проде хоть в отдельный VLAN загнал.
👍1 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
X.509 для шифрования, подписи и аутентификации [331.2]
Следующая глава →
DNS и криптография [331.4]

Все главы курса «LPIC-3 303: безопасность Linux»

Поделиться темой: ✈ Telegram VK

Вернуться в «LPIC-3 303: безопасность Linux»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость