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

Материал из Rosalab Wiki
Перейти к: навигация, поиск
 
(не показана 31 промежуточная версия 3 участников)
Строка 1: Строка 1:
 
== Введение ==
 
== Введение ==
  
Эта статья описывает настройки и использование замкнутой программной среды в ОС ROSA rosa2019.1 (R12+), rosa2019.05 (Nickel).
+
Эта статья описывает настройки и использование замкнутой программной среды в ОС ROSA rosa2021.1 (Fresh/Chrome 12+), rosa2019.05 (Nickel).
  
 
'''Решаемая задача: запрет запуска исполняемых файлов недоверенного происхождения.''' Администратор сам управляет списком доверенных ключей.
 
'''Решаемая задача: запрет запуска исполняемых файлов недоверенного происхождения.''' Администратор сам управляет списком доверенных ключей.
  
Фиксируется состояние системы путем подписывания имеющихся в ней файлов, а иные файлы не могут быть запущены.
+
Фиксируется состояние системы путем подписывания имеющихся в ней файлов, а иные файлы не могут быть запущены, а неподписанные разделяемые библиотеки не смогут быть загружены, в т.ч. путем dlopen().
  
Описанные команды следует запускать от пользователя, где указано sudo — от пользователя с правами sudoers или от root без sudo.
+
== Настройка замкнутой программной среды ==
  
При использовании системы со включенным SELinux загрузитесь в режиме permissive (enforcing=0).
+
=== Подготовка ===
  
Это предварительная версия инструкции. Система будет дорабатываться.
+
==== Запуск с разрешающим SELinux ====
  
== Настройка замкнутой программной среды ==
+
Если используется система со включенным SELinux (Никель), то необходимо ее запустить с SELinux в разрешающем (permissive) режиме. Для этого при включении системы в загрузчике Grub выберите нужный пункт меню и нажмите клавишу с латинской буквой E, введите логин ("root") и пароль от загрузчика, в открывшемся текстовом редакторе с помощью клавиш со стрелками вверх, вниз, вправо, влево переместите курсор ввода текста в конец строки, начинающейся со слова «linux», и допишите в конец строки: « enforcing=0».
  
=== Подготовка ===
+
[[File:2022-04-13_06-00.png]]
 +
 
 +
Нажмите Ctrl+X или F10 для запуска ОС с измененными параметрами ядра.
 +
 
 +
Если используется система без настроенного SELinux (ROSA Fresh, ROSA Chrome), то выполнять данный пункт не требуется (однако, если его выполнить, не будет ни плохо, ни хорошо).
 +
 
 +
==== Установка пакетов ====
  
 
Установите необходимые пакеты:
 
Установите необходимые пакеты:
  sudo dnf install ima-evm-utils libressl audit ima-inspect
+
  sudo dnf install ima-evm-utils libressl audit ima-inspect audit
 +
 
 +
Во многих дистрибутивах ROSA все эти пакеты уже установлены, в таком случае пакетный менеджер dnf сообщит об этом при выполнении приведенной выше команды.
  
 
=== Создание ключей ===
 
=== Создание ключей ===
Строка 30: Строка 38:
 
Ниже описано создание ключевой пары по ГОСТ. Возможно применение RSA.
 
Ниже описано создание ключевой пары по ГОСТ. Возможно применение RSA.
  
Создайте файл x509.conf со следующим текстом:
+
Откройте консоль root командой:
 +
sudo -i
 +
или:
 +
su -
 +
Создайте каталог «ima»:
 +
mkdir -p ima
 +
Переведите терминал в него:
 +
cd ima
 +
 
 +
[[File:2022-04-13_04-00.png]]
 +
 
 +
Создайте файл x509.conf с приведенным ниже текстом. Для создания файла откройте консольный текстовый редактор, например, nano, командой:
 +
nano x509.conf
 +
и вставьте текст ниже:
  
 
<pre>
 
<pre>
Строка 52: Строка 73:
  
 
Значения полей O, CN, emailAddress являются произвольными, можно заменить их на свои.
 
Значения полей 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
 
  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 — закрытый.
 
ima_cert.der — открытый ключ, ima_priv.pem — закрытый.
 +
 +
