Apache伺服器運行Centos7。我試圖從 PHP 的“exec”命令執行 ping,但收到“socket:權限被拒絕”。它可以在 selinux 禁用的情況下工作。我的linux知識有些有限,我不知道該如何解決這個問題。
selinux 中是否進行了一些策略更新,並且 ping 現在運行,但出現 100% 封包丟失,就好像它無法到達目標 IP,但它在禁用 selinux 的情況下到達了目標 IP。
答案1
我喜歡 SELinux 確實能捕獲壞東西。在這種情況下,
exec
:是的,我可以看到伺服器配置如何對執行外部執行檔的 PHP 腳本做出過敏反應;經典切入點。我至少希望您實際上沒有將使用者輸入傳遞給某個 shell!- 如果您確實需要執行 ICMP 請求(“ping”),則需要提供呼叫可執行檔(可能是 /usr/bin/php 等)
ping_exec_t
檔案類型。文件。
總而言之,如果您是缺乏經驗的開發人員(我們在某些方面都是如此!),那麼您很可能正在編寫一些實際上讓你的伺服器面臨遠端執行問題(exec
在 PHP 中使用通常是一個非常大的危險訊號,這就是為什麼你的 CentOS 設定 SELinux 來禁止這種情況)。ping
可以透過直接建立與您真正感興趣的服務的連接(例如,TCP)來代替調用,如果可能的話,您可能應該這樣做。
答案2
我同意馬庫斯·穆勒的觀點,你可能不會想要這個。但是,這可能會起作用:
建立文件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
我在評論中詢問的輸出。