PHP не может подключиться к PostgreSQL с ошибкой "Отказано в доступе" в SELinux
Мое PHP-приложение может подключаться, когда я выключаю SELinux, но не с ним.
setenforce 0; curl -I http://domain.com; setenforce 1
Не дает ошибок в /var/log/httpd/error_log
, Однако, если он у меня включен, я получаю эту ошибку:
Предупреждение PHP: pg_connect(): невозможно подключиться к серверу PostgreSQL: не удалось подключиться к серверу: разрешение запрещено. Работает ли сервер локально и принимает подключения через сокет домена Unix "/tmp/.s.PGSQL.5432"?
я пробовал
# restorecon -R -v /home/domain/public_html
# chcon -R -t httpd_sys_rw_content_t /home/domain/public_html/
# chcon -v --type=httpd_sys_content_t /home/domain/public_html
# semanage fcontext -a -t httpd_sys_content_t "/home/domain/public_html(/.*)?"
# service httpd restart
С SELinux я все еще могу сделать это:
# php -a
Interactive shell
php > $connection = pg_connect ("dbname=domain user=domain password=xxxxxx") or die(pg_last_error());
php > echo $connection;
Resource id #1
Здесь ошибка от /var/log/audit/audit.log
:
type=AVC msg=audit(1404684735.513:97245): avc: denied { write } for pid=3594 comm="httpd" name=".s.PGSQL.5432" dev=xvde ino=2552 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:tmp_t:s0 tclass=sock_file
type=SYSCALL msg=audit(1404684735.513:97245): arch=c000003e syscall=42 success=no exit=-13 a0=b a1=7f40ae4fd640 a2=6e a3=0 items=0 ppid=26231 pid=3594 auid=0 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=2700 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
CentOS 6.5
3 ответа
Я починил это! Я нашел решение здесь: https://bugzilla.redhat.com/show_bug.cgi?id=772084
Я взял две строки, которые были записаны в audit.log, и отправил их в audit2allow
, который генерирует 2 файла, двоичный файл и текст. Затем я импортировал этот файл в semodule
, Я не понимаю файл однако. Убедитесь, что вы фиксируете ошибки httpd.
tail -2 /var/log/audit/audit.log | audit2allow -M mypol
semodule -i mypol.pp # takes a while
Фактический текстовый файл, который он генерировал, был mypol.te
module mypol 1.0;
require {
type httpd_t;
type initrc_t;
class unix_stream_socket connectto;
}
#============= httpd_t ==============
allow httpd_t initrc_t:unix_stream_socket connectto;
Вы пробовали просто установить логическое значение политики SELinux, которое позволяет httpd устанавливать соединения с БД через:
setsebool -P httpd_can_network_connect_db 1
Это сработало для меня. Вы можете проверить / убедиться, что настройка установлена:
getsebool httpd_can_network_connect_db
который должен вернуть '... => on'
После этого, если вы зададите -f /var/log/audit/audit.log и повторите попытку, это должно сработать.
Требуется больше информации:
Вам нужно посмотреть /var/log/audit/audit.log для отказов avc.
в качестве альтернативы убедитесь, что у вас установлено следующее
- setroubleshoot-сервер
- auditd
- messagebus
Сообщения появятся в / var / log / messages
дополнительная ссылка: http://danwalsh.livejournal.com/7995.html
Причина, по которой ваша интерактивная оболочка php работает, заключается в том, что она работает в вашем пользовательском контексте, где ваше приложение работает с контекстом apache.