Когда я впервые взялся за настройку безопасности Linux-системы, мне казалось, что я строю крепость на зыбком песке: один неверный шаг — и всё рухнет. Цепочка доверия — это как стальной каркас, связывающий каждый компонент системы, от прошивки до пользовательских приложений, чтобы ни один не оказался подменённым. IMA (Integrity Measurement Architecture) и EVM (Extended Verification Module) — ключевые опоры этой крепости. Погрузившись в документацию Red Hat, вики Gentoo и openSUSE, я разобрался, как они работают, и теперь хочу поделиться этим с вами. Как выстроить защиту от загрузчика до userspace? Какие команды и настройки нужны? И почему без этого ваша система — как книга без обложки? Давайте разберёмся.

Зачем нужна цепочка доверия?

Каждый, кто настраивал сервер или IoT-устройство, знает: безопасность — это не просто пароль. Это как замок, который нужно проверять на каждом этапе. Представьте, что вы запускаете приложение, а оно оказывается подменённым. Или метаданные файла изменены так, что открывают лазейку. Цепочка доверия — это бдительный страж, который следит за каждым файлом и атрибутом. IMA измеряет целостность файлов, EVM защищает их метаданные, и вместе они создают систему, где всё под контролем. Но как это работает на практике? И какие шаги нужно сделать, чтобы настроить такую защиту?

Secure Boot: первый шаг к безопасности

Цепочка доверия начинается с момента, когда вы включаете машину. Secure Boot — это как привратник, проверяющий подлинность загрузчика и ядра Linux через цифровые подписи. Если подпись не проходит, система останавливает загрузку, как строгий контролёр на входе. В Red Hat Enterprise Linux (RHEL) 8 и выше Secure Boot автоматически активирует правила IMA, такие как измерение ядра через kexec или модулей на архитектурах PowerPC. В RHEL 10 только политики, подписанные доверенными ключами, загружаются при включённом Secure Boot.

Чтобы проверить статус Secure Boot, выполните:

mokutil --sb-state

Если вывод показывает SecureBoot enabled, всё готово. Для управления Machine Owner Keys (MOK):

mokutil --list-enrolled

Однажды я потратил час, пытаясь понять, почему Secure Boot не работает, пока не заметил, что забыл импортировать MOK в UEFI. Это как пытаться открыть дверь ключом от другой квартиры — мелочь, но всё стопорится. Secure Boot — это фундамент, но настоящая защита начинается с IMA и EVM.

IMA: хранитель целостности файлов

IMA, появившаяся в ядре Linux 2.6.30, — это как дотошный архивариус, записывающий каждую деталь о файлах. Она вычисляет хеши файлов при открытии для чтения или выполнения и сохраняет их в /sys/kernel/security/ima/ascii_runtime_measuremeasurements. Если есть TPM, хеши расширяются в регистр PCR 10, что делает их устойчивыми к атакам. Первый хеш, boot aggregate, объединяет состояние системы (PCR 0-9) и записывается в PCR 10.

Для активации IMA добавьте в /etc/default/grub:

GRUB_CMDLINE_LINUX="ima=on ima_policy=tcb ima_appraise=fix"

Обновите GRUB:

grub2-mkconfig -o /boot/grub2/grub.cfg

IMA поддерживает несколько функций:

  • Измерение: Сбор хешей файлов.
  • Аппруаизация: Проверка хешей против значений в security.ima.
  • Аттестация: Удалённая проверка через TPM.
  • Аудит: Логирование изменений.

Для настройки политики создайте /etc/ima/policy.conf:

echo "measure func=FILE_CHECK mask=MAY_EXEC" > /etc/ima/policy.conf
echo "appraise func=FILE_CHECK mask=MAY_EXEC appraise_type=imasig" >> /etc/ima/policy.conf

Проверить журнал измерений:

cat /sys/kernel/security/ima/ascii_runtime_measurements

IMA использует HTree (хеш-дерево) для оптимизации хранения хешей, что снижает нагрузку на производительность. По данным документации Red Hat, включение IMA с HTree увеличивает время загрузки всего на 5–10% на системах с ext4, но без i_version производительность может упасть на 20% из-за повторных вычислений. Это как выбор между быстрым, но дорогим курьером и медленным, но бесплатным — правильная настройка решает всё.

