SELinux: как включить доступ для записи в каталог кеша Joomla?
Я установил SELinux в системе сжатия Debian, которая работает на веб-сайте Joomla. PHP-код Joomla хочет иметь доступ на запись к определенным каталогам кеша.
Файл /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
Я использовал aud2allow для создания загружаемых модулей, чтобы разрешить доступ для записи для других демонов (например, для rotatelog), но я не думаю, что это способ пойти в этой ситуации. Модуль для httpd уже существует, и я не хочу касаться его каким-либо образом, если я могу избежать этого.
Я просто ищу способ позволить apache2 / php / Joomla писать в определенных каталогах внутри моего конкретного DocumentRoot, не предоставляя права на запись для чего-либо еще. Пожалуйста, порекомендуйте.
2 ответа
Каталоги кеша используются всеми пользователями, как вы уже упоминали, пользователем apache, пользователем php и, возможно, даже отдельным пользователем Joomla, если вы используете mod_fcgid. Для таких каталогов есть public_content_rw_t
Тип контекста. Это делает его доступным для записи для всех задействованных сервисов и (поскольку это "просто" каталог кэша с временными файлами) не должен создавать слишком большой угрозы безопасности. Поэтому я бы предложил изменить типы на общедоступные, используя команду
chcon -R -t public_content_rw_t /path/to/wwwroot/cache
Вы должны сказать SELinux, что расположение кеша является типом httpd_cache_t
:
# semanage fcontext -a -t 'httpd_cache_t' '/path/to/wwwroot/cache(/.*)?'
# restorecon -Rvvv /path/to/wwwroot/cache