我们正在用 PHP 为我们的产品开发一个管理 UI。它托管在 Centos 7 和 Apache Web 服务器上。用户应该能够使用此 UI 对 IP 地址执行 ping 操作。所以我们需要调用exec(IPAddress)
PHP代码并获取结果并显示给用户。问题是它会引发错误消息。这是错误:
ping: socket: Permission denied
当我在 shell 中执行时,setenforce 0
Centos 让我们从 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.pp
和semodule -i local_httpd.pp
这应该允许 apache (httpd_t) 转换到 ping 可执行文件的上下文
答案3
我能给你的最好建议是关闭 SELinux花时间让你的系统更加安全,而不是跳过神秘和任意的障碍。
....不幸的是,我们并不生活在一个完美的世界中 - 因此“推荐”的解决方案是将策略设置为宽松,运行调用 ping 的脚本,恢复强制模式,然后针对测试中生成的审核日志运行audit2allow (有关详细信息,请参阅链接文档)。
遗憾的是这并不适用于所有情况。