Всем привет! Мы делаем проекты по Zabbix, накопили большую экспертизу и решили сделать переводы нескольких статей, которые нам показались интересными и полезными. Наверняка, будут полезны и вам. Также своим опытом делимся в телеграм-канале zabbix_ru, где вы можете найти полезные материалы и записи наших вебинаров, опубликованных на нашем ютуб-канале (прим. переводчика).

Миграция с MySQL на PostgreSQL — первая статья цикла переводов.

В этой статье подробно рассмотрены основы SELinux, его правильная интеграция с Zabbix и способы эффективного создания собственных политик SELinux для решения распространённых проблем. Также показано, как контролировать SELinux непосредственно в Zabbix, что поможет повысить безопасность системы и упростить повседневное администрирование.

Данное руководство предназначено для дистрибутивов на основе RPM (RHEL, CentOS, Rocky Linux, AlmaLinux, Fedora, …).

Что такое SELinux и как он работает?

SELinux (Security-Enhanced Linux) — это модуль безопасности Linux, реализующий обязательный контроль доступа (MAC). В отличие от стандартного дискреционного контроля доступа (DAC), где пользователи самостоятельно определяют разрешения для своих файлов, MAC применяет политики безопасности, управляемые администратором, ограничивая действия программ и пользователей на основе чётко определённых правил.

SELinux работает в трех режимах:

  • enforcing — политики применяются, а доступ активно блокируется при нарушении правил.

  • permissive — SELinux активен, но не блокирует доступ; он только регистрирует нарушения политики.

  • disabled – SELinux полностью отключен.

Проверить статус SELinux можно с помощью команды:

sestatus

Пример вывода:

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      33
  • enabled – SELinux активен.

  • enforcing – Политика применяется.

  • targeted – используется стандартная целевая политика.

Пакет Zabbix zabbix-selinux-policy

Пакет zabbix-selinux-policy содержит специальные правила SELinux, необходимые для бесперебойной работы сервера, прокси-сервера и агента Zabbix, без необходимости отключения SELinux. Пакет доступен в официальном репозитории Zabbix.

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

dnf install zabbix-selinux-policy

Временная деактивация SELinux

Если вам нужно быстро отключить SELinux, используйте:

setenforce 0
  • 0 означает переход в разрешительный режим (всё разрешено, только регистрируются нарушения).

  • 1 означает возврат в режим принудительного применения (нарушения блокируются и регистрируются).

Изменение действительно только до перезапуска системы . Проверьте текущий режим:

getenforce

Постоянная деактивация SELinux

Чтобы навсегда отключить SELinux, отредактируйте /etc/selinux/config:

nano /etc/selinux/config

Изменить:

SELINUX=enforcing

на:

SELINUX=disabled

Перезагрузите систему:

reboot

Повторное включение SELinux и перенастройка

Чтобы снова включить SELinux, рекомендуется сначала установить разрешающий режим , убедиться, что политики работают корректно, и только затем переключиться в принудительный режим. Сначала установите:

SELINUX=permissive

Затем установите перемаркировку:

touch /.autorelabel
reboot

Создайте файл .autorelabel в каталоге /. Этот процесс применит правильные контексты SELinux при следующей перезагрузке. Контекст файла — это метаданные, которые определяют, какие правила SELinux к нему применяются. Если перемаркировка не выполняется, файлы (например, /etc/passwd) могут иметь неправильные или отсутствующие контексты, что может привести к таким проблемам, как невозможность входа в систему.

Убедившись, что разрешающий режим работает как надо, можно переключиться на принудительный. Сначала обновите конфигурацию в /etc/selinux/config:

SELINUX=enforcing

Это изменение вступит в силу после перезапуска системы. Чтобы применить изменение немедленно, без перезагрузки, используйте команду:

setenforce 1

Создание пользовательских политик SELinux

Если SELinux блокирует операцию приложения zabbix_server, это можно определить по журналам auditd:

grep AVC /var/log/audit/audit.log | grep zabbix_server

Пример записи в журнале:

type=AVC msg=audit(1743521737.355:209): avc: denied { name_bind } for pid=1620 comm="zabbix_server" src=10055 scontext=system_u:system_r:zabbix_t:s0 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket permissive=0

Эта ошибка указывает на то, что SELinux не позволяет серверу Zabbix использовать порт 10055. Чтобы создать правило, разрешающее это действие, установите инструмент audit2allow:

dnf install policycoreutils policycoreutils-python-utils -y

Создание политики для сервера Zabbix

Выполните команду:

grep zabbix_server /var/log/audit/audit.log | audit2allow -m zabbix_server_policy > zabbix_server_policy.te

