Всем привет! Мы делаем проекты по 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→ процесс сервера Zabbixdir 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, где будет еще больше полезной информации.