PHP 無法連線到 PostgreSQL,並出現 SELinux 的「權限被拒絕」錯誤

PHP 無法連線到 PostgreSQL,並出現 SELinux 的「權限被拒絕」錯誤

當我關閉 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. 設定故障排除伺服器
  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 的兩行內容透過管道傳輸到audit2allow,這會產生兩個檔案:一個二進位檔案和一個文字檔案。然後我將該文件匯入到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;

相關內容