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
- setroubleshoot-server
- geprüft
- 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;