読み込みに時間がかかる 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
me が生成されました。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!
...しかし、うまくいけば、これは私がやろうとしていることへの洞察を与えるかもしれません.