Назад | Перейти на главную страницу

SELinux вызывает сообщение «Permission denied» при запуске lighttpd + fastcgi через выскочку

У меня проблемы с запуском приложения python lighttpd fastcgi через выскочку. Я могу успешно запустить приложение, используя sudo lighttpd -D -f /path/to/lighttpd.conf и через su -c "lighttpd -f /path/to/lighttpd.conf.

В выскочке я использую следующий сценарий:

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"

Я пробовал добавить 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

Спасибо!

Вы можете создать собственные целевые политики 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

selinux был виноватым. Отключение selinux с помощью echo 0>/selinux решил вопрос. Кроме того, я смог сузить молот до setsebool -P httpd_can_network_connect 1 но было бы неплохо применить некоторые изменения политики SELinux к моему приложению, а не к общесистемному.

  1. Я бы вставил розетки /var/run/lighttpd
  2. Я бы заранее создал сокеты (touch /var/run/lighttpd/fastcgi.python.socket-0). Не уверен, что lighttpd получит это иначе.