我有一个 PHP 脚本需要很长时间才能加载。我们已将我们的站点移至位于云负载均衡器后面的新服务器。负载均衡器的最大时间限制为 120 秒,但脚本需要 5 分钟以上。拆分脚本不是一种选择。
我重写了脚本,让它在命令行上运行,我可以成功地调用它:
php -f /path/to/long_php.php > /path/to/log_file.php
然后我可以通过这样做从 PHP 调用它:
exec('php -f /path/to/long_php.php > /path/to/log_file.php');
当然,因为这个脚本需要很长时间才能加载,我不希望 PHP 页面等待。回到命令行,我成功地使用了at
这样的命令:
echo "php -f /path/to/long_php.php > /path/to/log_file.php" | at now
所以,我希望在 PHP 中运行类似的东西时它会起作用:
exec('echo "php -f /path/to/long_php.php > /path/to/log_file.php" | at now');
但是,这不起作用。与之前的所有尝试不同,这里的最终命令给了我 SELinux 错误:
----
type=SYSCALL msg=audit(07/25/2014 21:12:50.027:793672) : arch=x86_64 syscall=open success=no exit=-13(Permission denied) a0=7fd6fc2186bb a1=80000 a2=1b6 a3=0 items=0 ppid=55040 pid=55041 auid=root uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=1517 comm=unix_chkpwd exe=/sbin/unix_chkpwd subj=unconfined_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(07/25/2014 21:12:50.027:793672) : avc: denied { read } for pid=55041 comm=unix_chkpwd name=shadow dev=md2 ino=11797556 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:shadow_t:s0 tclass=file
----
type=SYSCALL msg=audit(07/25/2014 21:12:50.028:793673) : arch=x86_64 syscall=socket success=no exit=-13(Permission denied) a0=10 a1=3 a2=9 a3=7fff46547e40 items=0 ppid=55038 pid=55040 auid=root uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=1517 comm=at exe=/usr/bin/at subj=unconfined_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(07/25/2014 21:12:50.028:793673) : avc: denied { create } for pid=55040 comm=at scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:system_r:httpd_t:s0 tclass=netlink_audit_socket
----
type=SYSCALL msg=audit(07/25/2014 21:12:50.028:793674) : arch=x86_64 syscall=socket success=no exit=-13(Permission denied) a0=10 a1=3 a2=9 a3=1 items=0 ppid=55038 pid=55040 auid=root uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=1517 comm=at exe=/usr/bin/at subj=unconfined_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(07/25/2014 21:12:50.028:793674) : avc: denied { create } for pid=55040 comm=at scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:system_r:httpd_t:s0 tclass=netlink_audit_socket
----
type=SYSCALL msg=audit(07/25/2014 21:12:50.028:793675) : arch=x86_64 syscall=socket success=no exit=-13(Permission denied) a0=10 a1=3 a2=9 a3=7fff46547eb0 items=0 ppid=55038 pid=55040 auid=root uid=root gid=root euid=root suid=root fsuid=root egid=root sgid=root fsgid=root tty=(none) ses=1517 comm=at exe=/usr/bin/at subj=unconfined_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(07/25/2014 21:12:50.028:793675) : avc: denied { create } for pid=55040 comm=at scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:system_r:httpd_t:s0 tclass=netlink_audit_socket
注意:以上内容来自/var/log/audit/audit.log
管道ausearch -i
在此之后,我通过管道输入audit2allow -w
以查看原因,第一个错误是关于allow_httpd_mod_auth_pam
未启用。然后我启用了这个并得到了一些其他错误。运行它们使audit2allow -M tmpat
我产生tmpat.pp
了相关的tmpat.te
:
module tmpat 1.0;
require {
type initrc_var_run_t;
type httpd_t;
class capability audit_control;
class file read;
}
#============= httpd_t ==============
allow httpd_t initrc_var_run_t:file read;
allow httpd_t self:capability audit_control;
不幸的是,当我运行semodule -i tmpat.pp
它仍然无法正常工作。重复audit2allow -w
上面的使用过程会给我更多相同的Missing type enforcement (TE) allow rule.
错误。因此,考虑到这一点,我希望有人能告诉我需要对生成的文件进行哪些更改tmpat.te
才能使其正常工作?
注意:我在 CentOS 6.5 上,使用 Apache 2.2,PHP 5.4
更新:
在研究了政策之后,尽管这对我来说是新事物,但我想出了以下几点:
module tmpat 1.1;
require {
type tmp_t;
type httpd_t;
class file { create getattr open read rename unlink write };
class dir { add_name getattr open read remove_name search write };
}
#============= httpd_t ==============
allow httpd_t tmp_t:file { create getattr open read rename unlink write };
allow httpd_t tmp_t:dir { add_name getattr open read remove_name search write };
目前这个编译但不会安装,给我这个:
[root@localhost tmp]# semodule -i tmpat
semodule: Failed on tmpat!
...但希望这可能会对我正在尝试做的事情有所了解。