SELinux restringe acesso ao Apache / PHP

3

Eu instalei um sistema CentOS mínimo com Apache, PHP e SELinux em uma configuração padrão:

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      29

Se eu quiser mudar o diretório-raiz do Apache, devo re-rotular este novo diretório, caso contrário o SELinux bloqueará o acesso. Mas eu descobri, com scripts PHP, que é possível fazer muito mais do que eu esperava. Por exemplo, posso fazer as seguintes ações sem alertas:

  • leia /etc/passwd ,
  • lista /var/tmp ,
  • exibe a versão do kernel,
  • estabelecer conexão com hosts externos

No entanto, recebo alertas AVC quando tento ler os atributos de /etc/shadow ou quando tento acessar o diretório pessoal.

Primeiro de tudo, é normal? E como posso ajustar o SELinux para restringir mais ações do PHP?

Eu uso o CentOS 7 e minha versão de política do selinux é 3.13.1-23.el7_1.7. (Eu também tentei o mesmo com o Fedora e obtive os mesmos resultados)

    
por jbrsn 12.06.2015 / 12:34

3 respostas

1

Todo mundo precisa ler /etc/passwd e gravar em /var/tmp . Então, esses não são um problema.

A versão do kernel também não é um problema, desde que você esteja realmente instalando atualizações, usando o Ksplice, etc.

Quanto a conexões de rede de saída, você pode restringir isso, pois alguns sites não precisam fazer essas conexões. Mas às vezes, por exemplo, a maioria dos sites precisa se conectar a um banco de dados. Você pode gerenciar isso com o booleano do SELinux, como:

# semanage boolean -l | grep httpd_can_network
httpd_can_network_relay        (off  ,  off)  Allow httpd to can network relay
httpd_can_network_connect_db   (off  ,  off)  Allow httpd to can network connect db
httpd_can_network_connect      (off  ,  off)  Allow httpd to can network connect
httpd_can_network_memcache     (off  ,  off)  Allow httpd to can network memcache
httpd_can_network_connect_cobbler (off  ,  off)  Allow httpd to can network connect cobbler

A configuração de httpd_can_network_connect permite todas as conexões de rede de saída para qualquer lugar; os outros são mais restritivos e só permitem conectar-se a cada serviço específico.

Lembre-se também que se você estiver usando nginx e php-fpm, esse php não é restrito pelo SELinux até o CentOS 6.6 e 7.

    
por 13.06.2015 / 20:13
0

Você precisa de comandos do sistema de blocos no php? Verifique a diretiva php

disable_functions =

Isso?

    
por 13.06.2015 / 11:35
0

Do meu ponto de vista, /etc/passwd precisa ser legível em todos os usuários do sistema.

Seu script php é executado com o usuário apache, por isso é normal que o script possa ler /etc/passwd

No virtualhost do apache eu uso "php_admin_value open_basedir /var/www/example.com" você pode fazer a mesma coisa para upload_tmp_dir e session.save_path

    
por 13.06.2015 / 12:02