Jump to content

IMA: различия между версиями

Нет описания правки
Нет описания правки
Строка 34: Строка 34:


== Роса 13 ==
== Роса 13 ==
=== Быстрое включение ===


На Росе 13 IMA-подписи уже встроены в пакеты репозиториев, а открытый ключ и политика IMA входят в пакет <code>imactl</code>.
На Росе 13 IMA-подписи уже встроены в пакеты репозиториев, а открытый ключ и политика IMA входят в пакет <code>imactl</code>.
=== Наличие IMA-подписей в установленной системе ===
При установке или обновлении пакета плагин <code>rpm-plugin-ima</code> автоматически записывает IMA-подписи из RPM-пакета в расширенный атрибут <code>security.ima</code> соответствующих файлов. Однако это происходит только если подписи уже были в пакете на момент установки.
Из коробки IMA-подписи присутствуют в '''Роса Хром 13.0 и новее''' и '''Роса Фреш 13.3 и новее'''. Если система была установлена из более старого образа, файлы на диске могут не иметь подписей, даже если текущие пакеты в репозиториях уже содержат их. В этом случае перед включением IMA необходимо переустановить все пакеты, чтобы подписи записались на диск:
sudo dnf upgrade
sudo dnf autoremove
sudo dnf reinstall '*'
Убедитесь, что подписи появились. Проще всего — через <code>ima-inspect</code>:
ima-inspect /usr/bin/bash
либо через <code>evmctl</code> (потребуется открытый ключ из пакета <code>imactl</code>):
evmctl ima_verify --key /etc/keys/ima/rosa-ima-2026-1.der /usr/bin/bash
Только убедившись в наличии подписей, переходите к включению IMA. Если система установлена из достаточно свежего образа (где подписи уже есть), этот шаг можно пропустить.
=== Быстрое включение ===


Для включения замкнутой программной среды выполните три шага.
Для включения замкнутой программной среды выполните три шага.

Версия от 16:07, 25 июня 2026

Введение

Эта статья описывает включение и использование замкнутой программной среды (IMA) в ОС Роса.

Решаемая задача: запрет запуска исполняемых файлов недоверенного происхождения. Администратор сам управляет списком доверенных ключей.

Фиксируется состояние системы путем подписывания имеющихся в ней файлов, а иные файлы не могут быть запущены, а неподписанные разделяемые библиотеки не смогут быть загружены, в т.ч. путем dlopen().

На Росе 13 (платформа rosa13) пакеты из репозиториев уже содержат IMA-подписи, а ключ и политика входят в пакет imactl, поэтому включение замкнутой среды выполняется тремя простыми командами (см. раздел Роса 13). Подписывать вручную нужно только файлы, не входящие в пакеты из репозитория Росы.

На Росе 12 и более ранних (Роса Хром/Фреш 12 — платформа rosa2021.1, Роса Nickel — платформа rosa2019.05) IMA-подписей в пакетах нет, поэтому требуется вручную создавать ключи и подписывать все исполняемые файлы и библиотеки (см. раздел Роса 12).

Модель угроз

Замкнутая программная среда на базе IMA реализует режим белого списка: запускать и загружать в память можно только те исполняемые файлы и разделяемые библиотеки, которые имеют действительную IMA-подпись доверенным ключом. Основное назначение — защитить систему от случайного запуска опасного ПО. Например, пользователь скачал вирус или программу-шифровальщик, но не смог его запустить, потому что исполняемый файл не имеет IMA-подписи.

Защите подлежат:

  • запуск исполняемых файлов (execve);
  • загрузка разделяемых библиотек, в том числе через dlopen();
  • отображение файлов в память с правом исполнения (mmap с PROT_EXEC).

Важное ограничение: скрипты и интерпретаторы. IMA проверяет только сам запускаемый файл, но не содержимое, которое подписанный интерпретатор читает как данные. Файл ./script.py с шебангом #!/usr/bin/python3 не запустится напрямую (IMA требует подпись у самого скрипта), но тот же скрипт, запущенный как python3 ./script.py, выполнится: проверке подвергается интерпретатор /usr/bin/python3 (он подписан), а сам script.py открывается интерпретатором как обычный файл, и IMA его не проверяет. То же относится к bash, perl, ruby и любым другим интерпретаторам. Таким образом, IMA appraisal не препятствует выполнению произвольного скриптового кода через подписанные интерпретаторы.

