私たちはPHPで当社の製品の管理UIを開発しています。 Centos 7およびApache Webサーバーでホストされています。ユーザーはこのUIを使用してIPアドレスをpingできる必要があります。したがって、私たちはPHPコードを呼び出しexec(IPAddress)
、結果を得てユーザーに表示する必要があります。問題は、エラーメッセージが発生することです。エラーは次のとおりです。
ping: socket: Permission denied
シェルで実行するときにsetenforce 0
Centosを使用すると、PHPでpingコマンドを実行できます。 PHPがpingコマンドを永久に実行するようにCentosに指示する方法は?
更新:以下を使用して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.
答え1
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ユーザーが実行する必要があります。
setenforce 0
注:このコマンドはSELinuxを無効にするため、入力後にpingが機能します。 SELinuxを永久に無効にするには(セキュリティチェックがオフになるため推奨されません)、編集して/etc/sysconfig/selinux
指定しますSELINUX=disabled
。
答え2
次のことを試すことができます。
このコードを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実行可能ファイルのコンテキストに切り替えることができます。
答え3
私ができる最高のアドバイスはSELinuxをオフにする難解でランダムな問題を超えるのではなく、システムをより安全にするのに時間をかけてください。
....残念ながら、私たちは完璧な世界に住んでいません。したがって、「推奨される」ソリューションは、ポリシーを緩和に設定し、pingを呼び出すスクリプトを実行し、適用モードに戻して、生成された監査をターゲットにすることです。テストログはaudit2allowを実行します(詳細はリンクされたドキュメントを参照)。
残念ながら、これはすべての状況では機能しません。