ping:套接字:权限被拒绝

ping:套接字:权限被拒绝

我们正在用 PHP 为我们的产品开发一个管理 UI。它托管在 Centos 7 和 Apache Web 服务器上。用户应该能够使用此 UI 对 IP 地址执行 ping 操作。所以我们需要调用exec(IPAddress)PHP代码并获取结果并显示给用户。问题是它会引发错误消息。这是错误:

ping: socket: Permission denied

当我在 shell 中执行时,setenforce 0Centos 让我们从 PHP 执行 ping 命令。如何告诉 Centos 让 php 永久执行 ping 命令?

更新:通过使用audit2why我收到此消息:

type=AVC msg=audit(1502697341.249:11426): avc:  denied  { create } for
pid=28530 comm="ping" scontext=system_u:system_r:httpd_t:s0
tcontext=system_u:system_r:httpd_t:s0 tclass=rawip_socket

    Was caused by:
    Missing type enforcement (TE) allow rule.

    You can use audit2allow to generate a loadable module to allow this access.

答案1

SELinux 正在阻止 PHP 执行ping.您需要将正确的上下文归因于您的 PHP 脚本。

假设它们位于/var/www/html/,您需要执行以下操作:

semanage fcontext -a -t httpd_sys_script_exec_t '/var/www/html(/.*)?'
restorecon -R -v /var/www/html/

但是,这必须由服务器上的 root 用户完成。

注意:键入后 ping 起作用,setenforce 0因为此命令禁用 SELinux。要永久禁用 SELinux(不推荐,因为这会关闭安全检查),请编辑/etc/sysconfig/selinux并指定SELINUX=disabled.

答案2

您可以尝试以下操作。

将该代码放入local_httpd.te文件中:

policy_module(local_httpd, 0.0.1)

gen_require(`
    type httpd_t;
')

netutils_domtrans_ping(httpd_t)

检查您是否已selinux-policy-devel安装 RPM,然后执行以下操作:

make -f /usr/share/selinux/devel/Makefile local_httpd.ppsemodule -i local_httpd.pp

这应该允许 apache (httpd_t) 转换到 ping 可执行文件的上下文

答案3

我能给你的最好建议是关闭 SELinux花时间让你的系统更加安全,而不是跳过神秘和任意的障碍。

....不幸的是,我们并不生活在一个完美的世界中 - 因此“推荐”的解决方案是将策略设置为宽松,运行调用 ping 的脚本,恢复强制模式,然后针对测试中生成的审核日志运行audit2allow (有关详细信息,请参阅链接文档)。

遗憾的是这并不适用于所有情况。

相关内容