Как использовать PHP скрипт для контроля доступа в Apache - PullRequest
12 голосов
/ 19 августа 2011

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

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

  1. Используйте модуль apache, такой как mod_auth_script (хорошо, но этот модуль старый, и я предполагаю, что он плохо масштабируется)
  2. Использовать директиву FastCGI FastCgiAccessChecker
  3. Создайте свой собственный модуль 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 с использованием FastCgiAccessChecker.

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

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

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

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

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

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

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

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

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

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

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

Ответы [ 4 ]

8 голосов
/ 25 августа 2011

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

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

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

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

2 голосов
/ 27 августа 2011

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

Так получилось, что я остановился на своем варианте # 3, прежде чем прочитал любой из ответов:

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

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

0 голосов
/ 25 августа 2011

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

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

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

0 голосов
/ 21 августа 2011

Возможно, вы захотите посмотреть shell_exec () и system () .Это позволит вам запускать командные оболочки linux, если вы включили их в cfg.Также для FastCGI я рекомендую установить php5-fpm.Довольно просто сделать # apt-get install php5-fpm

...