SELinux
Zabbix agent + SElinux = hardcore...
Вынужден тут приобщаться к странному и алогичному миру линуксовых ОС. И поимел сегодня исключительно волнующий опыт настройки мониторинга контрольной суммы файла /etc/shadow в CentOS посредством Zabbix. Казалось бы, всё просто — файл доступен по чтению только руту, пропиши в sudoers что-то вроде:
, а в userparameters:
и будет тебе щастье. Но щастья что-то не наступило... Параметр всё равно оставался в статусе «Unsupported», с мотивацией:
Разборки показали, что sudo жалуется, что у пользователя zabbix не установлен shell. Точнее, установлена оболочка /sbin/nologin. ОК, патчим sudoers:
zabbix ALL=(ALL) NOPASSWD: /usr/bin/sha256sum /etc/shadow
Лучше стало, но не сильно: «sudo: unable to open audit system: Permission denied». «Эге!», — подумал я, «стопудово дело в SELinux». И пошёл читать grep AVC /var/log/audit/log. И действительно, там было понаписано всякое. Например:
И вот тут началось бесконечное порево с правкой политик SELinux для того, чтобы в конечном итоге параметр заработал. Заняло это чистого времени часа 4. Текст модуля политики разросся раза в два :-)
На каком-то этапе упёрся, так как параметр всё ещё не работал, но в /var/log/audit/audit.log никаких новых надписей о запрещённых операциях не появилось. Исследование показало, что в SELinux определённые сообщения подавляются. Чтобы это временно отключить, необходимо выполнить команду:
Тогда будут выводиться все сообщения, но это временно — до следующего ребилда политики. Каковая происходит, в частности, при установке исправленного модуля в системе.
Вообще, на CentOS 7 довольно сильно пришлось докручивать политики SELinux под zabbix-агента. Началось с того, что агент просто не запускался, так как SELinux не давал ему права на установку лимитов. Пришлось строить кастомную политику.
Потом выяснилось, что у агента нет прав на запись в каталог /tmp, а у нас вызывается скрипт мониторинга nginx, который создаёт кэш-файл в /tmp. С одной стороны, проще было бы класть временный файл куда-нибудь в каталоги самого заббикса. Но с другой — файл-то временный, и самое ему место в /tmp.
В итоге получился вот такой модуль политики:
module zabbix-agent 1.0; require { type user_tmp_t; type tmp_t; type zabbix_agent_t; type sudo_exec_t; type http_cache_port_t; type shadow_t; type devlog_t; type kernel_t; class tcp_socket { name_connect }; class unix_dgram_socket { create connect sendto write }; class netlink_audit_socket { create read write nlmsg_relay }; class sock_file { write }; class capability { sys_resource dac_override dac_read_search audit_write }; class dir { add_name write }; class file { create open setattr write execute execute_no_trans read }; class process { setrlimit }; } #============= zabbix_agent_t ============== allow zabbix_agent_t self:process { setrlimit }; allow zabbix_agent_t tmp_t:dir { add_name write }; allow zabbix_agent_t http_cache_port_t:tcp_socket name_connect; allow zabbix_agent_t sudo_exec_t:file { execute execute_no_trans }; allow zabbix_agent_t self:netlink_audit_socket { create read write nlmsg_relay }; allow zabbix_agent_t self:unix_dgram_socket { create connect write }; allow zabbix_agent_t kernel_t:unix_dgram_socket { sendto }; allow zabbix_agent_t self:capability { sys_resource dac_override dac_read_search audit_write }; allow zabbix_agent_t shadow_t:file { read open }; allow zabbix_agent_t devlog_t:sock_file write; #!!!! WARNING: 'tmp_t' is a base type. allow zabbix_agent_t tmp_t:file { create open setattr write }; allow zabbix_agent_t user_tmp_t:file open;
Там прописаны разрешения на доступ к http-порту (требуется для мониторинга nginx), доступ на запись файлов в /tmp, и использование sudo.
Затем нужно скомпилировать модуль и установить его в системе:
# semodule_package -o zabbix-agent.pp -m zabbix-agent.mod
# semodule -i zabbix-agent.pp
И только после этого заббикс стал нормально считать sha256 для файла /etc/shadow .