[[File:2022-04-13_04-20.png]]
  
 
Создайте каталог с открытыми ключами:
 
Создайте каталог с открытыми ключами:
  sudo mkdir -p /etc/keys/ima
+
  mkdir -p /etc/keys/ima
 
Все ключи из этого каталога будут импортированы в ядро на этапе initrd.
 
Все ключи из этого каталога будут импортированы в ядро на этапе initrd.
  
 
Скопируйте созданный открытый ключ в этот каталог:
 
Скопируйте созданный открытый ключ в этот каталог:
  sudo cp -v ima_cert.der /etc/keys/ima/ima_cert.der
+
  cp -v ima_cert.der /etc/keys/ima/ima_cert.der
 +
И дополнительно в другой каталог для работы <code>evmctl ima_verify</code>:
 +
cp -v ima_cert.der /etc/keys/x509_evm.der
  
 
=== Создание политики IMA ===
 
=== Создание политики IMA ===
  
Создайте файл /etc/sysconfig/ima-policy (с правами root) со следующим содержимым:
+
Продолжая работать в консоли root, создайте файл /etc/sysconfig/ima-policy
 +
 
 +
Если используется редактор nano, то для этого выполните:
 +
nano /etc/sysconfig/ima-policy
 +
Скопируйте и вставьте текст ниже, нажмите Ctrl+O, Enter, Ctrl+X.
  
 
<pre>
 
<pre>
Строка 104: Строка 135:
 
dont_measure fsmagic=0x6e736673
 
dont_measure fsmagic=0x6e736673
 
dont_appraise fsmagic=0x6e736673
 
dont_appraise fsmagic=0x6e736673
 
+
measure func=MMAP_CHECK mask=MAY_EXEC
appraise func=BPRM_CHECK fowner=0 appraise_type=imasig
+
measure func=BPRM_CHECK mask=MAY_EXEC
appraise func=BPRM_CHECK euid=0 appraise_type=imasig
+
appraise func=BPRM_CHECK mask=MAY_EXEC appraise_type=imasig
appraise func=FILE_MMAP fowner=0 mask=MAY_EXEC appraise_type=imasig
+
appraise func=MMAP_CHECK mask=MAY_EXEC appraise_type=imasig
appraise func=FILE_MMAP euid=0 mask=MAY_EXEC appraise_type=imasig
+
#appraise func=MODULE_CHECK appraise_type=imasig
+
#appraise func=FIRMWARE_CHECK appraise_type=imasig
+
# this is only for newer kernels that support loading policies
+
# from file by writing the file path to the ima sysfs node
+
#appraise func=POLICY_CHECK appraise_type=imasig
+
 
</pre>
 
</pre>
 +
 +
Выставьте права на этот файл:
 +
chmod 0400 /etc/sysconfig/ima-policy
 +
В целом все равно, какие на него права, но в процессе работы системы содержимое политики доступно по адресу /sys/kernel/security/ima/policy с правами 0400, поэтому для единообразия запретим всем, кроме root, читать этот файл. Так нельзя будет узнать применяемую политику IMA без root-прав.
  
 
=== Подписывание файлов в системе ===
 
=== Подписывание файлов в системе ===
Строка 120: Строка 149:
 
Теперь необходимо подписать все исполняемые файлы, в т.ч. скрипты, иные файлы, которые mmap()-ятся с PROT_EXEC, в т.ч. разделяемые библиотеки *.so*.
 
Теперь необходимо подписать все исполняемые файлы, в т.ч. скрипты, иные файлы, которые mmap()-ятся с PROT_EXEC, в т.ч. разделяемые библиотеки *.so*.
  
Для подписывания выполните следующие действия:
+
Продолжая работать в root-консоли, создайте файл sign.sh
 +
 
 +
Если используется редактор nano, то выполните команду:
 +
nano sign.sh
 +
Скопируйте и вставьте в редактор текст ниже, нажмите Ctrl+O, Enter, Ctrl+X.
 +
 
 
<pre>
 
<pre>
 +
#!/bin/bash
 +
set -xe
 +
 
FS="$(findmnt --output FSTYPE / | tail -n1)"
 
