Apache服务器运行Centos7。我试图从 PHP 的“exec”命令执行 ping,但收到“socket:权限被拒绝”。它可以在 selinux 禁用的情况下工作。我的linux知识有些有限,我不知道如何解决这个问题。
selinux 中是否进行了一些策略更新,并且 ping 现在运行,但出现 100% 数据包丢失,就好像它无法到达目标 IP,但它在禁用 selinux 的情况下到达了目标。
答案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
我在评论中询问的输出。