2

読み込みに時間がかかる 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 tmpatme が生成されました。tmpat.pptmpat.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!

...しかし、うまくいけば、これは私がやろうとしていることへの洞察を与えるかもしれません.

4

3 に答える 3

2

この問題の解決策を思いついたことがありますか? もしそうなら、私は知りたいです。

私は同じ状況に遭遇したので、ここに私の解決策を投稿します。

Apache が at コマンドを実行できるように selinux を構成した後、私もエラーが見つからないという問題に遭遇しましたが、at コマンドは実行されません。

そこで、Apache のシェル構成を (/usr/sbin/nologin から) /bin/sh に変更し、ユーザー apache としてシェルにログインしました。

次に、atq を実行して、apache プロセスから at コマンドが正しく実行されたことを確認しました。

$ atq
46  Fri Nov 21 17:23:00 2014 a apache

しかし、それは永久にスプールされ、実行されることはありませんでした。そのため、シェルから at ジョブを実行しようとしましたが、問題はありませんでした。また、Apache からスプールされたジョブが実行を開始したことも確認します。

$ atq
46  Fri Nov 21 17:23:00 2014 = apache

そこで、ジョブでスプールを空のままにするcronタスクを追加しました(ユーザーapacheとして)

$ crontab -l
*/1 * * * * echo echo|/usr/bin/at now

最大 1 分の遅延が発生しますが、現在は apache(php) exec からコマンドを実行しています。

この結果の理由やロジックはわかりませんが、私にとっては有効な解決策です。

CentOS 7.0.1406、Apache/2.4.6、PHP 5.4.16、カーネル 3.10.0-123.9.3.el7.x86_64

編集:より簡単な解決策を見つけました。これにより、コマンドの即時実行が可能になります。

# chcon -t unconfined_exec_t /sbin/httpd

詳細なドキュメントはこちら

サーバーが信頼できないユーザーによって共有されている場合、おそらく良い考えではありません

于 2014-11-21T11:25:58.037 に答える
0

で挿入するには、ポリシーをコンパイルする必要がありますsemanage

まず、 .teファイルaudit2allowを作成するために使用します (これは、更新された投稿にあるファイルです)。次に、ポリシーをコンパイルして で挿入します。これにより、.ppファイルが作成されます。このファイルは挿入できますが、ここで正しい構文を見てください。audit2allow -M tmpat

semodule -i tmpat.pp
于 2014-08-20T12:02:35.320 に答える