1 заметка с тегом

SELinux

Zabbix agent + SElinux = hardcore...

28 июля 2017, 12:14

Вынужден тут приобщаться к странному и алогичному миру линуксовых ОС. И поимел сегодня исключительно волнующий опыт настройки мониторинга контрольной суммы файла /etc/shadow в 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. Точнее, установлена оболочка /sbin/nologin. ОК, патчим sudoers:

Defaults:zabbix !requiretty
zabbix ALL=(ALL) NOPASSWD: /usr/bin/sha256sum /etc/shadow

Лучше стало, но не сильно: «sudo: unable to open audit system: Permission denied». «Эге!», — подумал я, «стопудово дело в 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 определённые сообщения подавляются. Чтобы это временно отключить, необходимо выполнить команду:

# semodule -DB

Тогда будут выводиться все сообщения, но это временно — до следующего ребилда политики. Каковая происходит, в частности, при установке исправленного модуля в системе.

Вообще, на CentOS 7 довольно сильно пришлось докручивать политики SELinux под zabbix-агента. Началось с того, что агент просто не запускался, так как SELinux не давал ему права на установку лимитов. Пришлось строить кастомную политику.

Потом выяснилось, что у агента нет прав на запись в каталог /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.

Затем нужно скомпилировать модуль и установить его в системе:

# 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 .

CentOS   Linux   SELinux   Zabbix