Вопрос или проблема
Я установил сервер Zabbix на сервере Red Hat 7.4 с политикой SELinux в режиме принуждения.
Когда я запускаю Zabbix-server (3.4.11), я получаю следующие ошибки:
/var/log/zabbix/zabbix_server.log
25 июл 16:51:38 master-01 systemd: zabbix-server.service никогда не записывал свой PID файл. Ошибка.
25 июл 16:51:38 master-01 systemd: Не удалось запустить Zabbix Server.
25 июл 16:51:38 master-01 systemd: Юнит zabbix-server.service вошел в состояние ошибки.
25 июл 16:51:38 master-01 systemd: zabbix-server.service завершился с ошибкой.
==> /var/log/messages <==
25 июл 16:57:47 master-01 systemd: PID файл /run/zabbix/zabbix_server.pid не читаем (еще?) после старта.
25 июл 16:57:57 master-01 systemd: zabbix-server.service никогда не записывал свой PID файл. Ошибка.
25 июл 16:57:57 master-01 systemd: Не удалось запустить Zabbix Server.
25 июл 16:57:57 master-01 systemd: Юнит zabbix-server.service вошел в состояние ошибки.
25 июл 16:57:57 master-01 systemd: zabbix-server.service завершился с ошибкой.
25 июл 16:58:08 master-01 systemd: Время ожидания zabbix-server.service истекло, планируется перезапуск.
==> /var/log/audit/audit.log <==
тип=AVC msg=audit(1532530831.592:161220): avc: отказано { setrlimit } для pid=11475 comm="zabbix_server" scontext=system_u:system_r:zabbix_t:s0 tcontext=system_u:system_r:zabbix_t:s0 tclass=process
тип=SYSCALL msg=audit(1532530831.592:161220): arch=c000003e syscall=160 success=no exit=-13 a0=4 a1=7ffd64898360 a2=0 a3=8 items=0 ppid=1 pid=11475 auid=4294967295 uid=997 gid=995 euid=997 suid=997 fsuid=997 egid=995 sgid=995 fsgid=995 tty=(none) ses=4294967295 comm="zabbix_server" exe="/usr/sbin/zabbix_server_mysql" subj=system_u:system_r:zabbix_t:s0 key=(null)
тип=PROCTITLE msg=audit(1532530831.592:161220): proctitle=2F7573722F7362696E2F7A61626269785F736572766572002D63002F6574632F7A61626269782F7A61626269785F7365727665722E636F6E66
После нескольких попыток, без изменений, произошли следующие ошибки:
==> /var/log/zabbix/zabbix_server.log <==
zabbix_server [11390]: невозможно открыть журнал: невозможно создать набор семафоров: [28] Недостаточно места на устройстве
В этом случае я запустил следующие команды:
[root@master-01 ~]# ipcs | grep zabbix | wc -l
93
[root@master-01 ~]# ipcrm -a
==> /var/log/zabbix/zabbix_server.log <==
11577:20180725:170244.842 Запуск сервера Zabbix. Zabbix 3.4.11 (ревизия 82160).
11577:20180725:170244.842 ****** Включенные функции ******
11577:20180725:170244.842 SNMP мониторинг: ДА
11577:20180725:170244.842 IPMI мониторинг: ДА
11577:20180725:170244.842 Веб мониторинг: ДА
11577:20180725:170244.842 VMware мониторинг: ДА
11577:20180725:170244.843 SMTP аутентификация: ДА
11577:20180725:170244.843 Jabber уведомления: ДА
11577:20180725:170244.843 Ez Texting уведомления: ДА
11577:20180725:170244.843 ODBC: ДА
11577:20180725:170244.843 SSH2 поддержка: ДА
11577:20180725:170244.843 IPv6 поддержка: ДА
11577:20180725:170244.843 TLS поддержка: ДА
11577:20180725:170244.843 ******************************
11577:20180725:170244.843 Используется конфигурационный файл: /etc/zabbix/zabbix_server.conf
11577:20180725:170244.843 невозможно установить ограничение ресурсов: [13] Доступ запрещен
11577:20180725:170244.843 невозможно отключить дамп памяти, выход...
В оригинальной конфигурации ошибка доступа была решена с помощью restorecon -v /etc/zabbix/zabbix_server.conf
, фактически, тип SELinux был установлен как “etc_t” вместо “zabbix_exec_t”, но снова появился…
Для теста (это моя первая конфигурация SELinux), я отключил SELinux, и сервис заработал нормально.
Я попытался настроить setsebool httpd_can_network_connect on
(В этом посте), без успеха.
Я проверил контекст SELinux:
[root@master-01 ~]# grep Pid /etc/zabbix/zabbix_server.conf | grep -v '#'
PidFile=/var/run/zabbix/zabbix_server.pid
[root@master-01 ~]# ls -Z /var/run/zabbix/
srwx------. zabbix zabbix system_u:object_r:zabbix_var_run_t:s0 zabbix_server_alerter.sock
srwx------. zabbix zabbix system_u:object_r:zabbix_var_run_t:s0 zabbix_server_preprocessing.sock
[root@master-01 ~]# ls -Z /etc/zabbix/zabbix_server.conf
-rw-r-----. root zabbix system_u:object_r:zabbix_exec_t:s0 /etc/zabbix/zabbix_server.conf
[root@master-01 ~]# sesearch -s zabbix_t -t zabbix_exec_t --allow
Найдено 1 семантическое av правила:
allow zabbix_t zabbix_exec_t : file { ioctl read getattr lock execute execute_no_trans entrypoint open } ;
[root@master-01 ~]# sesearch -s zabbix_t -t zabbix_var_run_t --allow
Найдено 6 семантических av правил:
allow zabbix_t zabbix_var_run_t : dir { ioctl read write create getattr setattr lock unlink link rename add_name remove_name reparent search rmdir open } ;
allow nsswitch_domain pidfile : dir { getattr search open } ;
allow domain pidfile : sock_file { write getattr append open } ;
allow zabbix_t zabbix_var_run_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ;
allow nsswitch_domain pidfile : dir { getattr search open } ;
allow nsswitch_domain pidfile : dir { getattr search open } ;
[root@master-01 ~]# sesearch -s zabbix_t --allow | grep mysql
allow zabbix_t mysqld_t : unix_stream_socket connectto ;
allow zabbix_t mysqld_var_run_t : sock_file { write getattr append open } ;
allow zabbix_t mysqld_db_t : dir { getattr search open } ;
allow zabbix_t mysqld_var_run_t : dir { getattr search open } ;
[root@master-01 ~]# sesearch -s zabbix_t -t zabbix_exec_t --allow
Найдено 1 семантическое av правила:
allow zabbix_t zabbix_exec_t : file { ioctl read getattr lock execute execute_no_trans entrypoint open } ;
Я попытался добавить запись с помощью audit2allow:
[root@master-01 ~]# audit2allow -a -m zabbix
[root@master-01 ~]# cat zabbix.te
module zabbix 1.0;
require {
type httpd_t;
type zabbix_t;
type zabbix_port_t;
class process setrlimit;
class tcp_socket name_connect;
}
#============= httpd_t ==============
#!!!! Этот avc разрешен в текущей политике
allow httpd_t zabbix_port_t:tcp_socket name_connect;
#============= zabbix_t ==============
allow zabbix_t self:process setrlimit;
[root@master-01 ~]# semodule -i zabbix.pp
libsemanage.semanage_direct_install_info: Переопределение модуля zabbix с более низким приоритетом 100 модулем с приоритетом 400.
Не удалось разрешить оператор typeattributeset на /etc/selinux/targeted/tmp/modules/400/zabbix/cil:2
semodule: Ошибка!
Какие-либо идеи?
Спасибо 🙂
Существующая политика SELinux для Zabbix недостаточно развита и не включает многие вещи, которые Zabbix должен иметь возможность мониторить.
На моем существующем сервере Zabbix я установил Zabbix в режим разрешения как обходной путь.
semanage permissive -a zabbix_t
Это позволит Zabbix работать и собирать AVC в журнале, в случае если вы хотите создать локальный модуль политики для вещей, которые вам нужны от вашего сервера Zabbix.
Смотрите также подобная проблема с агентом Zabbix.
Вам нужен именованный модуль, в отличие от zabbix.pp –> например zabbix_add.pp. Потому что он уже установлен в системе по умолчанию с zabbix.
# semodule -l | grep zabbix
zabbix 1.6.0
zabbix_add 1.0
Ответ или решение
Проблема SELinux: Zabbix сервер не может прочитать файл конфигурации
При установке Zabbix сервера на Red Hat 7.4 с включенной политикой SELinux в режиме "Enforcing" возникли проблемы с запуском сервера. В процессе диагностики были выявлены ошибки в логах, указывающие на то, что Zabbix сервер не может создать PID файл, а также не имеет необходимых разрешений для выполнения определенных операций. В этой статье мы рассмотрим возможные причины возникшей проблемы и предложим способы ее решения.
Анализ ошибок
-
Ошибки PID файла
/var/log/messages Jul 25 16:51:38 master-01 systemd: zabbix-server.service never wrote its PID file. Failing.
Эти сообщения указывают на то, что Zabbix сервер не может записать свой PID файл в
/run/zabbix/zabbix_server.pid
, что может быть связано с недостатком прав доступа. -
SELinux Avc Denials
type=AVC msg=audit(1532530831.592:161220): avc: denied { setrlimit } for pid=11475 comm="zabbix_server" ...
Эти строки показывают, что политика SELinux запрещает процессу Zabbix серверу выполнять некоторые системные вызовы, такие как
setrlimit
. -
Проблема с ресурсами
cannot create semaphore set: [28] No space left on device
Сообщение указывает на то, что исполняемая версия Zabbix не может создать семафоры из-за недостатка ресурсов. Это может произойти из-за большого количества открытых семафоров, что подтверждается командами:
ipcs | grep zabbix | wc -l
После очистки семафоров с помощью
ipcrm -a
проблема исчезает, однако она повторяется.
Решение проблемы
1. Настройка SELinux для Zabbix
Чтобы сервер Zabbix мог корректно работать в режиме Enforcing SELinux, необходимо убедиться, что все файлы конфигурации имеют правильные контексты SELinux. Вы можете выполнить команду:
restorecon -v /etc/zabbix/zabbix_server.conf
Однако если контекст файла снова переопределяется, возможно, потребуется создать специальную политику SELinux для Zabbix.
2. Разрешения на запуск процессов
Проверка текущих SELinux правил для процесса Zabbix.
sesearch -s zabbix_t --allow | grep -i denied
Создание модуля SELinux, разрешающего необходимые операции. Пример создания пользовательского модуля, который позволит процессу zabbix_t
устанавливать лимиты ресурсов:
audit2allow -a -M zabbix
semodule -i zabbix.pp
При этом важно удостовериться, что название нового модуля не совпадает с уже существующим модулем Zabbix, таким как zabbix_add
.
3. Временное разрешение проблемы
Если изменения политики SELinux кажутся слишком сложными, можно временно переключить Zabbix в режим Permissive, что позволит избежать жесткого контроля со стороны SELinux, однако этот вариант не рекомендуется для эксплуатации в продуктивной среде:
setsebool -P httpd_can_network_connect on
semanage permissive -a zabbix_t
Заключение
Правильная настройка SELinux является важной частью обеспечения безопасности серверов, работающих с критически важными приложениями, такими как Zabbix. Несмотря на сложности при первой настройке, в будущем эти усилия позволят наладить безопасную и стабильную работу мониторинга. При решении проблемы с неправильными разрешениями важно быть внимательным к сетевым и файловым правам, а также использовать инструменты, такие как audit2allow
для поддержки корпоративной безопасности на уровне SELinux.