ping: ソケット: 権限が拒否されました。

ping: ソケット: 権限が拒否されました。

私たちはPHPで当社の製品の管理UIを開発しています。 Centos 7およびApache Webサーバーでホストされています。ユーザーはこのUIを使用してIPアドレスをpingできる必要があります。したがって、私たちはPHPコードを呼び出しexec(IPAddress)、結果を得てユーザーに表示する必要があります。問題は、エラーメッセージが発生することです。エラーは次のとおりです。

ping: socket: Permission denied

シェルで実行するときにsetenforce 0Centosを使用すると、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-develRPMがインストールされていることを確認したら、次の手順を実行します。

make -f /usr/share/selinux/devel/Makefile local_httpd.ppそしてsemodule -i local_httpd.pp

これにより、Apache(httpd_t)がping実行可能ファイルのコンテキストに切り替えることができます。

答え3

私ができる最高のアドバイスはSELinuxをオフにする難解でランダムな問題を超えるのではなく、システムをより安全にするのに時間をかけてください。

....残念ながら、私たちは完璧な世界に住んでいません。したがって、「推奨される」ソリューションは、ポリシーを緩和に設定し、pingを呼び出すスクリプトを実行し、適用モードに戻して、生成された監査をターゲットにすることです。テストログはaudit2allowを実行します(詳細はリンクされたドキュメントを参照)。

残念ながら、これはすべての状況では機能しません。

関連情報