Что делает каждая часть:

  • grep zabbix_server /var/log/audit/audit.log: фильтрует журналы аудита, отображая только записи, относящиеся к серверу Zabbix.

  • audit2allow -m zabbix_server_policy: анализирует входные данные и генерирует предлагаемый модуль политики SELinux.

Пример содержимого файла zabbix_server_policy.te:

module zabbix_server_policy 1.0;

require {
	type krb5_keytab_t;
	type unreserved_port_t;
	type zabbix_t;
	class dir search;
	class tcp_socket name_bind;
}

#============= zabbix_t ==============
allow zabbix_t krb5_keytab_t:dir search;

#!!!! This avc can be allowed using the boolean 'nis_enable

Этот файл содержит правила, которые позволяют серверу Zabbix:

  • Использовать определенные порты (например, незарезервированные порты),

  • Просматривать каталоги, содержащие файлы ключей Kerberos (krb5_keytab_t).

module zabbix_server_policy 1.0;
→ Название и версия модуля.

require { ... }
→ Для работы модуля требуется доступ к следующему:

  • krb5_keytab_t→ ключевые файлы Kerberos (например /etc/krb5.keytab)

  • unreserved_port_t→ стандартные (незарезервированные) сетевые порты

  • zabbix_t→ процесс сервера Zabbix

  • dir search→ разрешение на обход каталогов

  • tcp_socket name_bind→ разрешение на привязку к TCP-порту

allow zabbix_t krb5_keytab_t:dir search;
→ Zabbix разрешен доступ к каталогу, содержащему ключ Kerberos.

#!!!! This avc can be allowed using the boolean 'nis_enable'
→ комментарий: аналогичное разрешение можно предоставить, включив логическое значение nis_enable.

Примечание по безопасности:
Этот пример также демонстрирует потенциальный недостаток автоматического создания правил с помощью audit2allow. Возможно, наряду с необходимыми разрешениями может быть предоставлен нежелательный доступ , например к файлам ключей Kerberos. Поэтому крайне важно внимательно проверить и отредактировать вывод audit2allow перед компиляцией и применением политики.

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

checkmodule -M -m -o zabbix_server_policy.mod zabbix_server_policy.te
semodule_package -o zabbix_server_policy.pp -m zabbix_server_policy.mod
semodule -i zabbix_server_policy.pp
  • checkmodule -M -m: Компилирует файл .te в модуль .mod.

  • semodule_package: Преобразует файл .mod в policy-пакет .pp.

  • semodule -i: Устанавливает сгенерированный пакет политики в систему SELinux.

Проверка применения политики:

semodule -l | grep zabbix_server_policy

На выходе должно появиться сообщение об установке zabbix_server_policy, подтверждающее, что политика была успешно применена к системе SELinux.

Чтобы составить список политик SELinux, например, связанных с Zabbix, используйте:

semodule -l | grep zabbix

Эта команда отображает все установленные в данный момент модули SELinux, содержащие в своем имени «zabbix».

zabbix
zabbix_server_policy

Если вы хотите узнать, какие правила включены в конкретный модуль SELinux (например, zabbix_server_policy), вы можете использовать следующий подход:

mkdir -p /tmp/policyview && \
cd /tmp/policyview && \
semodule --extract zabbix_server_policy && \
strings zabbix_server_policy.pp

Расширение существующей политики SELinux новым правилом

Если позже вам потребуется добавить еще одно правило в существующую политику, отредактируйте существующий файл .te (например, добавив еще одно правило allow), а затем повторите весь процесс компиляции и применения политики:

checkmodule -M -m -o zabbix_server_policy.mod zabbix_server_policy.te
semodule_package -o zabbix_server_policy.pp -m zabbix_server_policy.mod
semodule -i zabbix_server_policy.pp

SELinux автоматически обновляет существующую политику новыми правилами, не требуя удаления исходной политики.

grep zabbix_server /var/log/audit/audit.log | audit2allow -m zabbix_server_policy > zabbix_server_policy.te

Как удалить пользовательскую политику SELinux?

Используйте команду semodule:

semodule -r zabbix_server_policy

Мониторинг отклонений SELinux AVC с помощью Zabbix

Для мониторинга SELinux сначала необходимо разрешение на чтение соответствующего файла журнала. Безопасный подход заключается в перенаправлении его содержимого в отдельный файл, созданный специально для этой цели и доступный агенту Zabbix, вместо изменения прав доступа к исходным файлам системного журнала, что позволяет поддерживать стандарты безопасности системы.

Сообщения об отказе AVC в журнале выглядят так:

type=AVC msg=audit(1744268323.007:2345954): avc: denied { search } for pid=2102180 comm="zabbix_server" name="krb5" ...

