我有一个系统,我们使用 PHP 在服务器上运行一些基本的健康检查。当访问状态页面时,它会验证某些进程是否正在运行,如果出现故障,它会返回错误消息。
当我们使用 RHEL 7 设置此功能时,我们发现运行 shell_exec("ps -ax") 只会返回由 PHP 用户执行的进程,因此它无法“看到”特定服务器进程是否正在运行。经过一番调查,我们发现这是 selinux 强制执行的限制。我们可以在 auditd.log 中看到拒绝,并最终通过此 selinux 策略模块使其正常工作:
require {
type httpd_t;
type initrc_t;
class dir getattr;
class dir search;
class file read;
class file open;
}
#============= httpd_t ==============
allow httpd_t initrc_t:dir getattr;
allow httpd_t initrc_t:dir search;
allow httpd_t initrc_t:file read;
allow httpd_t initrc_t:file open;
我们现在正在 RHEL 8 上重建此服务器,但相同的策略不起作用。我之前描述的相同情况正在发生 - shell_exec(ps -ax) 仅返回正在运行的用户的进程。但是,当检查 RHEL 8 上的审计日志时,我们发现没有记录任何针对 php 的拒绝。我禁用并删除了上述策略模块,但仍然没有看到任何被拒绝的内容。
如果我运行“setenforce Permissive”,然后重新运行我的测试,PHP 就可以看到所有正在运行的进程。运行“setenforce Enforcing”会恢复原始行为,因此很明显 selinux 阻止了这种情况,但如果没有任何日志记录,我不知道该怎么做使固定它。
有人知道如何强制 SELinux 记录拒绝的原因吗?我看到它记录了其他拒绝,所以我不知道为什么排除了这一点。我尝试运行以下命令:
auditctl -w /usr/sbin/php-fpm
auditctl -w /usr/bin/ps
现在我可以看到 ps 正在跑步在 audit.log 中,但仍然没有关于被拒绝的内容的任何信息。
我对 selinux 不是很熟悉,现在我正陷入困境。我怎样才能找出具体被拒绝的内容?