FastCGI y PHP seguro en UserDir


Aquí voy a explicar cómo hacer funcionar con mejor rendimiento y seguridad PHP.

Primero que nada necesitas tener el código fuente del servidor web Apache el cual has instalado con anterioridad. O sea, un código fuente que sea del servidor web Apache que estés utilizando o que quieras utilizar.
Utilizo la versión 2.2.9 del servidor web Apache que puedes descargar desde aquí: http://httpd.apache.org/download.cgi

Después necesitarás mi parche para mod_actions.c que puedes descargar desde aquí: ftp://cieloaragua.sytes.net/src/proyectos/mod_actions.c.diff
Para instrucciones de cómo instalarlo visita el artículo anterior a este.

Luego necesitas instalar el mod_fastcgi que puedes descargar desde aquí: http://www.fastcgi.com
Utilizo la versión 2.4.6 de mod_fastcgi.

Luego PHP con soporte para fastcgi que se hace con el siguiente parámetro de configure: –enable-fastcgi
Utilizo la versión 5.2.6 de PHP.

Para empezar necesitas activar FastCGI poniendo lo siguiente en tu httpd.conf:

LoadModule fastcgi_module modules/mod_fastcgi.so
FastCgiWrapper bin/suexec
AddHandler fastcgi-script .fcgi .fcg .fpl .fpy

Lo anterior hace que fastcgi utilice suexec como wrapper para funcionar y se habilita para todos los scripts que terminan en .fcgi, .fcg, .fpl y .fpy.

Necesitas tener configurado correctamente el directorio cgi-bin de cada usuario. Para eso puedes añadir lo siguiente a tu httpd.conf:

<Directory “/home/*/html_public/cgi-bin”>
Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all
</Directory>

Con eso se permite ejecución de script dentro del directorio cgi-bin y se añade algo de seguridad. Como anteriormente habías puesto un manejador (AddHandler) que interpreta como un fastcgi-script a los archivos que terminan en .fcgi, .fcg, .fpl y .fpy entonces cualquier archivo que se ponga en ese directorio y termine de esa forma será interpretado como un script de FastCGI.

Ahora falta hacer que los documentos php sean interpretados por un script que va a estar dentro de cgi-bin, eso se logra añadiendo lo siguiente al httpd.conf:

AddType application/x-httpd-php .php
AddType application/x-httpd-php .phtml
AddType application/x-httpd-php .php3
AddType application/x-httpd-php .php4
AddType application/x-httpd-php .php5

AddHandler application/x-httpd-php .php .phtml .php3 .php4 .php5
DirectoryIndex index.php index.phtml

Action application/x-httpd-php ~*/cgi-bin/php.fcgi

Lo anterior permite que cada tipo de archivo (.php, .phtml, .php3, .php4 y .php5) sea interpretado como un tipo mime application/x-httpd-php el cual será manejado por el script php.fcgi que se encuentra en el directorio cgi-bin del usuario a quien le corresponde la página que se pidió en el navegador.

Esto trae dos ventajas:

  1. Ahora todo documento de PHP será interpretado a nombre del usuario que lo posee. O sea, que estamos haciendo casi lo mismo que al activar el safe_mode en PHP, pero con la ventaja de que es más seguro ya que está protegido directamente por suexec y los permisos Unix que hayamos asignado a cada usuario.
  2. Mejora el rendimiento ya que cada php.fcgi se estará ejecutando a través de fastcgi.

Que bueno, ¿no? Ahora cada documento PHP se maneja como si fuera un programa del mismo usuario que se está ejecutando y encima tiene mejor rendimiento.

Pero hay un pequeño problema, y es que se necesita el script php.fcgi en el cgi-bin de cada usuario.

Y el script contiene lo siguiente:
#!/bin/bash

/usr/bin/php-cgi

¿Pensaste que iba a ser más complicado? Pues no, con ese simple script basta y sobra ya que el mismo simplemente se ejecuta como un comando de shell (bash) y luego llama a php-cgi para que interprete la entrada (STDIN, el PHP del usuario) y así obtener una salida (STDOUT, el navegador web del visitante).

Saludos y espero que este artículo haya sido de tu utilidad. ¡Hasta otra!

  1. Deja un comentario

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: