PHP kann mit SELinux keine Verbindung zu PostgreSQL herstellen, da der Fehler „Zugriff verweigert“ auftritt

PHP kann mit SELinux keine Verbindung zu PostgreSQL herstellen, da der Fehler „Zugriff verweigert“ auftritt

Meine PHP-App kann eine Verbindung herstellen, wenn ich SELinux ausschalte, aber nicht, wenn es aktiviert ist.

setenforce 0; curl -I http://domain.com; setenforce 1

Ergibt keine Fehler in /var/log/httpd/error_log. Wenn ich es jedoch eingeschaltet habe, erhalte ich diesen Fehler:

PHP-Warnung: pg_connect(): Keine Verbindung zum PostgreSQL-Server möglich: Verbindung zum Server konnte nicht hergestellt werden: Berechtigung verweigert. Läuft der Server lokal und akzeptiert Verbindungen über den Unix-Domain-Socket „/tmp/.s.PGSQL.5432“?

ich habe es versucht

# 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

Wenn SELinux aktiviert ist, kann ich immer noch Folgendes tun:

# 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

Hier ist der Fehler von /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

Antwort1

Haben Sie versucht, einfach den Booleschen Wert für die SELinux-Richtlinie festzulegen, der es httpd ermöglicht, DB-Verbindungen über Folgendes herzustellen:

setsebool -P httpd_can_network_connect_db 1

Das hat bei mir funktioniert. Sie können überprüfen, ob die Einstellung richtig ist, indem Sie:

getsebool httpd_can_network_connect_db

was „... => on“ zurückgeben sollte

Wenn Sie anschließend tail -f /var/log/audit/audit.log eingeben und den Vorgang erneut versuchen, sollte es funktionieren.

Antwort2

Es werden weitere Informationen benötigt:

Sie müssen in /var/log/audit/audit.log nach AVC-Ablehnungen suchen.

Alternativ stellen Sie sicher, dass Sie Folgendes installiert haben

  1. setroubleshoot-server
  2. geprüft
  3. Nachrichtenbus

Die Nachrichten erscheinen in /var/log/messages

weitere Referenz:http://danwalsh.livejournal.com/7995.html

Der Grund, warum Ihre interaktive PHP-Shell funktioniert, besteht darin, dass sie in Ihrem Benutzerkontext ausgeführt wird, während Ihre Anwendung im Apache-Kontext ausgeführt wird.

Antwort3

Ich habe es behoben! Ich habe hier eine Lösung gefunden:https://bugzilla.redhat.com/show_bug.cgi?id=772084#c8

Ich habe die beiden Zeilen, die in audit.log geschrieben wurden, genommen und sie in weitergeleitet audit2allow, wodurch zwei Dateien generiert wurden, eine Binärdatei und eine Textdatei. Dann habe ich diese Datei in importiert semodule. Ich verstehe die Datei jedoch nicht. Stellen Sie sicher, dass Sie die HTTPD-Fehler erfassen.

tail -2 /var/log/audit/audit.log | audit2allow -M mypol
semodule -i mypol.pp # takes a while

Die tatsächlich generierte Textdatei warmypol.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;

verwandte Informationen