在之前的公司,解决方法是禁用 SELinux。我尝试让 SELinux 保持启用状态,并根据需要进行调整以实现我的目标。
简而言之,我希望 apache/httpd 运行“/usr/bin/systemctl status postfix”并返回状态。禁用 SELinux 后,它可以正常工作。强制执行 SElinux 后,它会拒绝该操作:
type=AVC msg=audit(1518207070.317:87): avc: denied { getattr } for pid=2191 comm="sh" path="/usr/bin/systemctl" dev="dm-0" ino=100857189 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:systemd_systemctl_exec_t:s0 tclass=file
type=SYSCALL msg=audit(1518207070.317:87): arch=c000003e syscall=4 success=no exit=-13 a0=1f32060 a1=7ffcb5925f60 a2=7ffcb5925f60 a3=7ffcb5925d90 items=0 ppid=2190 pid=2191 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="sh" exe="/usr/bin/bash" subj=system_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1518207070.317:88): avc: denied { getattr } for pid=2191 comm="sh" path="/usr/bin/systemctl" dev="dm-0" ino=100857189 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:systemd_systemctl_exec_t:s0 tclass=file
type=SYSCALL msg=audit(1518207070.317:88): arch=c000003e syscall=4 success=no exit=-13 a0=1f32060 a1=7ffcb5925f40 a2=7ffcb5925f40 a3=7ffcb5925d90 items=0 ppid=2190 pid=2191 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="sh" exe="/usr/bin/bash" subj=system_u:system_r:httpd_t:s0 key=(null)
audit2allow -w -a
多次告诉我:
缺少类型强制 (TE) 允许规则。
audit2allow -a
构建以下内容:
#============= httpd_t ==============
allow httpd_t admin_home_t:file { execute getattr };
allow httpd_t cgroup_t:dir read;
allow httpd_t cgroup_t:file { getattr open read };
allow httpd_t faillog_t:file write;
allow httpd_t init_t:dbus send_msg;
allow httpd_t postfix_etc_t:file { append getattr read };
allow httpd_t shadow_t:file { getattr open read };
allow httpd_t sudo_db_t:dir write;
allow httpd_t syslogd_var_run_t:dir read;
allow httpd_t systemd_systemctl_exec_t:file { getattr open read };
allow httpd_t systemd_unit_file_t:service status;
因此我构建模块并使用以下命令安装它audit2allow -a -M postfix_status_check_by_apahce_WR
:
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i postfix_status_check_by_apahce_WR.pp
这有效并且我看到它被列出selmodule -l
并且 audit.log 错误停止,但是脚本从未执行。
正如我之前所说,以前的工作是禁用 SELinux,所以这对我来说是新的空间。我正在运行 Centos 7.3。
在我忘记之前,这是代码:
<?php
$status = shell_exec("/usr/bin/systemctl status postfix | grep Active | awk -F: '{ print $2\":\"$3 }'");
echo $status;
?>
非常感谢您的帮助。