O PHP não pode se conectar ao PostgreSQL com o erro “permission denied” com o SELinux

1

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

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

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

PHP Warning: pg_connect(): Unable to connect to PostgreSQL server: could not connect to server: Permission denied. Is the server running locally and accepting connections on Unix domain socket "/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

    
por Chloe 06.07.2014 / 09:54

3 respostas

1

Eu consertei! Eu encontrei uma solução aqui: link

O que eu fiz foi pegar as duas linhas que foram escritas para audit.log, e coloquei elas em audit2allow , que gera 2 arquivos, um binário e um texto. Então eu 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 gerado por ele foi mypol.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;
    
por 07.07.2014 / 06:53
1

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

Você precisa ver o /var/log/audit/audit.log para recusar o avc.

como alternativa, certifique-se de ter o seguinte instalado

  1. setroubleshoot-server
  2. auditd
  3. messagebus

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

referência adicional: link

O motivo pelo qual o shell interativo do php funciona é que ele está sendo executado no contexto do usuário, onde o aplicativo está sendo executado com o contexto do apache.

    
por 06.07.2014 / 14:43
0

Você tentou simplesmente configurar o booleano de política do SELinux que permite ao httpd fazer 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 '... = > em '

Depois disso, se você desativar /var/log/audit/audit.log e tentar novamente sua operação, isso deve funcionar.

    
por 14.01.2015 / 15:42