SELinux阻塞php';s exec(';kill pid';),日志中没有任何错误


SELinux blocking php's exec('kill pid') without any error in log

我正试图获得一个进程PID,并用以下代码杀死它:

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
$_script_path = "/path/to/scriptname.php";
$cmd_find_process = "ps aux | grep '[p]hp -f ".$_script_path."'";
echo $cmd_find_process.PHP_EOL;
echo exec($cmd_find_process);
echo PHP_EOL.PHP_EOL;
$cmd = "kill $(".$cmd_find_process." | awk '{print $2}')";
echo $cmd;
echo exec($cmd);
?>

最初我无法列出进程,我通过编译自定义的SELinux模块修复了这个问题,SELinux-httpd allow ps aux.te

policy_module(myhttpd,1.0.0)
gen_require(`
    type httpd_t;
')
domain_read_all_domains_state(httpd_t);

我已经禁用了dontaudit语句:

semodule -DB

但是我不能终止以前由同一用户启动的任何进程:apache。/var/log/audit/audit.log文件中未记录任何错误。

为了完全理解,我试图杀死的PHP脚本是用以下命令执行的:

su -s /bin/sh apache -c php -f /path/to/scriptname.php

我知道这是SELinux,因为用关闭SELinux

echo 0 > /selinux/enforce

将使其发挥作用。

显然,我必须重新启动audited才能显示错误。

service auditd restart

这就是错误:

type=AVC msg=audit(1459790992.546:15889813): avc:  denied  { signal } for  pid=25478 comm="sh" scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:system_r:initrc_t:s0 tclass=process
    Was caused by:
        Missing type enforcement (TE) allow rule.
        You can use audit2allow to generate a loadable module to allow this access.

我通过audit2allow工具解决了这个问题。这是生成的自定义模块,修复了该问题。

module selinux-httpd-allow-signal 1.0;
require {
        type httpd_t;
        type initrc_t;
        class process signal;
}
#============= httpd_t ==============
allow httpd_t initrc_t:process signal;