PHPで製品の管理UIを開発しています。 Centos7およびApacheWebサーバーでホストされています。ユーザーは、このUIを使用してIPアドレスにpingできる必要があります。したがって、PHPコードでexec(IPAddress)
を呼び出し、結果を取得してユーザーに表示する必要があります。問題は、エラーメッセージが表示されることです。これはエラーです。
ping: socket: Permission denied
ShellCentosでsetenforce 0
を実行すると、PHPからpingコマンドを実行できます。 Centosにphpにpingコマンドを永続的に実行させるにはどうすればよいですか?
更新:audit2why
を使用すると、次のメッセージが表示されます。
type=AVC msg=audit(1502697341.249:11426): avc: denied { create } for
pid=28530 comm="ping" scontext=system_u:system_r:httpd_t:s0
tcontext=system_u:system_r:httpd_t:s0 tclass=rawip_socket
Was caused by:
Missing type enforcement (TE) allow rule.
You can use audit2allow to generate a loadable module to allow this access.
次のことを試してみてください。
そのコードをlocal_httpd.te
ファイルに入れます。
policy_module(local_httpd, 0.0.1)
gen_require(`
type httpd_t;
')
netutils_domtrans_ping(httpd_t)
selinux-policy-devel
RPMがインストールされていることを確認してから、次の手順を実行します。
make -f /usr/share/selinux/devel/Makefile local_httpd.pp
およびsemodule -i local_httpd.pp
これにより、Apache(httpd_t)がping実行可能ファイルのコンテキストに移行できるようになります。
SELinuxはPHPのping
の実行をブロックしています。正しいコンテキストをPHPスクリプトに関連付ける必要があります。
それらが/var/www/html/
にあると仮定すると、次のことを行う必要があります。
semanage fcontext -a -t httpd_sys_script_exec_t '/var/www/html(/.*)?'
restorecon -R -v /var/www/html/
ただし、これはサーバー上のrootユーザーが行う必要があります。
注:このコマンドはSELinuxを無効にするため、setenforce 0
を入力した後にpingが機能しました。 SELinuxを永続的に無効にするには(セキュリティチェックがオフになるためお勧めしません)、/etc/sysconfig/selinux
を編集し、SELINUX=disabled
を指定します。