Как я запускал связку 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 и получаем готовый инструмент.
Спасибо за исключительно полезный текст, решил проблему, с которой я боролся почти две недели.. Удачи!
:) Рад, что мои записки кому-то помогают.
[...] точнее как минимум апач не имел доступа ни к чему. Есть вариант настройки прав для апача, но у меня почему-то не сработало. Поэтому пришлось её [...]