Jump to content

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

Нет описания правки
Нет описания правки
 
(не показаны 2 промежуточные версии этого же участника)
Строка 1: Строка 1:
== Введение ==
== Введение ==
Эта статья описывает настройки и использование замкнутой программной среды в ОС ROSA rosa2021.1 (Fresh/Chrome 12+), rosa2019.05 (Nickel).
Эта статья описывает включение и использование замкнутой программной среды (IMA) в ОС Роса.


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


== Настройка замкнутой программной среды ==
На '''Росе 13''' (платформа rosa13) пакеты из репозиториев уже содержат IMA-подписи, а ключ и политика входят в пакет <code>imactl</code>, поэтому включение замкнутой среды выполняется тремя простыми командами (см. [[#Роса 13|раздел Роса 13]]). Подписывать вручную нужно только файлы, не входящие в пакеты из репозитория Росы.
 
На '''Росе 12 и более ранних''' (Роса Хром/Фреш 12 — платформа rosa2021.1, Роса Nickel — платформа rosa2019.05) IMA-подписей в пакетах нет, поэтому требуется вручную создавать ключи и подписывать все исполняемые файлы и библиотеки (см. [[#Роса 12 и более ранние|раздел Роса 12]]).
 
== Модель угроз ==
 
Замкнутая программная среда на базе IMA реализует '''режим белого списка''': запускать и загружать в память можно только те исполняемые файлы и разделяемые библиотеки, которые имеют действительную IMA-подпись доверенным ключом. Основное назначение — '''защитить систему от случайного запуска опасного ПО'''. Например, пользователь скачал вирус или программу-шифровальщик, но не смог его запустить, потому что исполняемый файл не имеет IMA-подписи.
 
Защите подлежат:
 
* запуск исполняемых файлов (execve);
* загрузка разделяемых библиотек, в том числе через dlopen();
* отображение файлов в память с правом исполнения (mmap с PROT_EXEC).
 
'''Важное ограничение: скрипты и интерпретаторы.''' IMA проверяет только сам запускаемый файл, но не содержимое, которое подписанный интерпретатор читает как данные. Файл <code>./script.py</code> с шебангом <code>#!/usr/bin/python3</code> не запустится напрямую (IMA требует подпись у самого скрипта), но тот же скрипт, запущенный как <code>python3 ./script.py</code>, выполнится: проверке подвергается интерпретатор <code>/usr/bin/python3</code> (он подписан), а сам <code>script.py</code> открывается интерпретатором как обычный файл, и IMA его не проверяет. То же относится к bash, perl, ruby и любым другим интерпретаторам. Таким образом, IMA appraisal '''не препятствует''' выполнению произвольного скриптового кода через подписанные интерпретаторы.
 
'''IMA не защищает от:'''
 
* выполнения произвольного кода через подписанные интерпретаторы (см. выше);
* модификации файлов данных, конфигураций и документов — политика по умолчанию проверяет только исполняемый код;
* эксплуатации уязвимостей в самом доверенном ПО (например, переполнение буфера в подписанной программе);
* '''пользователя с правами root''' — администратор может отключить IMA, подписать файлы собственным ключом или обойти защиту иными способами.
 
'''Защита загрузчика.''' Параметры ядра задаются в загрузчике GRUB. Без пароля на GRUB (см. [[Anaconda#Установка пароля на загрузчик|пункт 9 «Установка пароля на загрузчик» статьи про Anaconda]]) любой, кто имеет доступ к консоли при загрузке, может отредактировать строку параметров ядра и отключить IMA.
 
'''Параметр ядра <code>ima_appraise=log</code>''' переводит IMA в режим только записи в лог: неподписанные файлы запускаются, но попытки их запуска фиксируются в журнале аудита. Это полезно для диагностики и для экстренного запуска системы с повреждёнными подписями, которая иначе не загружается. Однако в этом режиме IMA фактически отключена, поэтому он не должен использоваться в штатной работе.
 
== Роса 13 ==
 
На Росе 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. Если система установлена из достаточно свежего образа (где подписи уже есть), этот шаг можно пропустить.
 
=== Быстрое включение ===
 
Для включения замкнутой программной среды выполните три шага.
 
1. Установите пакет imactl:
 
sudo dnf install imactl
 
2. Включите IMA:
 
sudo imactl enable
 
3. Перезагрузите систему.
 
После перезагрузки запуск неподписанных исполняемых файлов и загрузка неподписанных разделяемых библиотек запрещены.
 
=== Что делает imactl enable ===
 
Команда <code>imactl enable</code>:
 
* добавляет модуль <code>integrity</code> в initrd (создаётся файл <code>/etc/dracut.conf.d/10-ima.conf</code>);
* копирует политику IMA из файла <code>/usr/share/imactl/ima-policy.txt</code> в <code>/etc/sysconfig/ima-policy</code> с правами 0600;
* пересобирает initrd (командой <code>initramfs-regen</code>).
 
При загрузке системы модуль <code>integrity</code> из initrd загружает открытые ключи из каталога <code>/etc/keys/ima/</code> в ключевую систему ядра и применяет политику IMA. Открытый ключ Росы (<code>/etc/keys/ima/rosa-ima-2026-1.der</code>) входит в пакет <code>imactl</code>.
 
Политика IMA по умолчанию содержит только правила appraisal — проверку подписей исполняемых файлов и разделяемых библиотек при запуске (<code>BPRM_CHECK</code>) и при отображении в память с правом исполнения (<code>MMAP_CHECK</code>). Правил measurement (измерения) нет, поэтому опция монтирования <code>iversion</code> не требуется.
 
=== Проверка работы ===
 
После перезагрузки проверим работу защиты от запуска неподписанных исполняемых файлов.
 
Войдите в консоль 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
 
Назначение файлов:
 
* <code>my_ima_priv.pem</code> — закрытый ключ, которым подписываются файлы. Храните его в надёжном месте и '''не''' оставляйте на машине, где включена IMA.
* <code>my_ima_cert.der</code> — открытый ключ (сертификат), который устанавливается на каждую машину, где будут запускаться подписанные файлы.
 
Возможно также применение ГОСТ-ключей (см. раздел [[#Создание ключей|«Создание ключей»]] для Росы 12).
 
==== Установка открытого ключа ====
 
Скопируйте открытый ключ в каталог <code>/etc/keys/ima/</code>:
 
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, заменив <code>--hashalgo streebog512</code> на <code>--hashalgo sha256</code> и указав свой закрытый ключ.
 
== Роса 12 и более ранние ==
 
'''Данный раздел описывает полную ручную настройку IMA.''' На Росе 13 в ней нет необходимости — там достаточно установить пакет <code>imactl</code> (см. [[#Роса 13|раздел Роса 13]]). Тем не менее, описанные здесь шаги применимы и к Росе 13, если по какой-то причине требуется полностью ручная настройка (например, нужно использовать собственную политику или собственный ключ для всех файлов системы). Для Роса Хром/Фреш 12 (платформа rosa2021.1) и Роса Nickel (платформа rosa2019.05) ручная настройка — единственный способ, поскольку IMA-подписей в пакетах нет: создаётся ключевая пара, подписываются все исполняемые файлы и библиотеки, формируется политика IMA и пересобирается initrd.
 
=== Подготовка ===
=== Подготовка ===


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


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


[[Файл:Ima1.png]]
[[Файл:Ima1.png]]
Строка 17: Строка 202:
Нажмите Ctrl+X или F10 для запуска ОС с измененными параметрами ядра.
Нажмите Ctrl+X или F10 для запуска ОС с измененными параметрами ядра.


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


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


  sudo dnf install ima-evm-utils libressl audit ima-inspect audit
  sudo dnf install ima-evm-utils libressl audit ima-inspect
Во многих дистрибутивах ROSA все эти пакеты уже установлены, в таком случае пакетный менеджер dnf сообщит об этом при выполнении приведенной выше команды.
 
Во многих дистрибутивах Росы все эти пакеты уже установлены, в таком случае пакетный менеджер dnf сообщит об этом при выполнении приведенной выше команды.


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


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


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


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


  mkdir -p ima
  mkdir -p ima
Переведите терминал в него:
Переведите терминал в него:


Строка 53: Строка 241:


  nano x509.conf
  nano x509.conf
и вставьте текст ниже:
и вставьте текст ниже:
<pre>
<pre>
Строка 79: Строка 268:
Теперь создайте пару ключей:
Теперь создайте пару ключей:


Значения полей O, CN, emailAddress являются произвольными, можно заменить их на свои.
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


Сохраните файл. Если используется редактор nano, то последовательно нажмите: Ctrl+O, Enter, Ctrl+X.
<code>ima_cert.der</code> — открытый ключ, <code>ima_priv.pem</code> — закрытый.
 
Теперь создайте пару ключей:
 
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 — закрытый.


[[Файл:Ima3.png]]
[[Файл:Ima3.png]]
Строка 93: Строка 277:


  mkdir -p /etc/keys/ima
  mkdir -p /etc/keys/ima
Все ключи из этого каталога будут импортированы в ядро на этапе initrd.
Все ключи из этого каталога будут импортированы в ядро на этапе initrd.


Строка 98: Строка 283:


  cp -v ima_cert.der /etc/keys/ima/ima_cert.der
  cp -v ima_cert.der /etc/keys/ima/ima_cert.der
=== Создание политики IMA ===
=== Создание политики IMA ===


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


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


  nano /etc/sysconfig/ima-policy
  nano /etc/sysconfig/ima-policy
Скопируйте и вставьте текст ниже, нажмите Ctrl+O, Enter, Ctrl+X.
Скопируйте и вставьте текст ниже, нажмите Ctrl+O, Enter, Ctrl+X.
<pre>
<pre>
Строка 157: Строка 344:


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


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


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


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


  nano sign.sh
  nano sign.sh
Скопируйте и вставьте в редактор текст ниже, нажмите Ctrl+O, Enter, Ctrl+X.
Скопируйте и вставьте в редактор текст ниже, нажмите Ctrl+O, Enter, Ctrl+X.
<pre>
<pre>
Строка 200: Строка 389:


  chmod 755 sign.sh
  chmod 755 sign.sh
И запустите его:
И запустите его:


  ./sign.sh
  ./sign.sh
Выведите лог ошибок:
Выведите лог ошибок:


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


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


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


  sed -i.bak -e 's!\([[:space:]]/[[:space:]].*ext4[[:space:]].*defaults\)!\1,iversion!' /etc/fstab
  sed -i.bak -e 's!\([[:space:]]/[[:space:]].*ext4[[:space:]].*defaults\)!\1,iversion!' /etc/fstab
Она добавит "iversion" в опции монтирования корня системы в файле /etc/fstab. Резервная копия файла до изменений будет сохранена по адресу /etc/fstab.bak. Выполните:
Она добавит "iversion" в опции монтирования корня системы в файле /etc/fstab. Резервная копия файла до изменений будет сохранена по адресу /etc/fstab.bak. Выполните:


  diff -u --color /etc/fstab.bak /etc/fstab
  diff -u --color /etc/fstab.bak /etc/fstab
и удостоверьтесь, что изменения между файлами правильные. Ниже приведен пример правильных изменений.
 
и удостоверьтесь, что изменения между файлами правильные.


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


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


Строка 232: Строка 427:


  echo 'add_dracutmodules+=" integrity "' | tee /etc/dracut.conf.d/10-ima.conf
  echo 'add_dracutmodules+=" integrity "' | tee /etc/dracut.conf.d/10-ima.conf
Пересоберите initrd:
 
Пересоберите initrd — это нужно только для того, чтобы в него попал модуль <code>integrity</code>, загружающий ключи и политику IMA при загрузке. На Росе 13 (платформа rosa13) и Росе 12 (платформа rosa2021.1):
 
initramfs-regen
 
На Росе Nickel (платформа rosa2019.05):


  systemd-initramfs-gen
  systemd-initramfs-gen
Обратите внимание, что в initrd должны попасть уже подписанные файлы, поэтому данный шаг выполняется после подписывания файлов в системе.


=== Пробный запуск подписанной системы ===
=== Пробный запуск подписанной системы ===
Строка 252: Строка 451:


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


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


  strings /var/log/audit/audit.log | grep IMA
  strings /var/log/audit/audit.log | grep IMA
Должно быть пусто.
Должно быть пусто.


Строка 284: Строка 486:
key 1: 5ac982c4 /etc/keys/x509_evm.der
key 1: 5ac982c4 /etc/keys/x509_evm.der
/bin/bash: verification is OK
/bin/bash: verification is OK
[root@rosa2019 ~]#  
[root@rosa2019 ~]#
</pre>
</pre>


Строка 299: Строка 501:


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


  cp -v /bin/cat cat.copy
  cp -v /bin/cat cat.copy
Дайте ему права на исполнение:
Дайте ему права на исполнение:


  chmod +x cat.copy
  chmod +x cat.copy
Попробуйте его запустить командой:
Попробуйте его запустить командой:


  ./cat.copy
  ./cat.copy
Получите ошибку:
Получите ошибку:


  -bash: ./cat.copy: Отказано в доступе
  -bash: ./cat.copy: Отказано в доступе
При этом в логе аудита появляется запись о запрете запуска неподписанного файла.
При этом в логе аудита появляется запись о запрете запуска неподписанного файла.


Строка 316: Строка 523:


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


  strings /var/log/audit/audit.log | grep IMA
  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
  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).
Это говорит о работоспособности замкнутой программной среды (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