Apache サーバーは Centos7 を実行します。 PHPの「exec」コマンドでpingを試みていますが、「ソケット:権限が拒否されました」というメッセージが表示されます。 selinuxを無効にしても機能します。私のLinuxの知識は少し制限されており、この問題を解決する方法がわかりません。
selinuxでいくつかのポリシー更新が発生し、pingが実行されますが、100%パケット損失のために宛先IPに到達できませんが、selinuxが無効になっていると宛先に到達するのと同じです。
答え1
私はSELinuxが悪いものをつかむことが好きです。この場合、
exec
:はい、外部の実行可能ファイルを実行しているPHPスクリプトにサーバー構成がどのように反応するかを確認できます。少なくとも実際にユーザー入力をいくつかのシェルに渡さないことを願っています!- ICMP要求(「ping」)を実行する必要がある場合は、呼び出し実行可能ファイル(/usr/bin/phpなど)のファイル形式を指定する必要があります
ping_exec_t
。文書。
全体的に、経験が足りない開発者なら(私たち全員はある意味ではそうです!) おそらく次のような文章を書いているでしょう。実際にサーバーをリモート実行の問題にさらすこと(exec
PHPで使用されるのは一般的に非常に大きな危険信号であるため、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
コメントに私が要求した出力を投稿してください。