SELinux – сервер Zabbix не может прочитать конфигурационный файл

Вопрос или проблема

Я установил сервер 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 файл, а также не имеет необходимых разрешений для выполнения определенных операций. В этой статье мы рассмотрим возможные причины возникшей проблемы и предложим способы ее решения.

Анализ ошибок

  1. Ошибки 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, что может быть связано с недостатком прав доступа.

  2. SELinux Avc Denials

    type=AVC msg=audit(1532530831.592:161220): avc:  denied  { setrlimit } for  pid=11475 comm="zabbix_server" ...

    Эти строки показывают, что политика SELinux запрещает процессу Zabbix серверу выполнять некоторые системные вызовы, такие как setrlimit.

  3. Проблема с ресурсами

    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.

Оцените материал
Добавить комментарий

Капча загружается...