PHP no puede conectarse a PostgreSQL con error de "permiso denegado" con SELinux

PHP no puede conectarse a PostgreSQL con error de "permiso denegado" con SELinux

Mi aplicación PHP puede conectarse cuando apago SELinux, pero no cuando está activado.

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

No produce errores en /var/log/httpd/error_log. Sin embargo, si lo tengo activado, aparece este error:

Advertencia de PHP: pg_connect(): No se puede conectar al servidor PostgreSQL: no se pudo conectar al servidor: Permiso denegado. ¿El servidor se ejecuta localmente y acepta conexiones en el socket de dominio Unix "/tmp/.s.PGSQL.5432"?

He intentado

# 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

Con SELinux activado, todavía puedo hacer esto:

# 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

Aquí está el error de /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

Respuesta1

¿Intentó simplemente configurar la política booleana de SELinux que permite a httpd realizar conexiones de base de datos a través de:

setsebool -P httpd_can_network_connect_db 1

Esto funcionó para mí. Puede comprobar/verificar que la configuración está establecida mediante:

getsebool httpd_can_network_connect_db

que debería devolver '... => activado'

Después de eso, si sigue -f /var/log/audit/audit.log y vuelve a intentar la operación, debería funcionar.

Respuesta2

Se necesita más información:

Debe consultar /var/log/audit/audit.log para conocer las denegaciones de avc.

alternativamente asegúrese de tener lo siguiente instalado

  1. solucionar problemas del servidor
  2. auditado
  3. bus de mensajes

Los mensajes aparecerán en /var/log/messages

referencia adicional:http://danwalsh.livejournal.com/7995.html

La razón por la que su shell interactivo de PHP funciona es que se ejecuta en su contexto de usuario, mientras que su aplicación se ejecuta con el contexto de Apache.

Respuesta3

¡Lo arreglé! Encontré una solución aquí:https://bugzilla.redhat.com/show_bug.cgi?id=772084#c8

Lo que hice fue tomar las 2 líneas escritas en audit.log y canalizarlas a audit2allow, que genera 2 archivos, un binario y un texto. Luego importé ese archivo a semodule. Sin embargo, no entiendo el archivo. Asegúrese de capturar los errores de httpd.

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

El archivo de texto real que generó fuemypol.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;

información relacionada