IMA не защищает от:

  • выполнения произвольного кода через подписанные интерпретаторы (см. выше);
  • модификации файлов данных, конфигураций и документов — политика по умолчанию проверяет только исполняемый код;
  • эксплуатации уязвимостей в самом доверенном ПО (например, переполнение буфера в подписанной программе);
  • пользователя с правами root — администратор может отключить IMA, подписать файлы собственным ключом или обойти защиту иными способами.

Защита загрузчика. Параметры ядра задаются в загрузчике GRUB. Без пароля на GRUB (см. пункт 9 «Установка пароля на загрузчик» статьи про Anaconda) любой, кто имеет доступ к консоли при загрузке, может отредактировать строку параметров ядра и отключить IMA.

Параметр ядра ima_appraise=log переводит IMA в режим только записи в лог: неподписанные файлы запускаются, но попытки их запуска фиксируются в журнале аудита. Это полезно для диагностики и для экстренного запуска системы с повреждёнными подписями, которая иначе не загружается. Однако в этом режиме IMA фактически отключена, поэтому он не должен использоваться в штатной работе.

Роса 13

На Росе 13 IMA-подписи уже встроены в пакеты репозиториев, а открытый ключ и политика IMA входят в пакет imactl.

Наличие IMA-подписей в установленной системе

При установке или обновлении пакета плагин rpm-plugin-ima автоматически записывает IMA-подписи из RPM-пакета в расширенный атрибут security.ima соответствующих файлов. Однако это происходит только если подписи уже были в пакете на момент установки.

Из коробки IMA-подписи присутствуют в Роса Хром 13.0 и новее и Роса Фреш 13.3 и новее. Если система была установлена из более старого образа, файлы на диске могут не иметь подписей, даже если текущие пакеты в репозиториях уже содержат их. В этом случае перед включением IMA необходимо переустановить все пакеты, чтобы подписи записались на диск:

sudo dnf upgrade
sudo dnf autoremove
sudo dnf reinstall '*'

Убедитесь, что подписи появились. Проще всего — через ima-inspect:

ima-inspect /usr/bin/bash

либо через evmctl (потребуется открытый ключ из пакета imactl):

evmctl ima_verify --key /etc/keys/ima/rosa-ima-2026-1.der /usr/bin/bash

Только убедившись в наличии подписей, переходите к включению IMA. Если система установлена из достаточно свежего образа (где подписи уже есть), этот шаг можно пропустить.

Быстрое включение

Для включения замкнутой программной среды выполните три шага.

1. Установите пакет imactl:

sudo dnf install imactl

2. Включите IMA:

sudo imactl enable

3. Перезагрузите систему.

После перезагрузки запуск неподписанных исполняемых файлов и загрузка неподписанных разделяемых библиотек запрещены.

Что делает imactl enable

Команда imactl enable:

  • добавляет модуль integrity в initrd (создаётся файл /etc/dracut.conf.d/10-ima.conf);
  • копирует политику IMA из файла /usr/share/imactl/ima-policy.txt в /etc/sysconfig/ima-policy с правами 0600;
  • пересобирает initrd (командой initramfs-regen).

При загрузке системы модуль integrity из initrd загружает открытые ключи из каталога /etc/keys/ima/ в ключевую систему ядра и применяет политику IMA. Открытый ключ Росы (/etc/keys/ima/rosa-ima-2026-1.der) входит в пакет imactl.

Политика IMA по умолчанию содержит только правила appraisal — проверку подписей исполняемых файлов и разделяемых библиотек при запуске (BPRM_CHECK) и при отображении в память с правом исполнения (MMAP_CHECK). Правил measurement (измерения) нет, поэтому опция монтирования iversion не требуется.

Проверка работы

После перезагрузки проверим работу защиты от запуска неподписанных исполняемых файлов.

Войдите в консоль root:

sudo -i

