В моем CentOS 7 VPS включен SELinux, и он контролируется Collectd. Он использует rrdtool для регистрации отчетных данных. Pommi выпустила отличное решение, которое дало мне возможность просматривать все данные на веб-странице под названием CGP (http://pommi.nethuis.nl/collectd-graph-panel-v0-4/).
Данные RRD хранятся в /var/lib/collectd/my.host.name
drwxr-xr-x. root root system_u:object_r:collectd_var_lib_t:s0 my.host.name
Когда я открываю страницу CGP, там говорится Error: No Collectd hosts found in /var/lib/collectd/rrd
но когда я отключаю SELinux, появляется мой хост и все работает нормально. Журнал аудита показывает:
Audit.log содержит следующие записи
type=AVC msg=audit(1410524820.750:15750): avc: denied { getattr } for pid=10468 comm="httpd" path="/var/lib/collectd/rrd" dev="dm-0" ino=72430599 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:collectd_var_lib_t:s0 tclass=dir
и
type=SYSCALL msg=audit(1410524820.750:15750): arch=c000003e syscall=4 success=no exit=-13 a0=7f093426da68 a1=7fff4fa46ae0 a2=7fff4fa46ae0 a3=1 items=0 ppid=10461 pid=10468 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)
Поэтому я подумал, что будет достаточно изменить контекст папки / var / lib / collectd / rrd и ее содержимого на httpd_sys_content_t
. Теперь CGP работает и показывает хост и статистику. Однако, когда я перезапускаю collectd
и проверьте статус, в котором говорится:
Sep 12 14:31:31 my.host.name collectd[17910]: stat(/var/lib/collectd/rrd/my.host.name/memory/memory-cached.rrd) failed: Permission denied
Sep 12 14:31:31 my.host.name collectd[17910]: stat(/var/lib/collectd/rrd/my.host.name/memory/memory-free.rrd) failed: Permission denied
Sep 12 14:31:31 my.host.name collectd[17910]: Filter subsystem: Built-in target `write': Dispatching value to all write plugins failed with status -1.
Sep 12 14:31:31 my.host.name collectd[17910]: stat(/var/lib/collectd/rrd/my.host.name/interface-eth0/if_packets.rrd) failed: Permission denied
Sep 12 14:31:31 my.host.name collectd[17910]: Filter subsystem: Built-in target `write': Dispatching value to all write plugins failed with status -1.
Sep 12 14:31:31 my.host.name collectd[17910]: stat(/var/lib/collectd/rrd/my.host.name/interface-eth0/if_octets.rrd) failed: Permission denied
Sep 12 14:31:31 my.host.name collectd[17910]: Filter subsystem: Built-in target `write': Dispatching value to all write plugins failed with status -1.
Sep 12 14:31:31 my.host.name collectd[17910]: Filter subsystem: Built-in target `write': Dispatching value to all write plugins failed with status -1.
Sep 12 14:31:31 my.host.name collectd[17910]: stat(/var/lib/collectd/rrd/my.host.name/cpu-1/cpu-softirq.rrd) failed: Permission denied
Sep 12 14:31:31 my.host.name collectd[17910]: Filter subsystem: Built-in target `write': Dispatching value to all write plugins failed with status -1.
Как установить контекст безопасности, чтобы как collectd, так и httpd могли получить доступ к контенту?
Вам необходимо настроить политику selinux, как описано в документация
Вот суть:
[root@collectd ~]# audit2allow -a
#============= httpd_t ==============
allow httpd_t collectd_var_lib_t:dir read;
allow httpd_t collectd_var_lib_t:file { read getattr open };
(это последняя итерация после выполнения следующих команд примерно 3 раза и щелчка в CGP, так как каждая итерация требовала большего доступа)
[root@collectd ~]# audit2allow -a -M cgp
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i cgp.pp
Запустите команду, промойте и повторяйте, пока не решите все проблемы с разрешениями.