IMA EVM

Материал из ALT Linux Wiki
Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.


Подсистема IMA/EVM

IMA/EVM (Integrity Measurement Architecture and Extended Verification Module) — подсистема ядра Linux, позволяющая осуществлять контроль целостности файловой системы. 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

Настройка контроля целостности

Для настройки контроля целостности необходимо выполнить следующие действия:

  1. Изменить параметры монтирования файловой системы. Для этого следует выставить параметр 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
    
  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
    
  3. Запустить инициализацию системы контроля целостности:
    # /usr/bin/integrity-applier
    
    Необходимо дождаться завершения работы команды (система будет перезагружена четыре раза). Выполнение этой команды может занять довольно продолжительное время (подписываются все файлы системы).
  4. После четвертой пер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
    
  5. Переименовать файл записи аудита /var/log/audit/audit.log:
    # mv /var/log/audit/audit.log /var/log/audit/audit_old.log
    
  6. Выполнить запуск аудита:
    # service auditd start
    
  7. Включить службы 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-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

Для того чтобы система сохранила все настройки безопасности установку/обновление пакетов необходимо производить в следующем порядке:

  1. Установить пакеты/обновить систему при помощи apt-get;
  2. Выполнить команду для инициализации контроля целостности:
    # /usr/bin/integrity-applier
    
  3. Дождаться завершения работы команды (система будет перезагружена четыре раза);
  4. Переименовать файл записи аудита /var/log/audit/audit.log:
    # mv /var/log/audit/audit.log /var/log/audit/audit_old.log
    
  5. Выполнить запуск аудита:
    # service auditd start
    

Команда updater-start

Для того чтобы система сохранила все настройки безопасности для установки/обновления пакетов может использоваться команда updater-start (из пакета updater).

В результате запуска данной команды будет обновлена система и ядро системы, а также включена система контроля целостности ima-evm. Необходимо дождаться завершения работы команды (система будет несколько раз перезагружена).

Примечание: Выполнение команды может занять довольно продолжительное время (время зависит от количества установленных в системе файлов).


Примечание: Если после отработки команды updater-start не запускается сервис auditd, необходимо переименовать/удалить старый журнал аудита (/var/log/audit/audit.log) и выполнить команду systemctl start auditd:
# mv /var/log/audit/audit.log /var/log/audit/audit.log_old
# systemctl start auditd


Команда updater-start также запускает скрипты из /etc/updater.d/* c параметром remove перед установкой пакетов и их же с параметром apply после.

Примечание: При активированном мандатном контроле доступа все исполняемые скрипты в /etc/updater.d/ должны иметь метку integrity_protected_t.


Например, если используется control++ со списками, то в /etc/updater.d/ нужно положить скрипт, вызывающий сontrol++ и cнимающий списки доустановки пакетов и устанавливающий их после установки. Последовательность действий:

  1. В каталоге /etc/updater.d создать файл (название произвольное) с содержимым:
    #!/bin/bash
    if [ "$1" == "remove" ] ;
     then
      control++ reset
     fi
    if [ "$1" == "apply" ] ;
     then
      control++ blacklist
     fi
    
  2. Сделать этот файл исполняемым:
    # chmod +x /etc/updater.d/<имя_файла>
    
  3. Установить на файл selinux тип integrity_protected_t:
    # chcon -t integrity_protected_t /etc/updater.d/<имя_файла>
    
  4. Запустить обновление:
    # updater-start
    
  5. Переименовать файл записи аудита /var/log/audit/audit.log:
    # mv /var/log/audit/audit.log /var/log/audit/audit_old.log
    
  6. Выполнить запуск аудита:
    # service auditd start