или:

su -

Создайте копию существующего исполняемого файла:

cp -v /bin/cat cat.copy

Дайте ему права на исполнение:

chmod +x cat.copy

Попробуйте его запустить:

./cat.copy

Получите ошибку:

-bash: ./cat.copy: Отказано в доступе

При этом в логе аудита появляется запись о запрете запуска неподписанного файла. Чтобы её увидеть, выполните:

strings /var/log/audit/audit.log | grep IMA

Вывод будет похож на следующий:

type=INTEGRITY_DATA msg=audit(...): pid=... uid=0 ... op=appraise_data cause=IMA-signature-required comm="bash" name="/root/cat.copy" dev="..." ino=... res=0 errno=0

Проверьте наличие подписи у файла, установленного из репозитория:

evmctl ima_verify --key /etc/keys/ima/rosa-ima-2026-1.der /bin/bash
/bin/bash: verification is OK

Удалите более ненужный файл:

rm -fv cat.copy

Отключение

Чтобы отключить IMA, выполните:

sudo imactl disable

и перезагрузите систему.

Подписывание файлов, не входящих в пакеты из репозитория Росы

Файлы, не установленные из репозиториев Росы (собственные скрипты, стороннее ПО, скомпилированные бинарники), необходимо подписать собственным ключом и добавить соответствующий открытый ключ в систему. Ниже описан весь цикл: создание ключевой пары, установка открытого ключа и подписывание файлов.

Создание ключевой пары

Создайте каталог для ключей и перейдите в него:

mkdir -p ~/ima-keys && cd ~/ima-keys

Сгенерируйте закрытый RSA-ключ и самоподписанный сертификат:

openssl req -new -nodes -newkey rsa:2048 \
  -keyout my_ima_priv.pem -x509 -days 3650 \
  -subj "/CN=My IMA signing key/" -out my_ima_cert.pem

Конвертируйте сертификат в формат DER (нужен для загрузки в ядро):

openssl x509 -in my_ima_cert.pem -out my_ima_cert.der -outform DER

Назначение файлов:

  • my_ima_priv.pem — закрытый ключ, которым подписываются файлы. Храните его в надёжном месте и не оставляйте на машине, где включена IMA.
  • my_ima_cert.der — открытый ключ (сертификат), который устанавливается на каждую машину, где будут запускаться подписанные файлы.

Возможно также применение ГОСТ-ключей (см. раздел «Создание ключей» для Росы 12).

Установка открытого ключа

Скопируйте открытый ключ в каталог /etc/keys/ima/:

sudo cp -v my_ima_cert.der /etc/keys/ima/

Все ключи из этого каталога загружаются в ядро при загрузке системы. Перезагрузитесь, чтобы новый ключ вступил в силу.

Подписывание файлов

Подпишите файл закрытым ключом (от root):

sudo evmctl ima_sign --hashalgo sha256 --key my_ima_priv.pem /путь/к/файлу

Проверьте, что подпись установлена:

getfattr -n security.ima /путь/к/файлу

Проверьте саму подпись:

sudo evmctl ima_verify --key /etc/keys/ima/my_ima_cert.der /путь/к/файлу

Для подписывания набора файлов (всех исполняемых файлов и разделяемых библиотек в каталоге) можно использовать скрипт, аналогичный приведённому в разделе «Подписывание файлов в системе» для Росы 12, заменив --hashalgo streebog512 на --hashalgo sha256 и указав свой закрытый ключ.

Роса 12 и более ранние

Данный раздел описывает полную ручную настройку IMA. На Росе 13 в ней нет необходимости — там достаточно установить пакет imactl (см. раздел Роса 13). Тем не менее, описанные здесь шаги применимы и к Росе 13, если по какой-то причине требуется полностью ручная настройка (например, нужно использовать собственную политику или собственный ключ для всех файлов системы). Для Роса Хром/Фреш 12 (платформа rosa2021.1) и Роса Nickel (платформа rosa2019.05) ручная настройка — единственный способ, поскольку IMA-подписей в пакетах нет: создаётся ключевая пара, подписываются все исполняемые файлы и библиотеки, формируется политика IMA и пересобирается initrd.

