curl(7)cgi 脚本的权限被拒绝

curl(7)cgi 脚本的权限被拒绝

无法理解哪些权限可以被拒绝。从命令行运行 cgi 脚本可以正常工作。

http_proxy="" curl http://url/ -o file

生产curl(7): permission denied

(同样的问题wget

编辑(解决方法) 现在我必须部分禁用 SELinux 才能使其正常工作(尝试调整所有权限但无济于事)。

答案1

搞清楚了。尽管apache从命令行运行脚本有效,但当通过 Web 调用 cgi 脚本时,SELinux它似乎停止了。curlwget

编辑/etc/selinux/config、更改SELINUX=permissive(仅供参考:这会产生后果)

寻找更好的方法来处理这个问题。

答案2

我遇到了类似的问题,SELinux 阻止了来自 CGI 的 curl 调用。解决此问题的最佳方法是:

  1. 重现该问题以便登录/var/log/audit/audit.log
  2. 解析日志以创建模块:

    $ tail /var/log/audit/audit.log | audit2allow -M curlCgi
    
  3. 加载生成的模块:

    $ /usr/sbin/semodule -i curlCgi.pp
    

更多阅读:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/sect-Security-Enhanced_Linux-Fixing_Problems-Allowing_Access_audit2allow.html

答案3

systemd当守护进程在启动时调用/opt/dir/to/myscript.sh包含命令的程序时,我遇到了这个问题curl。与 OP 一样,失败并出现错误 7。

我发现这篇精彩的文章由 NGINX 的优秀人员提供,从他们那里我了解到audit2why,这是一个帮助调试 SELinux 问题的绝佳工具。

这是我做的:

  1. 重新启动有问题的守护进程以复制问题
  2. # tail -n 10 /var/log/audit/audit.log列出最新问题
  3. 发现这一行正是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
  4. 复制消息代码162431xxxx.342:20yyyy7
  5. # 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
  1. 按照建议运行# setsebool -P nis_enabled 1,再试一次,问题就不再存在了!

好吧,我承认这仍然是一个 hack,而且我对 SELinux 也没有什么经验。但至少这个更好,好多了而不是直接禁用 SELinux。因此,请做好尽职调查,并确保你实际上了解你设置的标志。最终,你要对自己的安全负责!

相关内容