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. Настроить контроль целостности. Желаемый алгоритм хеширования (SHA или ГОСТ) можно выбрать в файле /etc/sysconfig/integrity. Там же можно включить EVM в дополнение к IMA. При необходимости внесения изменений в политику, нужно скопировать файл /usr/share/integrity/policy в /etc/integrity/policy и там внести требуемые изменения. К примеру, для активации контроля целостности модулей ядра добавить в конец файла политики следующие строки:
    audit func=MODULE_CHECK
    measure func=MODULE_CHECK
    appraise func=MODULE_CHECK
    
  3. Запустить инициализацию системы контроля целостности:
    # /usr/bin/integrity-applier
    
    В результате выполнения команды система будет автоматически перезагружена. После перезагрузки нужно запустить службу signing, введя команду
    # systemctl signing start
    
    и дождаться завершения работы службы. После этого произвести перезагрузку системы вручную.
  4. После перезагрузки можно проверить параметры загрузки ядра с помощью команды:
    $ cat /proc/cmdline
    
    (в командной строке ядра должен присутствовать параметр ima_appraise=enforce).
  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