PHP не может подключиться к PostgreSQL из-за ошибки «отказано в доступе» с SELinux

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

решение1

Вы пробовали просто задать логическое значение политики SELinux, которое позволяет httpd устанавливать соединения с базой данных через:

setsebool -P httpd_can_network_connect_db 1

Это сработало для меня. Вы можете проверить/убедиться, что настройка установлена:

getsebool httpd_can_network_connect_db

который должен вернуть '... => on'

После этого, если вы выполните команду tail -f /var/log/audit/audit.log и повторите операцию, она должна сработать.

решение2

Требуется дополнительная информация:

Вам необходимо просмотреть /var/log/audit/audit.log на предмет отказов AVC.

в качестве альтернативы убедитесь, что у вас установлено следующее

  1. setroubleshoot-сервер
  2. аудитд
  3. сообщениеbus

Сообщения будут отображаться в /var/log/messages

дополнительная ссылка:http://danwalsh.livejournal.com/7995.html

Причина, по которой ваша интерактивная оболочка PHP работает, заключается в том, что она работает в контексте вашего пользователя, тогда как ваше приложение работает в контексте Apache.

решение3

Я исправил это! Я нашел решение здесь:https://bugzilla.redhat.com/show_bug.cgi?id=772084#c8

Я взял 2 строки, которые были записаны в 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;

Связанный контент