RHEL SELinux 阻止 Apache 訪問 PostgreSQL
我正在執行一個使用 PostgreSQL 的 Django 應用程序。伺服器正在執行帶有 SELinux 的 RHEL 6.5。我遇到了 Django 應用程序無法連接到數據庫的問題,我認為這是因為 SELinux 阻止了它。這是我在 Django 中看到的錯誤:
could not connect to server: Permission denied Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
我怎樣才能解決這個問題?我遇到了這篇文章,但我不確定如何將解決方案 (
chcon -t postgresql_exec_t /path/to/pgbouncer
) 應用於我的問題。謝謝!
$$ edit $$
這是
/var/log/audit/audit.log
我嘗試訪問該網站時的樣子:type=AVC msg=audit(1396289984.549:9245): avc: denied { write } for pid=16975 comm="httpd" name=".s.PGSQL.5432" dev=sda1 ino=2359354 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:tmp_t:s0 tclass=sock_file type=SYSCALL msg=audit(1396289984.549:9245): arch=c000003e syscall=42 success=no exit=-13 a0=10 a1=7fe625273aa0 a2=6e a3=0 items=0 ppid=16943 pid=16975 auid=22383 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1213 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null) type=AVC msg=audit(1396289984.756:9246): avc: denied { write } for pid=16975 comm="httpd" name=".s.PGSQL.5432" dev=sda1 ino=2359354 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:tmp_t:s0 tclass=sock_file type=SYSCALL msg=audit(1396289984.756:9246): arch=c000003e syscall=42 success=no exit=-13 a0=10 a1=7fe624d87890 a2=6e a3=0 items=0 ppid=16943 pid=16975 auid=22383 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1213 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null) type=AVC msg=audit(1396289984.757:9247): avc: denied { write } for pid=16975 comm="httpd" name=".s.PGSQL.5432" dev=sda1 ino=2359354 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:tmp_t:s0 tclass=sock_file type=SYSCALL msg=audit(1396289984.757:9247): arch=c000003e syscall=42 success=no exit=-13 a0=10 a1=7fe625342c20 a2=6e a3=0 items=0 ppid=16943 pid=16975 auid=22383 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1213 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null) type=AVC msg=audit(1396289984.758:9248): avc: denied { write } for pid=16975 comm="httpd" name=".s.PGSQL.5432" dev=sda1 ino=2359354 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:tmp_t:s0 tclass=sock_file type=SYSCALL msg=audit(1396289984.758:9248): arch=c000003e syscall=42 success=no exit=-13 a0=10 a1=7fe625603ac0 a2=6e a3=0 items=0 ppid=16943 pid=16975 auid=22383 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1213 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)
$$ edit2 $$ 以下是我啟用的一些相關 SELinux 選項。
-bash-4.1$ sudo getsebool -a | grep httpd_can_network_connect_db httpd_can_network_connect_db --> on -bash-4.1$ sudo getsebool -a | grep allow_user_postgresql_connect allow_user_postgresql_connect --> on
好的,在系統管理員的幫助下,問題現在已解決。事實證明,分配給二進製文件的 SELinux 上下文
/usr/pgsql-9.3/bin
是錯誤的。解決這個問題所需要的只是chcon -t postgresql_exec_t /usr/pgsql-9.3/bin
. 要更改符號連結的上下文,只需添加-h
.
對於未來的讀者,對我來說,只需將 bool 設置為允許 httpd 建立數據庫連接就足夠了;IE:
setsebool -P httpd_can_network_connect_db 1
您可以通過以下方式檢查/驗證設置是否設置:
getsebool httpd_can_network_connect_db
應該返回 ‘… => on’
之後,如果您 tail -f /var/log/audit/audit.log 並重新嘗試您的操作,它應該可以工作。