Подготовка

Запуск с разрешающим SELinux

Если используется система со включенным SELinux (Никель), то необходимо запустить её с SELinux в разрешающем (permissive) режиме. Для этого при включении системы в загрузчике Grub выберите нужный пункт меню и нажмите клавишу с латинской буквой E, введите логин ("root") и пароль от загрузчика, в открывшемся текстовом редакторе с помощью клавиш со стрелками вверх, вниз, вправо, влево переместите курсор ввода текста в конец строки, начинающейся со слова «linux», и допишите в конец строки: « enforcing=0».

Нажмите Ctrl+X или F10 для запуска ОС с измененными параметрами ядра.

Если используется система без настроенного SELinux (Роса Хром, Роса Фреш), то выполнять данный пункт не требуется (однако, если его выполнить, не будет ни плохо, ни хорошо).

Установка пакетов

Установите необходимые пакеты:

sudo dnf install ima-evm-utils libressl audit ima-inspect

Во многих дистрибутивах Росы все эти пакеты уже установлены, в таком случае пакетный менеджер dnf сообщит об этом при выполнении приведенной выше команды.

Создание ключей

Создается пара ключей: закрытый и открытый ключи.

Закрытым ключом подписываются файлы, следовательно, к нему не должно быть доступа у тех, кто не должен иметь возможности подписать файлы, и рекомендуется хранить его отдельно, а не на машине, где выполняется запуск подписанных исполняемых файлов.

Открытый ключ должен быть установлен на каждой системе, на которой производится запуск подписанных исполняемых файлов, он используется для проверки валидности подписи. Открытый ключ хранится на диске и загружается в ключевую систему ядра в initrd.

Ниже описано создание ключевой пары по ГОСТ. Возможно применение RSA.

Откройте консоль root командой:

sudo -i

или:

su -

Создайте каталог «ima»:

mkdir -p ima

Переведите терминал в него:

cd ima

Создайте файл x509.conf с приведенным ниже текстом. Для создания файла откройте консольный текстовый редактор, например, nano, командой:

nano x509.conf

и вставьте текст ниже:

[ req ]
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts

[ req_distinguished_name ]
O = IMA
CN = Executable Signing Key
emailAddress = ivan@petrov.tld