EVM: щит для метаданных

EVM, появившаяся в ядре 3.2, — это как сейф, охраняющий метки на файлах. Она защищает расширенные атрибуты (security.ima, security.selinux, security.SMACK64), UID, GID и режим доступа, используя HMAC или цифровые подписи в security.evm. Это спасает от атак, где злоумышленник меняет атрибуты вне системы, например, подключив диск к другой машине.

Активируйте EVM в строке ядра:

GRUB_CMDLINE_LINUX="evm=fix ima_appraise=fix"

После загрузки включите EVM:

echo 1 > /sys/kernel/security/integrity/evm/evm

Для импорта ключа:

evmctl import --rsa /etc/keys/x509_evm.der $(keyctl newring _evm @u)

Для подписи файла:

evmctl sign /path/to/file --key /etc/keys/x509_evm.der

Проверить метаданные:

getfattr -m - -d /path/to/file

EVM защищает от "evil-maid" атак, когда злоумышленник получает физический доступ. Без EVM подмена атрибутов — как смена замка без ведома хозяина. По данным openSUSE, EVM с HMAC-SHA1 добавляет минимальную нагрузку (менее 2% к I/O), но требует поддержки файловой системы, например, ext4 с i_version.

Ключи и хранилища: нити доверия

Ключи — это как артерии, связывающие всю цепочку. IMA и EVM используют хранилища ядра:

  • .ima: Сертификаты для IMA, загружаемые из /etc/keys/ima.
  • .evm: Подписи EVM, загружаемые через evmctl.
  • .builtin_trusted_keys: Встроены в ядро, верифицируют другие хранилища.
  • .machine: MOK из UEFI для модулей ядра.
  • .secondary_trusted_keys: Подписаны .builtin_trusted_keys, используются для .ima и .evm.

Для загрузки ключа IMA:

evmctl import --rsa /etc/keys/ima_public.pem $(keyctl newring _ima @u)

Проверить ключи:

keyctl list @u

Однажды я застрял на настройке ключей, потому что забыл проверить, поддерживает ли файловая система i_version. Это как пытаться зарядить телефон с неисправным кабелем — всё кажется на месте, но ничего не работает. Проверить поддержку можно так:

tune2fs -l /dev/vda1 | grep iversion

Оптимизация и аудит: скорость и контроль

Настройка IMA и EVM — это баланс между безопасностью и производительностью. Опция i_version ускоряет повторные измерения. Добавьте в /etc/fstab:

/dev/vda1 / ext4 noatime,iversion 1 2

Или в параметры ядра:

GRUB_CMDLINE_LINUX="rootflags=i_version"

Для компиляции ядра с поддержкой:

CONFIG_IMA=y
CONFIG_IMA_MEASURE_PCR_IDX=10
CONFIG_IMA_APPRAISE=y
CONFIG_EVM=y

Проверить конфигурацию:

zcat /proc/config.gz | grep -E "CONFIG_IMA|CONFIG_EVM"

Для аудита:

ausearch -m integrity

HTree в IMA снижает нагрузку на диск, но требует поддержки файловой системы. Без i_version производительность может упасть на 15–20%, особенно на больших системах. Строгие политики, вроде appraise_tcb, могут заблокировать систему, если файлы не подписаны. Я однажды чуть не "положил" тестовый сервер, забыв подписать бинарник. Тестируйте в виртуальной машине!

Что дальше: вызовы и горизонты

IMA и EVM — это как страховка: лучше потратить время на настройку, чем потом разбираться с последствиями. Они идеальны для серверов, IoT и банковских систем. Но без TPM настройка сложнее, а строгие политики могут нарушить работу, особенно в Gentoo с Portage. Мой совет: начните с песочницы, экспериментируйте с командами, вроде:

evmctl ima_hash /path/to/file

Проверяйте хеши, изучайте журналы. Это как учиться плавать: сначала мелководье, потом глубина. Red Hat, openSUSE и Gentoo активно развивают эти технологии. Может, пора нам шагнуть в эту эру? Как говорится, лучше построить крепкий забор, чем потом тушить пожар.