2011-08-19 19 views
10

Estoy buscando una forma de utilizar un script PHP para controlar el acceso a los recursos en Apache. Quiero tener control de acceso que no dependa del recurso objetivo; es decir, funcionará para html, archivos, otras secuencias de comandos y programas cgi, al igual que las directivas "Permitir desde" o "Denegar desde", excepto mediante el uso de una lógica personalizada.Cómo utilizar el script PHP para el control de acceso en Apache

He mirado en varias maneras de tratar de manejar esto:

  1. utilizar un módulo de Apache como mod_auth_script (bien, pero este módulo es viejo y supongo que no escala bien)
  2. Directiva
  3. Uso FastCGI FastCgiAccessChecker
  4. Creo mi propio módulo apache php para invocar y hacer lo que necesito

de éstos # 2 parecía más prometedor, y también más portátil dada la popularidad de FastCG YO. Por lo tanto, logré cambiar el módulo linux php habitual y obtener php trabajando a través de fastcgi en su lugar. Fue más difícil que en Windows, pero tengo que trabajar con el tiempo como un servidor externo, es decir, utilizando directiva de Apache

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

y comenzando php daemon

php-cgi -q -b 192.168.0.11:9000 &

El problema llegó al tratar de encontrar una forma de invocar un script PHP usando FastCgiAccessChecker.

He intentado varias formas de intentar pasar el nombre del script que quiero ejecutar cambiando el nombre del archivo en las directivas FastCGIExternalServer y/o FastCgiAccessChecker - no funciona. También he intentado iniciar php-cgi con un especificador de la escritura, es decir

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

Nada funciona. Puedo decir que apache reconoce mis directivas, más o menos, porque cuando incluyo FastCgiAccessChecker, visito una página php, el tipo de contenido cambia a text/plain y pierdo los primeros ~ 8000 bytes de contenido de la página servida si es un script (no idea por qué) Pero no llama al script PHP que quiero ejecutar.

Por lo que puedo entender, lo que sucede es que FastCgiAccessChecker asume que el servidor fastcgi especificado se compila específicamente para actuar como un comprobador de acceso. No hay forma de decirle al servidor fastcgi (PHP en mi caso) qué script ejecutar para hacer la verificación de acceso.

He buscado en la web y, por lo que puedo decir, nadie ha intentado antes utilizar un script PHP, o nadie ha escrito al respecto.

Entonces mi pregunta: ¿qué debería estar haciendo? puedo ver algunas posibilidades:

1) Estoy perdiendo algo, y no hay alguna manera mágica para hacer FastCgiAccessChecker hacer lo que quiero: ejecutar un script PHP para controlar el control de acceso de Apache

2) escribo mi propio servidor FastCGI en c e incrustado PHP, así que puedo especificar el script PHP que quiero ejecutar (pasé unos minutos analizando esto; parece complicado y aterrador, y no he trabajado en c desde 1995)

3) Renuncio a FastCGI y escribo un módulo apache para llamar mi script PHP directamente para controlar el acceso. (También se ve complicado, y esta técnica requeriría un nuevo proceso generado por cada solicitud para ejecutar PHP.)

¿Alguien tiene algún consejo, ya sea sobre cómo hacer FastCGI para hacer lo que quiero, o un (razonablemente) alternativa simple a FastCGI?

Gracias por todo lo que puede sugerir

Respuesta

8

Mi acercamiento a este tipo de situaciones es usar mod_xsendfile en combinación con mod_rewrite. Puede que no parezca hacer lo que quiere primero, pero si usted:

  1. Use las reglas mod_rewrite para crear un controlador frontal (un solo script PHP que maneje todas las solicitudes entrantes).
  2. determinar qué archivo está siendo solicitada por mirar el contenido de $ _SERVER (probablemente $ _SERVER [ 'PATH_INFO']).
  3. Inserta aquí tu capa de control de acceso/seguridad.
  4. Utilice mod_xsendfile para enviar el contenido del archivo, si se pasa la seguridad.

En esencia, puede implementar cualquier sistema de seguridad que desee de esta manera.

mod_xsendfile esencialmente sólo envía un archivo de la misma manera exacta que sería Apache, había sido visitada directamente el archivo. Es estable y funciona muy bien en cada situación que le lancé. También debería "funcionar" sin una gran carga de configuración, con la que parece estar luchando un poco.

+0

¡Me gusta esa solución! – Achronos

0

Es probable que desee ver en shell_exec() y system(). Esto le permitirá ejecutar los cmd de linux shell siempre que lo tenga habilitado en su cfg. Además, para FastCGI, le recomiendo que instale php5-fpm. Bastante fácil de hacer # apt-get install php5-FPM

+0

Hola Timothy, gracias por tu respuesta. Lo que necesito es una forma de decirle a Apache que use un script PHP para decidir si permite el acceso a una página. FastCGI en realidad está funcionando bien para mí, es solo que no hay forma de que pueda ver que la directiva 'FastCGIAccessChecker' funcione para PHP. – Achronos

0

Actualmente estoy trabajando en un problema similar - en mi situación que necesitaba para establecer el (autenticado) usuario remoto en PHP. En pocas palabras, inserta la cookie de sesión y el nombre de usuario autenticado en Memcache (eche un vistazo a la versión de sofá para un sistema muy escalable) desde su script PHP, luego el mod configura al usuario en Apache y puede aplicar la información usando el acceso estándar de Apache reglas de control

Esto evita la sobrecarga de iniciar procesos adicionales/envolver todo el acceso en código PHP.

Ver preguntas y respuestas a Populating remote user in apache log files from PHP session

1

Gracias por las respuestas! Me gusta bastante la técnica de ezzatron, que debería funcionar con cualquier Apache sin necesidad de herramientas personalizadas.

Da la casualidad que acabé yendo con mi opción # 3 antes de leer cualquiera de las respuestas:

me escribió un módulo de Apache para hacer el trabajo. Amplía el control de acceso a cualquier documento que apache pueda servir, utilizando una subpetición, por lo que funciona para cualquier lenguaje de script o programa CGI. Para una configuración típica de PHP que usa php_module o fastcgi, esto se escala bastante bien porque no se necesita ningún proceso adicional.

Resulta que el módulo API de Apache no es demasiado difícil de usar, y supongo que C es como andar en bicicleta: nunca se te olvida cómo.

Cuestiones relacionadas