Назад | Перейти на главную страницу

SELinux: как включить доступ на запись в каталог кеша Joomla?

Я установил SELinux в системе сжатия Debian, на которой работает веб-сайт Joomla. Код Joomla PHP хочет иметь доступ для записи в определенные каталоги кеша.

Файл / var / log / messages содержит такие записи:

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

Каталоги, соответствующие значениям inode, доступны для записи apache2 (запущенным как wwwrun). Файлы кеша создаются при выключении SELinux, но не при его активации. Однако путь к этим каталогам отличается от DocumentRoot по умолчанию в 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

Я также попытался включить логические флаги, связанные с записью, но это тоже не помогло:

# 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

Я использовал audit2allow для создания загружаемых модулей, чтобы разрешить доступ на запись для других демонов (например, для rotatelog), но я не думаю, что это выход в данной ситуации. Модуль для httpd уже существует, и я не хочу никоим образом его трогать, если я могу этого избежать.

Я просто ищу способ разрешить apache2 / php / Joomla писать в определенные каталоги внутри моего конкретного DocumentRoot без предоставления доступа на запись для чего-либо еще. Пожалуйста, порекомендуйте.

Вам нужно сообщить SELinux, что расположение кеша - это тип httpd_cache_t:

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

Каталоги кеша используются разными типами пользователей, такими как вы уже упоминали, пользователем apache, пользователем php и, возможно, даже отдельным пользователем Joomla, если вы используете mod_fcgid. Для таких каталогов есть public_content_rw_t введите контекст. Это делает его доступным для записи для всех задействованных служб и (поскольку это «всего лишь» каталог кеша с временными файлами) не должен создавать слишком большого риска для безопасности. Поэтому я бы предложил изменить типы на общедоступный, используя команду

chcon -R -t public_content_rw_t /path/to/wwwroot/cache