selinux 阻止來自 php exec 的 ping

selinux 阻止來自 php exec 的 ping

Apache伺服器運行Centos7。我試圖從 PHP 的“exec”命令執行 ping,但收到“socket:權限被拒絕”。它可以在 selinux 禁用的情況下工作。我的linux知識有些有限,我不知道該如何解決這個問題。

selinux 中是否進行了一些策略更新,並且 ping 現在運行,但出現 100% 封包丟失,就好像它無法到達目標 IP,但它在禁用 selinux 的情況下到達了目標 IP。

答案1

我喜歡 SELinux 確實能捕獲壞東西。在這種情況下,

  1. exec:是的,我可以看到伺服器配置如何對執行外部執行檔的 PHP 腳本做出過敏反應;經典切入點。我至少希望您實際上沒有將使用者輸入傳遞給某個 shell!
  2. 如果您確實需要執行 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我在評論中詢問的輸出。

相關內容