SELinux: como habilitar o acesso de gravação ao diretório de cache do Joomla?

3

Eu configurei o SELinux em um sistema de squeeze Debian, que roda um site Joomla. O código PHP do Joomla quer ter acesso de gravação a determinados diretórios de cache.

O arquivo / var / log / messages contém entradas como estas:

Dec 31 10:26:16 s0022 kernel: [ 2116.423199] type=1400 audit(1356945976.634:14831): 
  avc:  denied  { write } for  pid=1886 comm="apache2" name="_system" dev=xvda3 
  ino=790893 scontext=system_u:system_r:httpd_t:s0
  tcontext=unconfined_u:object_r:httpd_t:s0 tclass=dir
Dec 31 10:26:16 s0022 kernel: [ 2116.447613] type=1400 audit(1356945976.658:14837): 
  avc:  denied  { write } for  pid=1886 comm="apache2" name="mod_mainmenu" dev=xvda3
  ino=791346 scontext=system_u:system_r:httpd_t:s0
  tcontext=unconfined_u:object_r:httpd_t:s0 tclass=dir

Os diretórios correspondentes aos valores de inode são graváveis pelo apache2 (executando como wwwrun). Os arquivos de cache são criados quando o SELinux é desligado, mas não quando é ativado. O caminho para esses diretórios é diferente do DocumentRoot padrão do Debian Squeeze.

# ls -ldZ cache cache/_system cache/mod_mainmenu
drwxrwxr-x. 5 wwwrun www unconfined_u:object_r:httpd_t:s0 4096 Dec 29 23:13 cache
drwxrwxr-x. 2 wwwrun www unconfined_u:object_r:httpd_t:s0 4096 Dec 30 19:31 cache/mod_mainmenu
drwxrwxr-x. 2 wwwrun www unconfined_u:object_r:httpd_t:s0 4096 Dec 30 19:31 cache/_system

Eu também tentei ativar sinalizadores booleanos relacionados à gravação, mas isso não ajudou:

# getsebool -a | grep httpd
allow_httpd_anon_write --> on
allow_httpd_mod_auth_pam --> off
allow_httpd_sys_script_anon_write --> on
allow_httpd_user_script_anon_write --> on
httpd_builtin_scripting --> off
httpd_can_network_connect --> off
httpd_can_network_connect_db --> on
httpd_can_network_relay --> off
httpd_can_sendmail --> off
httpd_dbus_avahi --> off
httpd_enable_cgi --> off
httpd_enable_ftp_server --> off
httpd_enable_homedirs --> on
httpd_ssi_exec --> off
httpd_tty_comm --> off
httpd_unified --> off
httpd_use_cifs --> off
httpd_use_gpg --> off
httpd_use_nfs --> off

Eu usei o audit2allow para criar módulos carregáveis para ativar o acesso de gravação para outros daemons (por exemplo, para rotatelog), mas não acho que esse seja o caminho a seguir nessa situação. Um módulo para o httpd já existe e não quero tocá-lo de qualquer forma se puder evitá-lo.

Estou simplesmente procurando uma maneira de deixar o apache2 / php / Joomla escrever em diretórios específicos dentro do meu DocumentRoot específico, sem conceder acesso de gravação a qualquer outra coisa. Por favor, informe.

    
por nn4l 31.12.2012 / 13:22

2 respostas

1

Os diretórios de cache são usados por todos os diferentes tipos de usuários, como você já mencionou, o usuário do apache, o usuário do php e talvez até um usuário separado do Joomla se você usar o mod_fcgid. Para diretórios como este, há o contexto do tipo public_content_rw_t . Isso faz com que seja gravável para todos os serviços envolvidos e (já que é "apenas" um diretório de cache com arquivos temporários) não deve impor muito risco de segurança. Então eu sugiro alterar os tipos para o público, usando o comando

chcon -R -t public_content_rw_t /path/to/wwwroot/cache
    
por 31.12.2012 / 13:36
4

Você precisa dizer ao SELinux que o local do cache é do tipo httpd_cache_t :

# semanage fcontext -a -t 'httpd_cache_t' '/path/to/wwwroot/cache(/.*)?'
# restorecon -Rvvv /path/to/wwwroot/cache
    
por 31.12.2012 / 19:26