IMA

Материал из Rosalab Wiki
Версия от 15:31, 9 марта 2021; Keleg (обсуждение | вклад)

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

Введение

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

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

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

Описанные команды следует запускать от пользователя, где указано sudo — от пользователя с правами sudoers или от root без sudo.

При использовании системы со включенным SELinux загрузитесь в режиме permissive (enforcing=0).

Это предварительная версия инструкции. Система будет дорабатываться.

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

Подготовка

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

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

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

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

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

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

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

В текущей рабочей папке терминала создайте файл 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 являются произвольными, можно заменить их на свои. Месторасположение файла не играет роли, он нужен только для создания пары ключей один раз.

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

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 — закрытый.

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

sudo mkdir -p /etc/keys/ima

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

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

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

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

Создайте файл /etc/sysconfig/ima-policy (запуская текстовый редактор с правами root) со следующим содержимым:

# 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

appraise func=BPRM_CHECK appraise_type=imasig
appraise func=BPRM_CHECK appraise_type=imasig
appraise func=FILE_MMAP mask=MAY_EXEC appraise_type=imasig
appraise func=FILE_MMAP 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

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

sudo chmod 0400 /etc/sysconfig/ima-policy

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

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

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

Для подписывания выполните следующие действия:

FS="$(findmnt --output FSTYPE / | tail -n1)"
echo "$FS"
touch 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

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

Выполните

cat failed.log

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

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

Создайте файл /etc/dracut.conf.d/10-ima.conf (запуская текстовый редактор с правами root) со следующим содержимым:

add_dracutmodules+=" integrity "

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

sudo systemd-initramfs-gen

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

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

Запустите систему с добавлением

 ima_appraise=log

в cmdline ядра, добавив это непосредственно в загрузчике Grub или в /etc/default/grub в переменной GRUB_CMDLINE_LINUX_DEFAULT и выполнив sudo update-grub2.

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

 sudo grep -i ima /var/log/audit/audit.log

Должно быть пусто. На системах с мандатной защитой нужно иметь права на чтение логов аудита (secadm_r).

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

[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. Система должна запуститься и работать штатно.

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

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

 cp -v /bin/cat cat.copy

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

 chmod +x cat.copy

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

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

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

# 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