Zabbix agent + SElinux = hardcore...
Вынужден тут приобщаться к странному и алогичному миру линуксовых ОС. И поимел сегодня исключительно волнующий опыт настройки мониторинга контрольной суммы файла /etc/shadow в CentOS посредством Zabbix. Казалось бы, всё просто — файл доступен по чтению только руту, пропиши в sudoers что-то вроде: в CentOS посредством Zabbix. Казалось бы, всё просто — файл доступен по чтению только руту, пропиши в sudoers что-то вроде:
zabbix ALL=(ALL) NOPASSWD: /usr/bin/sha256sum /etc/shadow
, а в userparameters:
UserParameter=shadow.checksum,sudo sha256sum /etc/shadow|cut -d « » -f 1
и будет тебе щастье. Но щастья что-то не наступило... Параметр всё равно оставался в статусе «Unsupported», с мотивацией:
sh: /usr/bin/sudo: Permission denied
Разборки показали, что sudo жалуется, что у пользователя zabbix не установлен shell. Точнее, установлена оболочка / не установлен shell. Точнее, установлена оболочка /sbin/nologin. ОК, патчим . ОК, патчим sudoers::
Defaults:zabbix !requiretty zabbix ALL=(ALL) NOPASSWD: /usr/bin/sha256sum /etc/shadow
Лучше стало, но не сильно: «sudo: unable to open audit system: Permission denied». «Эге!», — подумал я, «стопудово дело в SELinux». И пошёл читать ». «Эге!», — подумал я, «стопудово дело в SELinux». И пошёл читать grep AVC /var/log/audit/log. И действительно, там было понаписано всякое. Например:. И действительно, там было понаписано всякое. Например:
type=AVC msg=audit(1501160287.479:190259): avc: denied { execute } for pid=21472 comm=«sh» name=«sudo» dev=«dm-0» ino=50709281 scontext=system_u:system_r:zabbix_agent_t:s0 tcontext=system_u:object_r:sudo_exec_t:s0 tclass=file
И вот тут началось бесконечное порево с правкой политик SELinux для того, чтобы в конечном итоге параметр заработал. Заняло это чистого времени часа 4. Текст модуля политики разросся раза в два :-)
На каком-то этапе упёрся, так как параметр всё ещё не работал, но в /var/log/audit/audit.log никаких новых надписей о запрещённых операциях не появилось. Исследование показало, что в SELinux определённые сообщения подавляются. Чтобы это временно отключить, необходимо выполнить команду: никаких новых надписей о запрещённых операциях не появилось. Исследование показало, что в SELinux определённые сообщения подавляются. Чтобы это временно отключить, необходимо выполнить команду:
semodule -DB
Тогда будут выводиться все сообщения, но это временно — до следующего ребилда политики. Каковая происходит, в частности, при установке исправленного модуля в системе.
Вообще, на CentOS 7 довольно сильно пришлось докручивать политики SELinux под zabbix-агента. Началось с того, что агент просто не запускался, так как SELinux не давал ему права на установку лимитов. Пришлось строить кастомную политику.
Потом выяснилось, что у агента нет прав на запись в каталог /tmp, а у нас вызывается скрипт мониторинга nginx, который создаёт кэш-файл в /tmp. С одной стороны, проще было бы класть временный файл куда-нибудь в каталоги самого заббикса. Но с другой — файл-то временный, и самое ему место в /, а у нас вызывается скрипт мониторинга nginx, который создаёт кэш-файл в /tmp. С одной стороны, проще было бы класть временный файл куда-нибудь в каталоги самого заббикса. Но с другой — файл-то временный, и самое ему место в /tmp..
В итоге получился вот такой модуль политики:
cat zabbix-agent.te
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., и использование sudo.
Затем нужно скомпилировать модуль и установить его в системе:
checkmodule -M -m -o zabbix-agent.mod zabbix-agent.te
semodule_package -o zabbix-agent.pp -m zabbix-agent.mod
semodule -i zabbix-agent.pp
И только после этого заббикс стал нормально считать sha256 для файла /etc/shadow . .
Comments
Comments powered by Disqus