通过 upstart 启动 lig​​httpd+fastcgi 时 SELinux 导致“权限被拒绝”

通过 upstart 启动 lig​​httpd+fastcgi 时 SELinux 导致“权限被拒绝”

我无法通过 upstart 启动 lig​​httpd fastcgi python 应用程序。我可以使用sudo lighttpd -D -f /path/to/lighttpd.conf和 通过成功启动该应用程序su -c "lighttpd -f /path/to/lighttpd.conf

在 upstart 中我使用以下脚本:

start on filesystem and started networking
stop on runlevel [06]

respawn

exec lighttpd -f /path/to/lighttpd/lighttpd.conf -D

这会导致 /var/log/lighttpd/error.log 中出现以下错误:

2011-11-28 15:35:25: (mod_fastcgi.c.978) bind failed for: unix:/var/lib/lighttpd/sockets/fastcgi.python.socket-0 Permission denied 
2011-11-28 15:35:25: (mod_fastcgi.c.1399) [ERROR]: spawning fcgi failed. 
2011-11-28 15:35:25: (server.c.938) Configuration of plugins failed. Going down. 

ls -l /var/lib/lighttpd/sockets/节目

drwxr-xr-x. 2 lighttpd lighttpd 4096 Nov 28 15:19 .
drwxr-xr-x. 3 lighttpd lighttpd 4096 Nov 28 15:19 ..

并且 lighttpd 配置为使用 lighttpd 用户和组(来自我的 lighttpd.conf):

server.username  = "lighttpd"
server.groupname = "lighttpd"

我尝试在 upstart 节中添加 strace,但并没有发现任何明显错误。我还可以采取哪些进一步的步骤来调试?还有什么可能导致此问题?这是在 CentOS 6 上。

我开始怀疑这与 selinux 有关。我在 audit.log 中发现了这一点:

type=AVC msg=audit(1322516700.993:6418): avc:  denied  { write } for  pid=7920 comm="lighttpd" name="sockets" dev=vda3 ino=146700 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:lib_t:s0 tclass=dir
type=SYSCALL msg=audit(1322516701.053:6419): arch=c000003e syscall=42 success=no exit=-13 a0=5 a1=7fff848dfef0 a2=39 a3=2f7374656b636f73 items=0 ppid=1 pid=7922 auid=4294967295 uid=496 gid=490 euid=496 suid=496 fsuid=496 egid=490 sgid=490 fsgid=490 tty=(none) ses=4294967295 comm="lighttpd" exe="/usr/sbin/lighttpd" subj=system_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1322516701.053:6419): avc:  denied  { write } for  pid=7922 comm="lighttpd" name="fastcgi.python.socket-0" dev=vda3 ino=146472 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:lib_t:s0 tclass=sock_file

谢谢!

答案1

selinux 是罪魁祸首。禁用 selinux 可以echo 0>/selinux解决问题。我进一步缩小了范围,setsebool -P httpd_can_network_connect 1但最好将一些 SELinux 策略更改应用于我的应用程序而不是整个系统。

答案2

您可以通过大致执行以下操作来构建自定义 SELinux 目标策略:

  • 将您想要允许从消息或审计日志中拒绝的审计消息添加到名为的新文件中: /etc/selinux/local/YOUR_POL.audit
  • 检查更改,如果满意,则创建一个新的 selinux 目标:
    cat /etc/selinux/local/YOUR_POL.audit | audit2allow -m audit > YOUR_POL.te
  • 检查并构建模块:
    checkmodule -M -m -o YOUR_POL.mod TOUR_POL.te
  • 打包模块:
    semodule_package -o YOUR_POL.pp -m YOUR_POL.mod
  • 加载打包的模块:
    semodule -i YOUR_POL.pp

答案3

  1. 我会把插座插进去/var/run/lighttpd
  2. 我会预先创建套接字 ( touch /var/run/lighttpd/fastcgi.python.socket-0)。不确定 lighttpd 是否能以其他方式获取它。

相关内容