Как использовать PHP скрипт для управления доступом в Apache

Я ищу способ использования PHP script для управления доступом к ресурсам в Apache. Я хочу иметь контроль доступа, который не зависит от целевого ресурса; то есть он будет работать для html, файлов, других скриптов и cgi-программ, так же, как и директива "Разрешить" или "Отказать", кроме использования пользовательской логики.

Я рассмотрел несколько способов, чтобы попытаться справиться с этим:

  • Используйте модуль apache, например mod_auth_script (ok, но этот модуль старый, и я предполагаю, что он не масштабируется)
  • Используйте FastCGI-директиву FastCgiAccessChecker
  • Создайте мой собственный модуль apache для вызова php и сделайте все, что мне нужно

Из них №2 выглядели наиболее перспективными, а также самыми портативными, учитывая популярность FastCGI. Итак, мне удалось поменять обычный модуль php linux и получить php, работая через fastcgi. Это было сложнее, чем в Windows, но в конечном итоге оно работало как внешний сервер, то есть с помощью директивы Apache

FastCGIExternalServer /var/www/html/thing -host 192.168.0.11:9000

и запуск php-демона

php-cgi -q -b 192.168.0.11:9000 &

Проблема заключалась в попытке найти способ вызвать PHP script с помощью FastCgiAccessChecker.

Я пробовал различные способы попробовать передать имя script, которое я хочу запустить, изменив имя файла в FastCGIExternalServer и/или директивы FastCgiAccessChecker - не работает. Я также попытался запустить php-cgi с помощью спецификатора script, т.е.

php-cgi -q -b 192.168.0.11:9000 -f /var/www/html/thing/access.php &

Ничего не работает. Я могу сказать, что apache распознает мои директивы, вроде, потому что, когда я включаю FastCgiAccessChecker, перейдите на страницу php, изменения типа контента в text/plain и я потеряю первые ~ 8000 байт содержимого с страницы, если она script (не знаю, почему). Но он не вызывает PHP скрипт, который я хочу запустить.

Насколько я могу судить, происходит то, что FastCgiAccessChecker предполагает, что указанный сервер fastcgi скомпилирован специально для работы в качестве проверки доступа. Невозможно сказать сервер fastcgi (PHP в моем случае), что script для выполнения проверки доступа.

Я искал в Интернете, и насколько я могу судить, никто никогда не пытался использовать PHP script для этого раньше, или никто не написал об этом.

Итак, мой вопрос: что мне делать? Я вижу несколько возможностей:

1) Я что-то упустил, и есть волшебный способ сделать FastCgiAccessChecker делать то, что я хочу: запустить PHP script для управления доступом к apache

2) Я пишу собственный FastCGI-сервер в c и внедряю PHP, поэтому я могу указать PHP script, который я хочу запустить (я потратил несколько минут на это, это выглядит сложным и страшным, а я "Работал в c с 1995 года".

3) Я отказываюсь от FastCGI и пишу модуль apache для прямого вызова моего PHP script для контроля доступа. (Также выглядит сложным, и этот метод потребует создания нового процесса для каждого запроса для exec PHP.)

Есть ли у кого-нибудь совет, как заставить FastCGI делать то, что я хочу, или (разумно) простая альтернатива FastCGI?

Спасибо за все, что вы можете предложить

Ответ 1

Мой подход к этим типам ситуаций заключается в использовании mod_xsendfile в сочетании с mod_rewrite. Возможно, они не работают так, как вы хотите, но если вы:

  • Используйте правила mod_rewrite для создания фронтального контроллера (одного PHP script, который обрабатывает все входящие запросы).
  • Определите, какой файл запрашивается, просматривая содержимое $_SERVER (возможно, $_SERVER ['PATH_INFO']).
  • Вставьте свой уровень контроля доступа/безопасности здесь.
  • Используйте mod_xsendfile для отправки содержимого файла, если безопасность прошла.

Вы можете по существу реализовать любую систему безопасности, которую вы хотите таким образом.

mod_xsendfile по существу просто отправляет файл точно так же, как и Apache, если бы файл был доступен напрямую. Он стабилен и отлично работает во всех ситуациях, которые я бросил на него. Он также должен "просто работать" без огромного бремени установки, с которым вы, похоже, немного боретесь.

Ответ 2

Спасибо за ответы! Мне очень нравится эццатронная техника, которая должна работать с любым Apache без каких-либо специальных инструментов.

Как бы то ни было, я закончил свой вариант №3, прежде чем я прочитал любой из ответов:

Я написал модуль Apache для выполнения задания. Он управляет доступом к любому документу, который apache может обслуживать, используя подзапрос - поэтому он работает для любого языка script или программы CGI. Для типичной конфигурации PHP, использующей php_module или fastcgi, это очень хорошо, потому что не требуется никакого дополнительного процесса.

Оказывается, API API Apache не слишком сложно использовать, и я думаю, что C - это как кататься на велосипеде - вы никогда не забываете, как это сделать.

Ответ 3

Вероятно, вы захотите изучить shell_exec() и система(). Они позволят вам выполнить cmds linux shell, если вы включили его в своем cfg. Кроме того, для FastCGI я рекомендую установить php5-fpm. Довольно легко сделать # apt-get install php5-fpm

Ответ 4

В настоящее время я работаю над подобной проблемой - в моей ситуации мне нужно было установить (аутентифицированный) удаленный пользователь на PHP. Проще говоря, вы нажимаете cookie сеанса и аутентифицировали имя пользователя в memcache (смотрите версию couchdb для очень масштабируемой системы) с вашего PHP script, тогда мода устанавливает пользователя в Apache и может применять информацию, используя стандартную Правила доступа Apache к ним.

Это позволяет избежать накладных расходов на запуск дополнительных процессов/завершение всего доступа в PHP-коде.

См. вопрос и ответы на Заполнение удаленного пользователя в файлах журнала apache с сеанса PHP