PHP não consegue se conectar ao PostgreSQL com erro de “permissão negada” com SELinux

PHP não consegue se conectar ao PostgreSQL com erro de “permissão negada” com SELinux

Meu aplicativo PHP pode se conectar quando eu desativo o SELinux, mas não com ele ativado.

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

Não produz erros em /var/log/httpd/error_log. No entanto, se eu estiver ativado, recebo este erro:

Aviso do PHP: pg_connect(): Não foi possível conectar ao servidor PostgreSQL: não foi possível conectar ao servidor: Permissão negada. O servidor está executando localmente e aceitando conexões no soquete de domínio Unix "/tmp/.s.PGSQL.5432"?

eu tentei

# 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

Com o SELinux ativado, ainda posso fazer isso:

# 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

Aqui está o erro 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

Responder1

Você tentou simplesmente definir o booleano da política SELinux que permite que o httpd faça conexões de banco de dados via:

setsebool -P httpd_can_network_connect_db 1

Isso funcionou para mim. Você pode verificar/verificar se a configuração está definida por:

getsebool httpd_can_network_connect_db

que deve retornar '... => on'

Depois disso, se você tail -f /var/log/audit/audit.log e tentar novamente sua operação, ela deverá funcionar.

Responder2

Mais informações são necessárias:

Você precisa consultar /var/log/audit/audit.log para ver as negações do avc.

como alternativa, certifique-se de ter o seguinte instalado

  1. setroubleshoot-server
  2. auditado
  3. barramento de mensagens

As mensagens aparecerão em /var/log/messages

referência adicional:http://danwalsh.livejournal.com/7995.html

A razão pela qual seu shell interativo php funciona é que ele está sendo executado no contexto do usuário, enquanto seu aplicativo está sendo executado no contexto do Apache.

Responder3

Eu consertei isso! Encontrei uma solução aqui:https://bugzilla.redhat.com/show_bug.cgi?id=772084#c8

O que fiz foi pegar as 2 linhas que foram escritas em audit.log e canalizá-las para audit2allow, o que gera 2 arquivos, um binário e um de texto. Então importei esse arquivo para semodule. Eu não entendo o arquivo, no entanto. Certifique-se de capturar os erros do httpd.

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

O arquivo de texto real gerado foimypol.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;

informação relacionada