无法理解哪些权限可以被拒绝。从命令行运行 cgi 脚本可以正常工作。
http_proxy="" curl http://url/ -o file
生产curl(7): permission denied
(同样的问题wget
)
编辑(解决方法) 现在我必须部分禁用 SELinux 才能使其正常工作(尝试调整所有权限但无济于事)。
答案1
搞清楚了。尽管apache
从命令行运行脚本有效,但当通过 Web 调用 cgi 脚本时,SELinux
它似乎停止了。curl
wget
编辑/etc/selinux/config
、更改SELINUX=permissive
(仅供参考:这会产生后果)
寻找更好的方法来处理这个问题。
答案2
我遇到了类似的问题,SELinux 阻止了来自 CGI 的 curl 调用。解决此问题的最佳方法是:
- 重现该问题以便登录
/var/log/audit/audit.log
解析日志以创建模块:
$ tail /var/log/audit/audit.log | audit2allow -M curlCgi
加载生成的模块:
$ /usr/sbin/semodule -i curlCgi.pp
答案3
systemd
当守护进程在启动时调用/opt/dir/to/myscript.sh
包含命令的程序时,我遇到了这个问题curl
。与 OP 一样,失败并出现错误 7。
我发现这篇精彩的文章由 NGINX 的优秀人员提供,从他们那里我了解到audit2why
,这是一个帮助调试 SELinux 问题的绝佳工具。
这是我做的:
- 重新启动有问题的守护进程以复制问题
# tail -n 10 /var/log/audit/audit.log
列出最新问题- 发现这一行正是
curl
失败的原因:type=AVC msg=audit(162431xxxx.342:20yyyy7): avc: denied { name_connect } for pid=xxxxxxx comm="curl" dest=443 scontext=system_u:system_r:fsdaemon_t:s0 tcontext=system_u:object_r:http_port_t:s0 tclass=tcp_socket permissive=0
- 复制消息代码
162431xxxx.342:20yyyy7
# cat /var/log/audit/audit.log | grep "162431xxxx.342:20yyyy7" | audit2why
让它建议哪些sebool
需要启用
Was caused by:
The boolean nis_enabled was set incorrectly.
Description:
Allow nis to enabled
Allow access by executing:
# setsebool -P nis_enabled 1
- 按照建议运行
# setsebool -P nis_enabled 1
,再试一次,问题就不再存在了!
好吧,我承认这仍然是一个 hack,而且我对 SELinux 也没有什么经验。但至少这个更好,好多了而不是直接禁用 SELinux。因此,请做好尽职调查,并确保你实际上了解你设置的标志。最终,你要对自己的安全负责!