IMA: различия между версиями
Нет описания правки |
Нет описания правки |
||
| Строка 1: | Строка 1: | ||
== Введение == | == Введение == | ||
Эта статья описывает | Эта статья описывает включение и использование замкнутой программной среды (IMA) в ОС Роса. | ||
'''Решаемая задача: запрет запуска исполняемых файлов недоверенного происхождения.''' Администратор сам управляет списком доверенных ключей. | '''Решаемая задача: запрет запуска исполняемых файлов недоверенного происхождения.''' Администратор сам управляет списком доверенных ключей. | ||
| Строка 6: | Строка 6: | ||
Фиксируется состояние системы путем подписывания имеющихся в ней файлов, а иные файлы не могут быть запущены, а неподписанные разделяемые библиотеки не смогут быть загружены, в т.ч. путем dlopen(). | Фиксируется состояние системы путем подписывания имеющихся в ней файлов, а иные файлы не могут быть запущены, а неподписанные разделяемые библиотеки не смогут быть загружены, в т.ч. путем dlopen(). | ||
== | На '''Росе 13''' (платформа rosa13) пакеты из репозиториев уже содержат IMA-подписи, а ключ и политика входят в пакет <code>imactl</code>, поэтому включение замкнутой среды выполняется тремя простыми командами (см. [[#Роса 13|раздел Роса 13]]). Подписывать вручную нужно только файлы, не входящие в пакеты из репозитория Росы. | ||
На '''Росе 12 и более ранних''' (Роса Fresh/Chrome 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>. | |||
Для включения замкнутой программной среды выполните три шага. | |||
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, если по какой-то причине требуется полностью ручная настройка (например, нужно использовать собственную политику или собственный ключ для всех файлов системы). Для Роса Fresh/Chrome 12 (платформа rosa2021.1) и Роса Nickel (платформа rosa2019.05) ручная настройка — единственный способ, поскольку IMA-подписей в пакетах нет: создаётся ключевая пара, подписываются все исполняемые файлы и библиотеки, формируется политика IMA и пересобирается initrd. | |||
=== Подготовка === | === Подготовка === | ||
==== Запуск с разрешающим SELinux ==== | ==== Запуск с разрешающим SELinux ==== | ||
Если используется система со включенным SELinux (Никель), то необходимо | Если используется система со включенным SELinux (Никель), то необходимо запустить её с SELinux в разрешающем (permissive) режиме. Для этого при включении системы в загрузчике Grub выберите нужный пункт меню и нажмите клавишу с латинской буквой E, введите логин ("root") и пароль от загрузчика, в открывшемся текстовом редакторе с помощью клавиш со стрелками вверх, вниз, вправо, влево переместите курсор ввода текста в конец строки, начинающейся со слова «linux», и допишите в конец строки: « enforcing=0». | ||
[[Файл:Ima1.png]] | [[Файл:Ima1.png]] | ||
| Строка 17: | Строка 181: | ||
Нажмите Ctrl+X или F10 для запуска ОС с измененными параметрами ядра. | Нажмите Ctrl+X или F10 для запуска ОС с измененными параметрами ядра. | ||
Если используется система без настроенного SELinux ( | Если используется система без настроенного SELinux (Роса Fresh, Роса Chrome), то выполнять данный пункт не требуется (однако, если его выполнить, не будет ни плохо, ни хорошо). | ||
==== Установка пакетов ==== | ==== Установка пакетов ==== | ||
Установите необходимые пакеты: | Установите необходимые пакеты: | ||
sudo dnf install ima-evm-utils libressl audit ima-inspect | sudo dnf install ima-evm-utils libressl audit ima-inspect | ||
Во многих дистрибутивах | |||
Во многих дистрибутивах Росы все эти пакеты уже установлены, в таком случае пакетный менеджер dnf сообщит об этом при выполнении приведенной выше команды. | |||
=== Создание ключей === | === Создание ключей === | ||
| Строка 31: | Строка 196: | ||
Закрытым ключом подписываются файлы, следовательно, к нему не должно быть доступа у тех, кто не должен иметь возможности подписать файлы, и рекомендуется хранить его отдельно, а не на машине, где выполняется запуск подписанных исполняемых файлов. | Закрытым ключом подписываются файлы, следовательно, к нему не должно быть доступа у тех, кто не должен иметь возможности подписать файлы, и рекомендуется хранить его отдельно, а не на машине, где выполняется запуск подписанных исполняемых файлов. | ||
Открытый ключ должен быть установлен на каждой системе, на которой производится запуск подписанных исполняемых файлов, он используется для проверки валидности подписи. Открытый ключ хранится на диске и загружается в | Открытый ключ должен быть установлен на каждой системе, на которой производится запуск подписанных исполняемых файлов, он используется для проверки валидности подписи. Открытый ключ хранится на диске и загружается в ключевую систему ядра в initrd. | ||
Ниже описано создание ключевой пары по ГОСТ. Возможно применение RSA. | Ниже описано создание ключевой пары по ГОСТ. Возможно применение RSA. | ||
| Строка 41: | Строка 206: | ||
su - | su - | ||
Создайте каталог «ima»: | Создайте каталог «ima»: | ||
mkdir -p ima | mkdir -p ima | ||
Переведите терминал в него: | Переведите терминал в него: | ||
| Строка 53: | Строка 220: | ||
nano x509.conf | nano x509.conf | ||
и вставьте текст ниже: | и вставьте текст ниже: | ||
<pre> | <pre> | ||
| Строка 79: | Строка 247: | ||
Теперь создайте пару ключей: | Теперь создайте пару ключей: | ||
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 | |||
<code>ima_cert.der</code> — открытый ключ, <code>ima_priv.pem</code> — закрытый. | |||
ima_cert.der — открытый ключ, ima_priv.pem — закрытый. | |||
[[Файл:Ima3.png]] | [[Файл:Ima3.png]] | ||
| Строка 93: | Строка 256: | ||
mkdir -p /etc/keys/ima | mkdir -p /etc/keys/ima | ||
Все ключи из этого каталога будут импортированы в ядро на этапе initrd. | Все ключи из этого каталога будут импортированы в ядро на этапе initrd. | ||
| Строка 98: | Строка 262: | ||
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: | Строка 323: | ||
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: | Строка 330: | ||
Теперь необходимо подписать все исполняемые файлы, в т.ч. скрипты, иные файлы, которые 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: | Строка 368: | ||
chmod 755 sign.sh | chmod 755 sign.sh | ||
И запустите его: | И запустите его: | ||
./sign.sh | ./sign.sh | ||
Выведите лог ошибок: | Выведите лог ошибок: | ||
cat failed.log | cat failed.log | ||
и убедитесь, что этот файл пуст, а значит в процессе подписывания не возникло ошибок. | и убедитесь, что этот файл пуст, а значит в процессе подписывания не возникло ошибок. | ||
=== Подготовка | === Подготовка файловой системы к запуску со включенной IMA === | ||
Если используется файловая система ext4, то необходимо добавить опцию монтирования "iversion". На большинстве типовых установок | Если используется файловая система 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: | Строка 399: | ||
systemctl enable auditd | systemctl enable auditd | ||
Если команда ничего не выдала, то значит служба auditd уже была включена, никаких дополнительных действий предпринимать не надо. | Если команда ничего не выдала, то значит служба auditd уже была включена, никаких дополнительных действий предпринимать не надо. | ||
| Строка 232: | Строка 406: | ||
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 | ||
=== Пробный запуск подписанной системы === | === Пробный запуск подписанной системы === | ||
| Строка 252: | Строка 430: | ||
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: | Строка 465: | ||
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: | Строка 480: | ||
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: | Строка 502: | ||
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). | ||
Версия от 15:54, 25 июня 2026
Введение
Эта статья описывает включение и использование замкнутой программной среды (IMA) в ОС Роса.
Решаемая задача: запрет запуска исполняемых файлов недоверенного происхождения. Администратор сам управляет списком доверенных ключей.
Фиксируется состояние системы путем подписывания имеющихся в ней файлов, а иные файлы не могут быть запущены, а неподписанные разделяемые библиотеки не смогут быть загружены, в т.ч. путем dlopen().
На Росе 13 (платформа rosa13) пакеты из репозиториев уже содержат IMA-подписи, а ключ и политика входят в пакет imactl, поэтому включение замкнутой среды выполняется тремя простыми командами (см. раздел Роса 13). Подписывать вручную нужно только файлы, не входящие в пакеты из репозитория Росы.
На Росе 12 и более ранних (Роса Fresh/Chrome 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.
Для включения замкнутой программной среды выполните три шага.
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, если по какой-то причине требуется полностью ручная настройка (например, нужно использовать собственную политику или собственный ключ для всех файлов системы). Для Роса Fresh/Chrome 12 (платформа rosa2021.1) и Роса Nickel (платформа rosa2019.05) ручная настройка — единственный способ, поскольку IMA-подписей в пакетах нет: создаётся ключевая пара, подписываются все исполняемые файлы и библиотеки, формируется политика IMA и пересобирается initrd.
Подготовка
Запуск с разрешающим SELinux
Если используется система со включенным SELinux (Никель), то необходимо запустить её с SELinux в разрешающем (permissive) режиме. Для этого при включении системы в загрузчике Grub выберите нужный пункт меню и нажмите клавишу с латинской буквой E, введите логин ("root") и пароль от загрузчика, в открывшемся текстовом редакторе с помощью клавиш со стрелками вверх, вниз, вправо, влево переместите курсор ввода текста в конец строки, начинающейся со слова «linux», и допишите в конец строки: « enforcing=0».
Нажмите Ctrl+X или F10 для запуска ОС с измененными параметрами ядра.
Если используется система без настроенного SELinux (Роса Fresh, Роса Chrome), то выполнять данный пункт не требуется (однако, если его выполнить, не будет ни плохо, ни хорошо).
Установка пакетов
Установите необходимые пакеты:
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





