selinux は php exec からの ping をブロックします

selinux は php exec からの ping をブロックします

Centos7 を実行している Apache サーバー。PHP の 'exec' コマンドから ping を実行しようとしていますが、「socket: permission denied」というメッセージが表示されます。selinux を無効にすると動作します。私の Linux の知識は限られているため、これを修正する方法がよくわかりません。

selinux でポリシーをいくつか更新したところ、ping は実行されるようになりましたが、宛先 IP に到達できなかったかのように 100% のパケット損失が発生しますが、selinux が無効になっていると宛先 IP に到達します。

答え1

SELinuxが実際に悪いものをキャッチしてくれるのは嬉しいです。この場合、

  1. exec: ええ、サーバー構成が外部実行可能ファイルを実行する PHP スクリプトに対してアレルギー反応を起こしたくなるのはわかります。典型的なエントリ ポイントです。少なくとも、ユーザー入力をシェルに渡していないことを願っています。
  2. 実際に ICMP 要求 ("ping") を実行する必要がある場合は、呼び出し側の実行可能ファイル (おそらく /usr/bin/php など) のping_exec_tファイル タイプを指定する必要があります。ドキュメンテーション

全体的に、あなたが経験の浅い開発者であれば(私たちは皆、ある面ではそうでしょう!)、実はサーバーをリモート実行の問題にさらします ( execPHP で使用すると通常、非常に大きな危険信号となるため、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コメントで質問したように出力を投稿してください。

関連情報