2011-08-19 9 views
10

Szukam sposobu na użycie skryptu PHP do kontrolowania dostępu do zasobów w Apache. Chcę mieć kontrolę dostępu, która nie zależy od zasobu docelowego; Oznacza to, że będzie działać dla html, plików, innych skryptów i programów cgi, tak jak zrobiłaby to dyrektywa "Allow from" lub "Deny from" - z wyjątkiem użycia niestandardowej logiki.Jak używać skryptu PHP do kontroli dostępu w Apache

Mam spojrzał na kilka sposobów, aby spróbować zarządzać tym:

  1. pomocą modułu apache jak mod_auth_script (OK, ale moduł ten jest stary i zakładam nie działa dobrze skalować)
  2. dyrektywę
  3. Zastosowanie FastCGI FastCgiAccessChecker
  4. Utwórz własny moduł apache powołać php i robić, co muszę

Spośród nich 2 wyglądał najbardziej obiecujące, a także najbardziej przenośny biorąc pod uwagę popularność FastCG JA. Więc udało mi się zamienić zwykły moduł php na linuksa i zamiast tego otrzymałem php działający przez fastcgi. To było trudniejsze niż na Windows, ale dostałem go do pracy w końcu jako serwera zewnętrznego, czyli za pomocą dyrektywy Apache

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

i rozpoczęcie php demona

php-cgi -q -b 192.168.0.11:9000 &

Kłopot przyszedł próbując znaleźć sposób wywołania skryptu PHP za pomocą FastCgiAccessChecker.

Próbowałem różnych sposobów, aby spróbować podać nazwę skryptu, który chcę uruchomić, zmieniając nazwę pliku w dyrektywach FastCGIExternalServer i/lub FastCgiAccessChecker - nie działa. Próbowałem zostały również zaczynając php-cgi ze specyfikacją skryptu, tj

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

Nic nie działa. Mogę powiedzieć, że apache rozpoznaje moje dyrektywy, ponieważ kiedy dołączam FastCgiAccessChecker, to odwiedzam stronę php, zmiany typu zawartości na text/plain i tracę pierwsze ~ 8000 bajtów treści z wyświetlanej strony, jeśli jest to skrypt (nie pomysł dlaczego). Ale nie nazywa się skryptem PHP, który chcę uruchomić.

O ile wiem, co się dzieje, FastCgiAccessChecker zakłada, że ​​określony serwer fastcgi jest skompilowany specjalnie do działania jako kontroler dostępu. Nie ma sposobu, aby powiedzieć serwerowi fastcgi (w moim przypadku PHP), jaki skrypt uruchomić, aby sprawdzić dostęp.

Przeszukałem sieć i o ile wiem, nikt wcześniej nie próbował użyć skryptu PHP, lub nikt o tym nie napisał.

Moje pytanie: co powinienem zrobić? Widzę kilka możliwości:

1) Brakuje mi czegoś, a tam jest jakiś magiczny sposób, aby FastCgiAccessChecker robić co chcę: uruchomić skrypt PHP do kontroli apache Dostęp

2) piszę mój własny serwer FastCGI w języku c i osadzanie PHP, więc mogę określić skrypt PHP, który chcę uruchomić (spędziłem kilka minut patrząc na to, wygląda to na skomplikowane i przerażające, a ja nie pracowałem wc od 1995)

3) Poddaję się FastCGI i piszę moduł apache, aby wywołać mój skrypt PHP bezpośrednio, aby kontrolować dostęp. (Wygląda też na skomplikowaną, a ta technika wymagałaby utworzenia nowego procesu dla każdego żądania wykonania PHP).

Czy ktoś ma jakąkolwiek poradę, jak uzyskać FastCGI, aby zrobić to, co chcę, lub (rozsądnie) prosta alternatywa dla FastCGI?

Dzięki za nic można zaproponować

Odpowiedz

8

Moje podejście do tego typu sytuacji jest użycie mod_xsendfile w połączeniu z mod_rewrite. Może się wydawać, że nie robią tego, co chcesz, ale jeśli:

  1. Użyj reguł mod_rewrite do stworzenia kontrolera frontowego (pojedynczy skrypt PHP, który obsługuje wszystkie przychodzące żądania).
  2. Określ, który plik jest wymagany, patrząc na zawartość $ _SERVER (prawdopodobnie $ _SERVER ['PATH_INFO']).
  3. Tutaj wstaw swoją warstwę kontroli dostępu/bezpieczeństwa.
  4. Użyj mod_xsendfile, aby wysłać zawartość pliku, jeśli zabezpieczenie zostanie przekazane.

Można zasadniczo wdrożyć dowolny system zabezpieczeń w ten sposób.

mod_xsendfile zasadniczo wysyła plik w dokładnie taki sam sposób jak Apache, gdyby plik był dostępny bezpośrednio. Jest stabilny i działa świetnie w każdej sytuacji, w którą go rzuciłem. Powinno to również "po prostu działać" bez ogromnego obciążenia konfiguracji, z którym wydaje się, że trochę się zmagasz.

+0

Podoba mi się to rozwiązanie! – Achronos

0

Prawdopodobnie chciał zajrzeć do shell_exec() i system(). Umożliwią ci to wykonywanie poleceń cmds powłoki linuksa, o ile masz je włączone w twoim cfg. Ponadto w przypadku FastCGI zalecam zainstalowanie php5-fpm. Dość łatwe do zrobienia # apt-get install php5-fpm

+0

Witaj Timothy, dziękuję za odpowiedź. Potrzebuję sposobu, aby powiedzieć Apacheowi, aby użył skryptu PHP, aby zdecydować, czy zezwolić na dostęp do strony. FastCGI faktycznie działa dobrze dla mnie, po prostu nie ma sposobu, aby uzyskać dyrektywę 'FastCGIAccessChecker' do pracy dla PHP. – Achronos

0

Obecnie pracuję nad podobnym problemem - w mojej sytuacji potrzebowałem ustawić (uwierzytelnionego) zdalnego użytkownika w PHP. Mówiąc prościej, przesyłasz cookie sesji i uwierzytelnioną nazwę użytkownika do memcache (spójrz na wersję couchdb dla bardzo skalowalnego systemu) ze skryptu PHP, następnie mod ustawia użytkownika w Apache i może zastosować informacje przy użyciu standardowego dostępu Apache zasady kontroli.

Pozwala to uniknąć narzutu uruchamiania dodatkowych procesów/zawijania całego dostępu w kodzie PHP.

Patrz pytanie do Populating remote user in apache log files from PHP session

1

Dzięki za odpowiedzi! Bardzo podoba mi się technika ezzatrona, która powinna działać z każdym Apache bez żadnych niestandardowych narzędzi.

Jak to się dzieje, że skończyło się z moim # 3 opcji przed czytałem żadnej z odpowiedziami:

napisałem moduł Apache, aby wykonać zadanie. Zajmuje się kontrolą dostępu do dowolnego apache dokumentu może służyć, za pomocą podrzędnego żądania - tak działa dla każdego języka skryptowego lub programu CGI. Dla typowej konfiguracji PHP za pomocą php_module lub fastcgi, skaluje się to całkiem dobrze, ponieważ nie jest potrzebny żaden dodatkowy proces.

Okazuje się, że moduł API Apache'a nie jest zbyt trudny w użyciu, i myślę, że C jest jak jazda na rowerze - nigdy tak naprawdę nie zapomnisz.

Powiązane problemy