IMA EVM
Подсистема IMA/EVM
IMA/EVM (Integrity measurement architecture and Extended verification module) — подсистема, позволяющая осуществлять контроль целостности файловой системы. IMA включает в себя две подсистемы – IMA-measurement (измерение) и IMA-appraisal (оценка). Первая собирает хеш-образы файлов, вторая сравнивает собранный хеш с сохраненным хешем и запрещает доступ в случае несоответствия. Собранные хеш-образы хранятся в расширенных атрибутах файловой системы. Модуль расширенной проверки (EVM) предотвращает несанкционированные изменения этих расширенных атрибутов в файловой системе.
Подсистема целостности Linux позволяет использовать подписи IMA и EVM. Подпись EVM защищает метаданные файла, такие как атрибуты файла и расширенные атрибуты. Подпись IMA защищает содержимое файла.
Параметры командной строки ядра
К параметрам командной строки IMA относятся ima_appraise и ima_policy.
ima_appraise может принимать 1 из 4 значений:
- enforce – «жесткий» режим, разрешает запуск программ только при прохождении проверки. В этом режиме IMA оценивает файлы в соответствии с политикой. Доступ к оцениваемому файлу запрещается, если хеш отсутствует или не соответствует собранному значению;
- log – режим «журналирования», аналогичен «жесткому» режиму, за исключением того, что доступ к измененному файлу не запрещается, а будет только зарегистрирован;
- off – отключает все оценки. Сохраненные хеши не проверяются, и новые хеши не создаются и не обновляются;
- fix – «мягкий» режим, используется на этапе настройке системы и разрешает запуск любых программ, регистрируя события несанкционированного доступа в журнале. Запуск в этом режиме применяется для первичной маркировки системы.
ima_policy может принимать 1 из 3 значений:
- tcb – измеряет все исполняемые файлы, все файлы, помеченные для выполнения (например, разделяемые библиотеки), все загруженные модули ядра и все загруженные прошивки. Кроме того, измеряются также файлы, открытые для чтения пользователем root;
- appraise_tcb – оценивает все файлы, принадлежащие пользователю root;
- secure_boot – оценивает все загруженные модули, прошивку, ядро и политики IMA.
ima_policy может быть указано несколько раз, и результатом является объединение политик.
Опция монтирования iversion
Добавление опции монтирования iversion (номер версии структуры данных увеличивается каждый раз, когда структура данных изменяется) позволяет оптимизировать IMA: хэш файла будет пересчитываться только тогда, когда он фактически изменяется, а не каждый раз, когда файл открывается.
Утилиты
Утилита evmctl может использоваться для создания и проверки цифровых подписей, которые используются подсистемой целостности ядра Linux (IMA/EVM), а также для добавления ключей в набор ключей ядра.
Команды проверки целостности файла /bin/ping:
# integrity-sign --stdin --verbose --verify
/bin/ping
integrity-sign: /bin/ping: OK
evmctl -v ima_verify /bin/ping
/bin/ping: verification is OK
Журнал целостности, зарегистрированный подсистемой IMA, хранится в файле /sys/kernel/security/ima/ascii_runtime_measurements:
# less /sys/kernel/security/ima/ascii_runtime_measurements
10 457a77e270cece2273d063f3e5368d367090be5a ima-ng sha1:782eacd35c1efadb33a4a64c24057cd231dae5ff /bin/sleep
10 e57560dbf485ee91853f800629bbc2995d9e4520 ima-ng sha1:581f0675aee3da04fa8b97a7010257c9f18ba8bf /bin/rm
Настройка контроля целостности
Для настройки контроля целостности необходимо выполнить следующие действия:
- Изменить параметры монтирования файловой системы. Для этого следует выставить параметр iversion на всех записях в файле /etc/fstab относящихся к местам, где могут быть исполняемые файлы:
# vim /etc/fstab UUID=c7834d14-d0f0-4d70-94f5-f1ce09fda00c / ext4 relatime,iversion 1 1 UUID=16b090bf-8b7a-4e69-8df6-6a4374f3d550 /home ext4 noexec,nosuid,relatime,iversion 1 2
- Настроить политику контроля целостности, для этого скопировать политику в /etc/integrity/policy:
# cp /usr/share/doc/ima-evm-integrity-check-*/policy.example /etc/integrity/policy
- Для активации контроля целостности модулей ядра добавить в конец файла политики (/etc/integrity/policy), следующие строки:
audit func=MODULE_CHECK measure func=MODULE_CHECK appraise func=MODULE_CHECK
- Запустить инициализацию системы контроля целостности:
# /usr/bin/integrity-applier
- Необходимо дождаться завершения работы команды (система будет перезагружена четыре раза). Выполнение этой команды может занять довольно продолжительное время (подписываются все файлы системы).
- После четвертой перtзагрузки можно проверить параметры загрузки ядра с помощью команды (в командной строке ядра должны присутствуют параметры ima_appraise=enforce evm=enforce):
$ cat /proc/cmdline BOOT_IMAGE=/boot/vmlinuz root=UUID=f8e4db06-25bc-4f5f-bc26-e908da5bd16c ro quiet=1 resume=/dev/disk/by-uuid/beafe88b-4a8b-43bd-9662-91d4e534c71c panic=30 splash ipv6.disable=1 security=selinux selinux=1 smem=1 ima_appraise=enforce evm=enforce ima_hash=sha1
- Переименовать файл записи аудита /var/log/audit/audit.log:
# mv /var/log/audit/audit.log /var/log/audit/audit_old.log
- Выполнить запуск аудита:
# service auditd start
- Включить службы integrity-notifier и integrity-scanner:
# systemctl enable integrity-notifier # systemctl start integrity-notifier # systemctl enable integrity-scanner # systemctl start integrity-scanner
Система будет работать с включенным контролем исполняемых файлов.
Перед запуском программы система проверяет хеш-образ файла с сохраненным значением. Если образы не совпадают, то любой доступ к этому файлу будет отклонен с ошибкой «Отказано в доступе».
В журнале будут фиксироваться попытки нарушения целостности (invalid-signature):
# journalctl –r | grep invalid-signature
Пример вывода:
янв 04 16:34:24 host-15.localdomain audit[1750]: INTEGRITY_DATA pid=1750 uid=0 auid=64 ses=2 subj=officer_u:officer_r:officer_t:s0-s3:c0.c15 op="appraise_data" cause="invalid-signature" comm="bash" name="/usr/bin/tgz" dev="sda2" ino=657342 res=0
Контроль целостности при загрузке
Проверить, что сервис контроля целостности при загрузке активирован, можно выполнив команду:
# systemctl is-enabled integalert
enabled
Если сервис не активирован, активировать его, выполнив команду:
# systemctl enable integalert
В случае выявления нарушения целостности при загрузке ОС выводится визуальное оповещение с обязательным подтверждением дальнейшей загрузки ОС. Система будет загружаться в однопользовательском режиме с запросом пароля суперпользователя:
login [root]:
Password:
Служба оповещения — integrity-notifier
Назначение службы integrity-notifier — оповестить пользователя в том случае, если была запущена повреждённая программа.
Сообщения из системного журнала с пометкой INTEGRITY_DATA фильтруются службой integrity-scanner и складываются в каталог
/var/log/integrityd/. В файле /var/log/integrityd/current поддерживается окно сообщений за установленный интервал времени (по умолчанию 5 минут). Старые записи складываются там же, с именами, начинающимися на "@" (по умолчанию 50 файлов максимум). Настройки по умолчанию можно изменить в файле /var/log/integrityd/config.
Служба оповещения (integrity-notifier) читает свежие сообщения из окна и оповещает соответствующих пользователей посредством команды write.
Сообщение, которое отправляется пользователю, настраивается в файле /etc/integrity/message. Это должен быть шаблон printf с количеством строковых аргументов не более 2 штук. По умолчанию используется строка:
You have attempted to run a damaged file: %s (%s)
Конфигурационный файл /etc/integrity/also состоит из набора имён тех пользователей, которых нужно оповещать о каждом событии INTEGRITY_DATA.
Предусмотрена программа для отправки оповещений на рабочий стол — /usr/bin/integrity-notifier. Она использует команду notify-send.
Текст заголовка и сообщения для оповещений на рабочий стол задаётся в файле /etc/integrity/desktop_message.
Могут быть и другие службы оповещения пользовательского уровня, также читающие сообщения из файла /var/log/integrityd/current.
Обновление системы
Команда integrity-applier
Для того чтобы система сохранила все настройки безопасности установку/обновление пакетов необходимо производить в следующем порядке:
- Установить пакеты/обновить систему при помощи apt-get;
- Выполнить команду для инициализации контроля целостности:
# /usr/bin/integrity-applier
- Дождаться завершения работы команды (система будет перезагружена четыре раза);
- Переименовать файл записи аудита /var/log/audit/audit.log:
# mv /var/log/audit/audit.log /var/log/audit/audit_old.log
- Выполнить запуск аудита:
# service auditd start
Команда updater-start
Для того чтобы система сохранила все настройки безопасности для установки/обновления пакетов может использоваться команда updater-start (из пакета updater).
В результате запуска данной команды будет обновлена система и ядро системы, а также включена система контроля целостности ima-evm. Необходимо дождаться завершения работы команды (система будет несколько раз перезагружена).
# mv /var/log/audit/audit.log /var/log/audit/audit.log_old
# systemctl start auditd
Команда updater-start также запускает скрипты из /etc/updater.d/* c параметром remove перед установкой пакетов и их же с параметром apply после.
Например, если используется control++ со списками, то в /etc/updater.d/ нужно положить скрипт, вызывающий сontrol++ и cнимающий списки доустановки пакетов и устанавливающий их после установки. Последовательность действий:
- В каталоге /etc/updater.d создать файл (название произвольное) с содержимым:
#!/bin/bash if [ "$1" == "remove" ] ; then control++ reset fi if [ "$1" == "apply" ] ; then control++ blacklist fi
- Сделать этот файл исполняемым:
# chmod +x /etc/updater.d/<имя_файла>
- Установить на файл selinux тип integrity_protected_t:
# chcon -t integrity_protected_t /etc/updater.d/<имя_файла>
- Запустить обновление:
# updater-start
- Переименовать файл записи аудита /var/log/audit/audit.log:
# mv /var/log/audit/audit.log /var/log/audit/audit_old.log
- Выполнить запуск аудита:
# service auditd start