Эти сообщения регистрируются в журнале аудита:
/var/log/audit/audit.log
Мы будем специально отслеживать эти сообщения.

Сначала создайте скрипт, который будет непрерывно отслеживать файл audit.log и отфильтровывает только сообщения AVC:

nano /usr/local/bin/selinux-denial-logger.sh

Содержание сценария:

#!/bin/bash

tail --follow=name /var/log/audit/audit.log | grep --line-buffered -E "avc:\s+denied" >> /var/log/selinux_denials.log

Затем установите права на исполнение для скрипта:

chmod +x /usr/local/bin/selinux-denial-logger.sh

Автоматический запуск скрипта с помощью systemd

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

nano /etc/systemd/system/selinux-denial-logger.service

Содержимое файла службы systemd:

[Unit]
Description=SELinux AVC Denial Logger by initMAX s.r.o.
After=auditd.service

[Service]
Type=simple
ExecStart=/usr/local/bin/selinux-denial-logger.sh
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Включите и запустите вновь созданную службу:

systemctl daemon-reload 
systemctl enable selinux-denial-logger.service --now

Проверьте, работает ли служба без проблем:

systemctl status selinux-denial-logger.service

Настройка ротации журналов с помощью logrotate

Чтобы файл журнала не разрастался слишком сильно, рекомендуется использовать инструмент logrotate для регулярной ротации.
Создайте конфигурацию ротации журнала с помощью команды:

nano /etc/logrotate.d/selinux_denials

Содержимое конфигурации logrotate:

/var/log/selinux_denials.log {
    weekly
    rotate 4
    missingok
    notifempty
    compress
    delaycompress
    create 0644 root root
    sharedscripts
    postrotate
        systemctl restart selinux-denial-logger.service > /dev/null 2>&1 || true
    endscript
}

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

Импорт шаблонов и требования

Для мониторинга SELinux с помощью Zabbix мы подготовили специальный шаблон SELinux, который можно легко импортировать на ваш сервер Zabbix.

Требования

  • Версия Zabbix: 7.0 или выше

  • Агент Zabbix: рекомендуется использовать Zabbix Agent 2 (требуется для systemd.unit.info и более простой интеграции)

  • Агент Zabbix: для использования ключей log* агент должен работать в активном режиме (активные проверки)

  • Система с SELinux: например, RHEL, AlmaLinux, CentOS Stream, Fedora и т. д.

  • Агент: должен иметь доступ к следующим файлам (обычно разрешен по умолчанию):

    • /sys/fs/selinux/enforce

    • /etc/selinux/config

    • /var/log/selinux_denials.log– файл, сгенерированный внешним скриптом (см. выше)

Шаблон можно загрузить здесь: https://git.initmax.cz/initMAX-Public/zabbix-templates/-/tree/production/free/SELinux_by_Zabbix_Agent_2

Импорт шаблона

В веб-интерфейсе Zabbix перейдите в раздел Сбор данных → Шаблоны .

Нажмите «Импорт» .

Выберите файл template_SELinux_by_Zabbix_Agent_2.yaml из нашего репозитория и подтвердите импорт.

После импорта привяжите шаблон к хосту с включенной активной связью — это необходимо для обработки журналов с использованием log[*].

Проверить конфигурацию можно, перейдя в раздел Мониторинг → Последние данные для соответствующего хоста.

При обнаружении отказа Zabbix создаёт событие о проблеме. Событие автоматически закрывается, если в течение 30 минут не происходит дальнейших отказов.

Этот временной интервал можно настроить с помощью пользовательского макроса {$TRIGGER.CLOSE.TIME}, как непосредственно в шаблоне, так и индивидуально на уровне хоста.

Каждая запись о проблеме включает в себя PID, имя процесса (Comm) и тип объекта (Class) в заголовке, что позволяет легко идентифицировать ее с первого взгляда.

К событию также прикрепляются такие теги, как comm, class, pid и source, что позволяет осуществлять эффективную фильтрацию, маршрутизацию уведомлений и отображение на организованных панелях мониторинга.

На рисунке ниже показано, как события SELinux отображаются в разделе «Мониторинг → Проблемы».

Рекомендация: SELinux — важный компонент безопасности системы, и его, как правило, не рекомендуется отключать. Пакет zabbix-selinux-policy решает большинство распространённых проблем с Zabbix, но нестандартные операции (например, нестандартные порты или доступ к нестандартным файлам) должны выполняться администратором с помощью специальных политик, как описано выше. Мы рекомендуем уделить время изучению принципов работы SELinux, чтобы вы могли эффективно управлять политиками безопасности.

На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал zabbix_ru, где будет еще больше полезной информации.

Комментарии (0)