FS="$(findmnt --output FSTYPE / | tail -n1)"
 
echo "$FS"
 
echo "$FS"
touch failed.log
+
echo > failed.log
  
set -x; 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 ; set +x
+
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
  
set -x;  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; set +x
+
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
 
</pre>
 
</pre>
  
Выполните
+
[[File:2022-04-13_04-30.png]]
 +
 
 +
Сделайте этот скрипт исполняемым:
 +
chmod 755 sign.sh
 +
И запустите его:
 +
./sign.sh
 +
 
 +
Выведите лог ошибок:
 
  cat failed.log
 
  cat failed.log
 
и убедитесь, что этот файл пуст, а значит в процессе подписывания не возникло ошибок.
 
и убедитесь, что этот файл пуст, а значит в процессе подписывания не возникло ошибок.
  
=== Сборка initrd с поддержкой IMA ===
+
=== Подготовка к файловой системы к запуску со включенной IMA ===
  
Создайте файл /etc/dracut.conf.d/10-ima.conf (с правами root) со следующим содержимым:
+
Если используется файловая система ext4, то необходимо добавить опцию монтирования "iversion". На большинстве типовых установок ROSA это можно сделать следующей командой:
 
<pre>
 
<pre>
add_dracutmodules+=" integrity "
+
sed -i.bak -e 's!\([[:space:]]/[[:space:]].*ext4[[:space:]].*defaults\)!\1,iversion!' /etc/fstab
 
</pre>
 
</pre>
 +
Она добавит "iversion" в опции монтирования корня системы в файле /etc/fstab. Резервная копия файла до изменений будет сохранена по адресу /etc/fstab.bak. Выполните:
 +
diff -u --color /etc/fstab.bak /etc/fstab
 +
и удостоверьтесь, что изменения между файлами правильные. Ниже приведен пример правильных изменений.
  
Пересобериет initrd:
+
В случае необходимости отредактируйте файл /etc/fstab самостоятельно вместо применения приведенной выше команды.
sudo systemd-initramfs-gen
+
  
Обратите внимание, что в initrd должны попасть уже подписанные файлы.
+
[[Файл:2022-04-13 05-13.png]]
 +
 
 +
=== Включение auditd ===
 +
 
 +
Выполните от root:
 +
systemctl enable auditd
 +
 
 +
Если команда ничего не выдала, то значит служба auditd уже была включена, никаких дополнительных действий предпринимать не надо.
 +
 
 +
=== Сборка initrd с поддержкой IMA ===
 +
 
 +
Добавьте модуль integrity в initrd:
 +
echo 'add_dracutmodules+=" integrity "' | tee /etc/dracut.conf.d/10-ima.conf
 +
 
 +
Пересоберите initrd:
 +
systemd-initramfs-gen
 +
 
 +
Обратите внимание, что в initrd должны попасть уже подписанные файлы, поэтому данный шаг выполняется после подписывания файлов в системе.
  
 
=== Пробный запуск подписанной системы ===
 
=== Пробный запуск подписанной системы ===
  
Запустите систему с добавлением
+
Осуществите пробный запуск системы с добавлением "ima_appraise=log" в cmdline ядра, для этого при включении системы в загрузчике Grub выберите нужный пункт меню и нажмите клавишу с латинской буквой E, при необходимости введите логин и пароль от загрузчика, в открывшемся текстовом редакторе с помощью клавиш со стрелками вверх, вниз, вправо, влево переместите курсор ввода текста в конец строки, начинающейся со слова «linux», и допишите в конец строки: « ima_appraise=log».
  ima_appraise=log
+
 
в cmdline ядра, добавив это непосредственно в загрузчике Grub или в /etc/default/grub в переменной GRUB_CMDLINE_LINUX_DEFAULT и выполнив sudo update-grub2.
+
[[File:2022-04-13_05-31.png||800px]]
 +
 
 +
Нажмите Ctrl+X или F10 для запуска ОС с измененными параметрами ядра.
 +
 
 +
В этом режиме система не будет запрещать запуск неподписанных файлов, но будет записывать попытки их запуска.
 +
 
 +
Откройте консоль root с помощью команды:
 +
sudo -i
 +
или:
 +
