PHP 无法连接到 PostgreSQL,SELinux 出现“权限被拒绝”错误

PHP 无法连接到 PostgreSQL,SELinux 出现“权限被拒绝”错误

当我关闭 SELinux 时,我的 PHP 应用程序可以连接,但打开它时则无法连接。

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 通过以下方式建立 DB 连接:

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. 设置故障排除-服务器
  2. 审计
  3. 消息总线

这些消息将出现在 /var/log/messages 中

进一步参考:http://danwalsh.livejournal.com/7995.html

您的 php 交互式 shell 之所以能工作是因为它在您的用户上下文中运行,而您的应用程序则在 apache 上下文中运行。

答案3

我修好了!我在这里找到了解决方案:https://bugzilla.redhat.com/show_bug.cgi?id=772084#c8

我所做的是获取写入 audit.log 的 2 行,并将它们通过管道传输到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;

相关内容