(13) Отказано в доступе при попытке Apache CGI
Я недавно обновил свой сервер Apache2 и теперь не могу запустить приложение CGI. Мои журналы показывают
(13) Отказано в доступе, невозможно подключиться к cgi deamon после нескольких попыток
Я понимаю, что сообщение об ошибке означает, что Apache отказано в разрешении на какой-либо файл, и я озадачен тем, как отследить и решить проблему.
Является ли файл, указанный в сообщении об ошибке, действительно заблокированным файлом? Или проблема может быть вызвана каким-то другим необходимым файлом? Файл.cgi находится там, где он всегда был, в каталоге /usr/share. Владение файлом (корень) и разрешения (доступный для чтения / исполняемый файл) такие же, как и всегда для файла и его предков. Метки файлов SELinux остаются без изменений.
В журнале аудита SELinux нет никаких отказов, связанных ни с Apache, ни с программой CGI. В случае состояния донотаудита я включил аудит, но все равно ничего не увидел. Я ненадолго переключил SELinux в разрешительный режим, но безрезультатно. Я даже попытался перезапустить Apache в разрешающем режиме. Это не решило проблему.
Любые предложения о том, как решить эту проблему? Я испытываю желание просто вернуться к старому Apache.
8 ответов
Может или не может работать, кажется маловероятным, но у кого-то была похожая проблема, и это было решением;
chmod 755 /var/log/httpd/
или любой другой каталог журналов apache на вашем сервере.
Подтвердите , что у вас есть настройки ниже 00-mpm.conf
/etc/httpd/conf.modules.d/00-mpm.conf
и закомментируйте mod_mpm_prefork.so, затем прокомментируйте модуль mod_mpm_worker.so
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
#LoadModule mpm_event_module modules/mod_mpm_event.so
Хотя это более старый вопрос, я подумал, что добавлю свой ответ, поскольку мне не удалось найти правильное объяснение или решение в Интернете.
У меня эта проблема возникала на RHEL 7 с Apache 2.4 (установленным как пакет httpd24) только при использовании события MPM (prefork MPM работал нормально). SELinux уже был настроен на разрешение.
Основываясь на комментарии о сокетах CGI, я проверил документацию:
По сути, демон CGI при использовании mpm-события требует файл сокета. Поскольку Apache работает под именем пользователя apache и группы apache на моем сервере (и, несомненно, во многих других), папка, содержащая этот файл сокета, должна иметь доступ для чтения и записи через apache.apache.
Не желая переопределять права доступа к папке журнала, я решил явно установить ScriptSock
директива в conf.modules.d/00-mpm.conf
:
ScriptSock /var/run/httpd/cgid.sock
Затем я убедился, что httpd
каталог существует (примечание: вам нужно настроить это через tmpfiles.d
, как /var/run
является tmpfs) и сменил владельца на apache.apache. Разрешения остались по умолчанию 755.
Это решило проблему для меня.
Много чего перепробовал:
- установка ScriptSock в apache conf
- установка разрешений для файла /var/run/httpd/sock
- установка разрешений для папки журнала apache
- установка разрешений для perl-скрипта, который я хочу выполнить
- Я нашел файл mod_cgid.c и точную функцию, в которой вызывается ошибка.. мне это не помогло
для меня это работает, когда я устанавливаю DefaultRuntimeDir в apache conf
При выполнении сценария cgi, если включен selinux, контекст selinux должен быть установлен в каталогах и файлах сценариев примерно так:
system_u:object_r:httpd_sys_script_exec_t:s0
вы можете прочитать контекст файлов с помощьюls -laZ
и измените их с помощьюchcon
команда.
Для справки, например, в дистрибутивах rhel, мы можем просмотреть контекст сценария cgi по умолчанию с помощью следующей команды:
$ls -aZ /var/www/cgi-bin
system_u:object_r:httpd_sys_script_exec_t:s0 . system_u:object_r:httpd_sys_content_t:s0 ..
У меня было изменение поведения модуля при обновлении apache. Вполне возможно, что ваши директивы apache conf могут потребовать некоторых изменений для правильного обслуживания вашего cgi. Не зная apache conf и подробностей cgi и его расположения в файловой системе, действительно сложно сделать больше, чем просто спекулировать.
Также, если вы подозреваете SELinux, попробуйте отключить его, чтобы посмотреть, не начнет ли Apache снова обслуживать CGI. Если это произойдет, вы можете начать концентрировать свои усилия либо на корректировке политики, чтобы разрешить то, что вы пытаетесь сделать, либо на приведении своей системы в соответствие с политикой SELinux.
Ошибка не относится к какому-либо конкретному файлу или каталогу. Это шаблон ошибки, который не содержит никаких подсказок относительно того, какое разрешение является основной причиной.
... [cgid: error]... (13) Отказано в доступе: ... AH01257: невозможно подключиться к демону cgi после нескольких попыток: ... referer: ...
Если указанный выше шаблон присутствует в записях журнала httpd, но журналы аудита selinux чистые, проблема заключается в НЕКОТОРЫХ правах доступа, связанных с демоном CGI, а не в файлах, перечисленных в сообщении об ошибке. Демон CGI должен уметь находить и записывать несколько вещей.
- Сокет mod_cgid использует, чтобы избежать разветвления детей для запуска CGI-скриптов.
- Файл журнала mod_cgid использует
- Возможно, другие файлы
В большинстве пакетов mpm_event_module теперь часто указывается во время компиляции httpd, что приводит к тому, что httpd по умолчанию использует mod_cgid вместо mod_cgi.
Любое из предложений в других ответах может работать, а может и нет. Например, другой случай произошел, когда мы создали группу "сайты", чтобы определенные пользователи могли получать доступ к контенту сайта, не ослабляя другие разрешения. В каталоге /var/run в качестве группы был "apache", что создавало отказ в разрешениях при попытке создать сокет.
В AIX 7 была такая же проблема. установите права на каталог /var/log/httpd для исправления.