su -
 +
 
 +
Если вы используете ОС с мандатной защитой (Никель), то в этой консоли после входа в root также выполните:
 +
newrole -r secadm_r
  
В этом режиме система не будет запрещать запуск неподписанных файлов, но будет записывать попытки их запуска. Посмотрите, нет ли в логе событий безопасности сообщений от IMA:
+
Посмотрите, нет ли в логе событий безопасности сообщений от IMA:
  sudo grep -i ima /var/log/audit/audit.log
+
strings /var/log/audit/audit.log | grep IMA
Должно быть пусто. На системах с мандатной защитой нужно иметь права на чтение логов аудита (secadm_r).
+
Должно быть пусто.
  
 
Проверьте наличие подписи у файлов:
 
Проверьте наличие подписи у файлов:
Строка 185: Строка 273:
 
=== Боевой запуск и проверка работы ===
 
=== Боевой запуск и проверка работы ===
  
Запустите без ima_appraise=log. Система должна запуститься и работать штатно.
+
Запустите без ima_appraise=log, то есть просто перезагрузите систему. Система должна запуститься и работать штатно.
  
 
Теперь проверим работу защиты от запуска неподписанных исполняемых файлов.
 
Теперь проверим работу защиты от запуска неподписанных исполняемых файлов.
 +
 +
Войдите в root-консоль с помощью команды:
 +
sudo -i
 +
или:
 +
su -
  
 
Создайте копию существующего исполняемого файла:
 
Создайте копию существующего исполняемого файла:
Строка 193: Строка 286:
 
Дайте ему права на исполнение:
 
Дайте ему права на исполнение:
 
   chmod +x cat.copy
 
   chmod +x cat.copy
Попробуйте его запустить и получите ошибку:
+
 
 +
Попробуйте его запустить командой:
 +
./cat.copy
 +
Получите ошибку:
 
<pre>
 
<pre>
$ ./cat.copy
 
 
-bash: ./cat.copy: Отказано в доступе
 
-bash: ./cat.copy: Отказано в доступе
 
</pre>
 
</pre>
  
При этом в логе аудита появляется запись о запрете запуска неподписанного файла:
+
При этом в логе аудита появляется запись о запрете запуска неподписанного файла.
 +
 
 +
Если вы используете ОС с мандатной защитой (Никель), то в этой консоли выполните:
 +
newrole -r secadm_r
 +
 
 +
В логе будет сообщение с текстом "cause=IMA-signature-required", чтобы его увидеть, в этой же консоли выполняем команду:
 +
strings /var/log/audit/audit.log | grep IMA
 +
 
 +
Ее вывод будет похож на следующий:
 
<pre>
 
<pre>
# grep -i ima /var/log/audit/audit.log | tail -n 1
 
 
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
 
</pre>
 
</pre>
 +
 +
Это говорит о работоспособности замкнутой программной среды (IMA).
 +
 +
Удалите более ненужный файл:
 +
rm -fv cat.copy
 +
 +
[[Категория:ROSA Server]]

Текущая версия на 16:33, 6 февраля 2023

Введение

Эта статья описывает настройки и использование замкнутой программной среды в ОС ROSA rosa2021.1 (Fresh/Chrome 12+), rosa2019.05 (Nickel).

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

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

Настройка замкнутой программной среды

Подготовка

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

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

2022-04-13 06-00.png

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

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

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

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

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

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

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

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

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

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

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

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

sudo -i

или:

su -

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

mkdir -p ima

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

cd ima

2022-04-13 04-00.png

Создайте файл 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 — закрытый.

2022-04-13 04-20.png

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

mkdir -p /etc/keys/ima

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

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

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

И дополнительно в другой каталог для работы evmctl ima_verify:

cp -v ima_cert.der /etc/keys/x509_evm.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
# 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
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

2022-04-13 04-30.png

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

chmod 755 sign.sh

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

./sign.sh

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

cat failed.log

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

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

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

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

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

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

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

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

2022-04-13 05-13.png

Включение auditd

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

systemctl enable auditd

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

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

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

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

Пересоберите initrd:

systemd-initramfs-gen

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

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

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

2022-04-13 05-31.png

Нажмите 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