UAT 환경에 Nagios Core 4.3.4 및 Apache 2.4.6을 실행하는 Centos 7 서버가 있습니다. 동일한 Ansible 플레이북을 사용하여 설정된 두 번째 서버가 PROD에 있습니다. Nagios는 소스 코드로 구축되었습니다. UAT 서버는 Nagios 명령을 사용하려고 할 때 이 메시지를 표시 Error: Could not stat() command file '/usr/local/nagios/var/rw/nagios.cmd'!
하지만 PROD 서버는 그렇지 않습니다. 아래에 제공하는 모든 구성 목록은 UAT와 PROD 서버 간에 동일합니다.
SELinux로 인해 오류가 발생했음을 확인했습니다. 감사 로그의 출력은 다음과 같습니다.
type=AVC msg=audit(1525250190.011:1114376): avc: 거부됨 { getattr } for pid=12182 comm="cmd.cgi" path="/usr/local/nagios/var/rw/nagios.cmd" dev= " dm-0" ino=201456984 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:httpd_sys_rw_content_t:s0 tclass=fifo_file
다음은 관련 디렉토리 목록입니다.
$ ls -Z /usr/local/nagios/var
drwxrwxr-x. nagios nagios unconfined_u:object_r:usr_t:s0 archives
-rw-r--r--. nagios users system_u:object_r:usr_t:s0 nagios.configtest
-rw-r--r--. nagios nagios system_u:object_r:usr_t:s0 nagios.log
-rw-r--r--. nagios nagios system_u:object_r:usr_t:s0 objects.cache
-rw-r--r--. nagios nagios system_u:object_r:usr_t:s0 objects.precache
-rw-------. nagios nagios system_u:object_r:usr_t:s0 retention.dat
drwxrwsr-x. nagios nagcmd unconfined_u:object_r:httpd_sys_rw_content_t:s0 rw
drwxr-xr-x. root root unconfined_u:object_r:usr_t:s0 spool
-rw-rw-r--. nagios nagios system_u:object_r:usr_t:s0 status.dat
$ ls -Z /usr/local/nagios/var/rw
prw-rw----. nagios nagcmd system_u:object_r:httpd_sys_rw_content_t:s0 nagios.cmd
srw-rw----. nagios nagcmd system_u:object_r:httpd_sys_rw_content_t:s0 nagios.qh
rw
Nagios 서비스가 중지되었다가 시작되면 이 디렉터리의 내용이 삭제되고 다시 생성됩니다. 내가 본 모든 정보에 따르면 httpd_sys_rw_content_t
해당 유형을 디렉토리에 적용하면 제대로 작동할 것입니다. PROD 서버에서는 작동하지만 UAT 서버에서는 작동하지 않습니다. 내가 이해한 바로는 다음 명령이 작동하는지 확인해야 합니다.
$ sudo sesearch --allow --source httpd_t --target httpd_sys_rw_content_t --class file
Found 6 semantic av rules:
allow httpd_t httpd_content_type : file { ioctl read getattr lock open } ;
allow httpd_t httpd_sys_rw_content_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ;
allow httpd_t httpd_sys_rw_content_t : file { ioctl read write create getattr setattr lock append unlink link rename open } ;
allow httpd_t httpdcontent : file { ioctl read write create getattr setattr lock append unlink link rename open } ;
allow httpd_t httpdcontent : file { read getattr execute open } ;
allow httpd_t httpd_content_type : file { ioctl read getattr lock open } ;
답변1
내 솔루션이 완전히 만족스럽지는 않지만 제대로 작동했습니다. 저는 audit2allow
사용자 지정 정책을 만든 적이 있습니다(모든 올바른 권한을 허용하려면 이 정책을 세 번 실행해야 했습니다).
$ sudo grep nagios.cmd /var/log/audit/audit.log | tail -3 | sudo audit2allow -M httpdnagioscmd
$ sudo semodule -i httpdnagioscmd.pp
이는 파일 클래스와 관련이 있을 수 있지만 fifo_file
실제로 file
근본 원인을 파악하기에는 SELinux에 대해 충분히 알지 못합니다.