расставляй правильно приоритеты и не отвлекайся на мелочи

Как я запускал связку Apache + PHP + MySQL под SELinux

Тем из Вас, кто использует в качестве серверной платформы операционные системы семейства Linux, к примеру Debian, Ubuntu, Fedora и т.д., с включенной функцией расширенной безопасности SELinux, и пытались запустить PHP 5 под Apache 2.x наверняка знакомо «знаменитое» сообщение, типа такого:

httpd: Syntax error on line xx of /usr/local/apache2/conf/httpd.conf: Cannot load /usr/local/apache2/modules/libphp5.so into server: /usr/local/apache2/modules/libphp5.so: cannot restore segment prot after reloc: Permission denied

По крайней мере за дистрибутив Fedora я могу однозначно ответить, там такое есть. Смею предположить, что для многих единственным решением данной проблемы было выключение SELinux, я и сам так делал, пока после Fedora 7 не понял, что дальше так продолжаться не должно и с SELinux надо бы разобраться.

Скажу сразу, полностью разобраться с SELinux моих мозгов не хватило, но решить проблему все-таки удалось, может среди Вас есть сикюрити гики, которые могут подсказать мне более правильный путь или указать на мои ошибки, буду очень благодарен.

В общем к делу, рассказывать как устроен и работает этот самый SELinux я не собираюсь, для этого полно материала в сети (Fedora SELinux, Managing Red Hat Enterprise Linux 5). Apache, PHP и MySQL Вы надеюсь уже поставили, осталось только взлететь.

Перечитав всю эту груду материала я чуть было уже не начал учить язык описания политик SPDL, но вовремя остановился, поняв, что все должно быть гораздо проще.

В итоге я понял одно, мне нужно описать политику для разрешений libphp5.so и добавить ее к существующей и я поступил следующим образом:

Во первых, поставил на аудит в отдельный файл все действия касающиеся SELinux, для этого есть демон audit, может быть у Вас он уже запущен, который по умолчанию льет все сообщения в /var/log/audit/audit.log. Если такового нет — ставьте: yum install audit

Далее сделал попытку запуска Apache, чтобы засветиться в логе аудита.

После этого выдернул из лога все, что касается контекста http и скомпилировал новую политику, дав ей название myhttpd. Все это можно сделать так:

grep http /var/log/audit/audit.log | audit2allow -M myhttpd

В полученном исходном файле принуждений (Enforcement File) myhttpd.te утилита audit2allow сформировала следующие записи:

module myhttpd 1.0;

require {
type lib_t;
type initrc_t;
class file execmod;
}

#============= initrc_t ==============
allow initrc_t lib_t:file execmod;

и скомпилировала файл политик myhttpd.pp, который осталось только установить:

semodule -i myhttpd.pp

Все. Немного ждем пока установится еще одна политика, перезапускаем Apache и получаем готовый инструмент.

4 комментария на статью:
  1. Michael:

    Спасибо за исключительно полезный текст, решил проблему, с которой я боролся почти две недели.. Удачи!

  2. bridennis:

    :) Рад, что мои записки кому-то помогают.

  3.   Как я запускал новый сервер под linux by Padlik.ru:

    […] точнее как минимум апач не имел доступа ни к чему. Есть вариант настройки прав для апача, но у меня почему-то не сработало. Поэтому пришлось её […]

  4. Rekby:

    Спасибо, мне помогло.

    Дополню, что audit2allow ставится так:
    yum -y install policycoreutils-python

Ответить
Обязательные поля помечены *