selinux 阻止来自 php exec 的 ping

selinux 阻止来自 php exec 的 ping

Apache服务器运行Centos7。我试图从 PHP 的“exec”命令执行 ping,但收到“socket:权限被拒绝”。它可以在 selinux 禁用的情况下工作。我的linux知识有些有限,我不知道如何解决这个问题。

selinux 中是否进行了一些策略更新,并且 ping 现在运行,但出现 100% 数据包丢失,就好像它无法到达目标 IP,但它在禁用 selinux 的情况下到达了目标。

答案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我在评论中询问的输出。

相关内容