selinuxはPHP execのpingをブロックします。

selinuxはPHP execのpingをブロックします。

Apache サーバーは Centos7 を実行します。 PHPの「exec」コマンドでpingを試みていますが、「ソケット:権限が拒否されました」というメッセージが表示されます。 selinuxを無効にしても機能します。私のLinuxの知識は少し制限されており、この問題を解決する方法がわかりません。

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

答え1

私はSELinuxが悪いものをつかむことが好きです。この場合、

  1. exec:はい、外部の実行可能ファイルを実行しているPHPスクリプトにサーバー構成がどのように反応するかを確認できます。少なくとも実際にユーザー入力をいくつかのシェルに渡さないことを願っています!
  2. ICMP要求(「ping」)を実行する必要がある場合は、呼び出し実行可能ファイル(/usr/bin/phpなど)のファイル形式を指定する必要がありますping_exec_t文書

全体的に、経験が足りない開発者なら(私たち全員はある意味ではそうです!) おそらく次のような文章を書いているでしょう。実際にサーバーをリモート実行の問題にさらすこと(execPHPで使用されるのは一般的に非常に大きな危険信号であるため、CentOSがこれを無効にするようにSELinuxで構成されています)。呼び出しは、ping実際に関心のあるサービスへの直接(たとえばTCP)接続を確立することに置き換えることができ、可能であればこれを行う必要があります。

答え2

私はMarcus Muellerのコメントに同意します。おそらく、これはしたくないでしょう。ただし、次のように機能することもできます。

ファイルを作成して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コメントに私が要求した出力を投稿してください。

関連情報