[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid

Значения полей O, CN, emailAddress являются произвольными, можно заменить их на свои.

Сохраните файл. Если используется редактор nano, то последовательно нажмите: Ctrl+O, Enter, Ctrl+X.

Теперь создайте пару ключей:

libressl req -new -nodes -utf8 -batch -newkey gost2001 -pkeyopt dgst:streebog512 -pkeyopt paramset:A -streebog512 -days 109500 -x509 -config x509.conf -outform DER -out ima_cert.der -keyout ima_priv.pem

ima_cert.der — открытый ключ, ima_priv.pem — закрытый.

Создайте каталог с открытыми ключами:

mkdir -p /etc/keys/ima

Все ключи из этого каталога будут импортированы в ядро на этапе initrd.

Скопируйте созданный открытый ключ в этот каталог:

cp -v ima_cert.der /etc/keys/ima/ima_cert.der

Создание политики IMA

Продолжая работать в консоли root, создайте файл /etc/sysconfig/ima-policy.

Если используется редактор nano, то для этого выполните:

nano /etc/sysconfig/ima-policy

Скопируйте и вставьте текст ниже, нажмите Ctrl+O, Enter, Ctrl+X.

# PROC_SUPER_MAGIC
dont_measure fsmagic=0x9fa0
dont_appraise fsmagic=0x9fa0
# SYSFS_MAGIC
dont_measure fsmagic=0x62656572
dont_appraise fsmagic=0x62656572
# DEBUGFS_MAGIC
dont_measure fsmagic=0x64626720
dont_appraise fsmagic=0x64626720
# TMPFS_MAGIC
dont_measure fsmagic=0x01021994
dont_appraise fsmagic=0x01021994
# RAMFS_MAGIC
dont_appraise fsmagic=0x858458f6
# DEVPTS_SUPER_MAGIC
dont_measure fsmagic=0x1cd1
dont_appraise fsmagic=0x1cd1
# BINFMTFS_MAGIC
dont_measure fsmagic=0x42494e4d
dont_appraise fsmagic=0x42494e4d
# SECURITYFS_MAGIC
dont_measure fsmagic=0x73636673
dont_appraise fsmagic=0x73636673
# SELINUX_MAGIC
dont_measure fsmagic=0xf97cff8c
dont_appraise fsmagic=0xf97cff8c
# SMACK_MAGIC — /sys/fs/smackfs
dont_measure fsmagic=0x43415d53
dont_appraise fsmagic=0x43415d53
# CGROUP_SUPER_MAGIC
dont_measure fsmagic=0x27e0eb
dont_appraise fsmagic=0x27e0eb
# CGROUP2_SUPER_MAGIC
dont_measure fsmagic=0x63677270
dont_appraise fsmagic=0x63677270
# NSFS_MAGIC
dont_measure fsmagic=0x6e736673
dont_appraise fsmagic=0x6e736673
# EFIVARFS_MAGIC
dont_measure fsmagic=0xde5e81e4
dont_appraise fsmagic=0xde5e81e4
measure func=MMAP_CHECK mask=MAY_EXEC
measure func=BPRM_CHECK mask=MAY_EXEC
appraise func=BPRM_CHECK mask=MAY_EXEC appraise_type=imasig
appraise func=MMAP_CHECK mask=MAY_EXEC appraise_type=imasig

Выставьте права на этот файл:

chmod 0400 /etc/sysconfig/ima-policy

В целом все равно, какие на него права, но в процессе работы системы содержимое политики доступно по адресу /sys/kernel/security/ima/policy с правами 0400, поэтому для единообразия запретим всем, кроме root, читать этот файл. Так нельзя будет узнать применяемую политику IMA без root-прав.

Подписывание файлов в системе

Теперь необходимо подписать все исполняемые файлы, в т.ч. скрипты, иные файлы, которые mmap()-ятся с PROT_EXEC, в т.ч. разделяемые библиотеки *.so*.

Продолжая работать в root-консоли, создайте файл sign.sh.

Если используется редактор nano, то выполните команду:

nano sign.sh

Скопируйте и вставьте в редактор текст ниже, нажмите Ctrl+O, Enter, Ctrl+X.

#!/bin/bash
set -xe

FS="$(findmnt --output FSTYPE / | tail -n1)"
echo "$FS"
echo > failed.log

find / -fstype "$FS" -type f -executable | sort -u | while read -r line
do
  if ! evmctl ima_sign --hashalgo streebog512 --key ima_priv.pem "$line" ; then
    echo "$line" >> failed.log
  fi
done

for D in /lib /lib64 /usr/lib /usr/lib64
do
  find "$D" -fstype $FS -\! -executable -type f -name "*.so*" | sort -u | while read -r line
    do
      if ! evmctl ima_sign --hashalgo streebog512 --key ima_priv.pem "$line"; then
        echo "$line" >> failed.log
      fi
    done
done

Сделайте этот скрипт исполняемым:

chmod 755 sign.sh

И запустите его:

./sign.sh

Выведите лог ошибок:

cat failed.log

и убедитесь, что этот файл пуст, а значит в процессе подписывания не возникло ошибок.

Подготовка файловой системы к запуску со включенной IMA

Если используется файловая система ext4, то необходимо добавить опцию монтирования "iversion". На большинстве типовых установок Росы это можно сделать следующей командой:

sed -i.bak -e 's!\(space:/space:.*ext4space:.*defaults\)!\1,iversion!' /etc/fstab

Она добавит "iversion" в опции монтирования корня системы в файле /etc/fstab. Резервная копия файла до изменений будет сохранена по адресу /etc/fstab.bak. Выполните:

diff -u --color /etc/fstab.bak /etc/fstab

и удостоверьтесь, что изменения между файлами правильные.

В случае необходимости отредактируйте файл /etc/fstab самостоятельно вместо применения приведенной выше команды.

Включение auditd

Выполните от root:

systemctl enable auditd

Если команда ничего не выдала, то значит служба auditd уже была включена, никаких дополнительных действий предпринимать не надо.

Сборка initrd с поддержкой IMA

Добавьте модуль integrity в initrd:

echo 'add_dracutmodules+=" integrity "' | tee /etc/dracut.conf.d/10-ima.conf

Пересоберите initrd — это нужно только для того, чтобы в него попал модуль integrity, загружающий ключи и политику IMA при загрузке. На Росе 13 (платформа rosa13) и Росе 12 (платформа rosa2021.1):

initramfs-regen

На Росе Nickel (платформа rosa2019.05):

systemd-initramfs-gen

Пробный запуск подписанной системы

Осуществите пробный запуск системы с добавлением "ima_appraise=log" в cmdline ядра, для этого при включении системы в загрузчике Grub выберите нужный пункт меню и нажмите клавишу с латинской буквой E, при необходимости введите логин и пароль от загрузчика, в открывшемся текстовом редакторе с помощью клавиш со стрелками вверх, вниз, вправо, влево переместите курсор ввода текста в конец строки, начинающейся со слова «linux», и допишите в конец строки: « ima_appraise=log».

Нажмите Ctrl+X или F10 для запуска ОС с измененными параметрами ядра.

В этом режиме система не будет запрещать запуск неподписанных файлов, но будет записывать попытки их запуска.

Откройте консоль root с помощью команды:

sudo -i

или:

su -

Если вы используете ОС с мандатной защитой (Никель), то в этой консоли после входа в root также выполните:

newrole -r secadm_r

Посмотрите, нет ли в логе событий безопасности сообщений от IMA:

strings /var/log/audit/audit.log | grep IMA

Должно быть пусто.

Проверьте наличие подписи у файлов:

[root@rosa2019 ~]# ima_inspect /bin/bash
/bin/bash

security.ima
------------
digital signature version 2
digest algorithm: streebog512
key-id v2 (gpg compatible): 5ac982c4
signature length: 1024 bits
signature data:

afbe5f078a9a052c eda2683037c92b40 dab77e6f7fcf2d42 bdce159ef64097ad 9db7b39124fa9f5c ea04c010248e65d4 6ce4d8dcf692d124 62447ccdf53e979c
16ca24090c175f55 81218c5e024a5d6e 57c81d2511bc1311 0b9479aaa04605a5 cbf0b5c1f64aca04 47ab95abd392de8c 08d2683bc1f3c4a4 e6355635c1608671


security.evm
------------
no such attribute
[root@rosa2019 ~]# evmctl ima_verify --key /etc/keys/ima/ima_cert.der /bin/bash
key 1: 5ac982c4 /etc/keys/x509_evm.der
/bin/bash: verification is OK
[root@rosa2019 ~]#

Боевой запуск и проверка работы

Запустите без ima_appraise=log, то есть просто перезагрузите систему. Система должна запуститься и работать штатно.

Теперь проверим работу защиты от запуска неподписанных исполняемых файлов.

Войдите в root-консоль с помощью команды:

sudo -i

или:

su -

Создайте копию существующего исполняемого файла:

cp -v /bin/cat cat.copy

Дайте ему права на исполнение:

chmod +x cat.copy

Попробуйте его запустить командой:

./cat.copy

Получите ошибку:

-bash: ./cat.copy: Отказано в доступе

При этом в логе аудита появляется запись о запрете запуска неподписанного файла.

Если вы используете ОС с мандатной защитой (Никель), то в этой консоли выполните:

newrole -r secadm_r

В логе будет сообщение с текстом "cause=IMA-signature-required", чтобы его увидеть, в этой же консоли выполняем команду:

strings /var/log/audit/audit.log | grep IMA

Ее вывод будет похож на следующий:

type=INTEGRITY_DATA msg=audit(1610966070.898:250): pid=7021 uid=0 auid=1000 ses=2 op=appraise_data cause=IMA-signature-required comm="bash" name="/root/cat.copy" dev="sda2" ino=2759743 res=0 errno=0

Это говорит о работоспособности замкнутой программной среды (IMA).

Удалите более ненужный файл:

rm -fv cat.copy