Centos7 を実行している Apache サーバー。PHP の 'exec' コマンドから ping を実行しようとしていますが、「socket: permission denied」というメッセージが表示されます。selinux を無効にすると動作します。私の Linux の知識は限られているため、これを修正する方法がよくわかりません。
selinux でポリシーをいくつか更新したところ、ping は実行されるようになりましたが、宛先 IP に到達できなかったかのように 100% のパケット損失が発生しますが、selinux が無効になっていると宛先 IP に到達します。
答え1
SELinuxが実際に悪いものをキャッチしてくれるのは嬉しいです。この場合、
exec
: ええ、サーバー構成が外部実行可能ファイルを実行する PHP スクリプトに対してアレルギー反応を起こしたくなるのはわかります。典型的なエントリ ポイントです。少なくとも、ユーザー入力をシェルに渡していないことを願っています。- 実際に ICMP 要求 ("ping") を実行する必要がある場合は、呼び出し側の実行可能ファイル (おそらく /usr/bin/php など) の
ping_exec_t
ファイル タイプを指定する必要があります。ドキュメンテーション。
全体的に、あなたが経験の浅い開発者であれば(私たちは皆、ある面ではそうでしょう!)、実はサーバーをリモート実行の問題にさらします ( exec
PHP で使用すると通常、非常に大きな危険信号となるため、CentOS では SELinux を禁止するように構成しています)。呼び出しは、ping
実際に関心のあるサービスへの接続 (TCP など) を直接確立することで置き換えることができます。可能であれば、そうするべきです。
答え2
Marcus Müller 氏の言うように、おそらくこれは望ましくないでしょう。しかし、おそらくこれは機能するでしょう:
ファイルを作成しmy-httpd-php-ping.te
、その中に以下を記述します:
module my-httpd-php-ping 1.0;
require {
type httpd_t;
class capability { net_admin net_raw };
class icmp_socket create;
class rawip_socket { create getopt read setopt write };
}
#============= httpd_t ==============
allow httpd_t self:capability { net_admin net_raw };
allow httpd_t self:icmp_socket create;
allow httpd_t self:rawip_socket { create getopt read setopt write };
次のように SELinux モジュールにコンパイルします。
checkmodule -M -m -o my-httpd-php-ping.mod my-httpd-php-ping.te
semodule_package -o my-httpd-php-ping.pp -m my-httpd-php-ping.mod
インストールします:
semodule -i my-httpd-php-ping.pp
その後、SELinux を再度有効にします。
setenforce 1
Ping は動作するはずです。動作しない場合は、ausearch -ts recent -m avc -i
コメントで質問したように出力を投稿してください。