當我關閉 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 拒絕。
或確保您安裝了以下軟體
- 設定故障排除伺服器
- 審核
- 訊息總線
訊息將出現在 /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;