| Registrarse | Members | Calendar | Buscar |
Asegurar PHP Configuración segura de PHP y PHP 5 |
![]() |
| Herramientas | Buscar en Tema | Desplegado |
| ||||
|
PHP se ha convertido en un lenguaje de scripting esencial para gran parte de sitios Web, y si tenemos planeado utilizarlo, es fundamental realizar una configuración pormenorizada del mismo, a continuación se detalla la funcionalidad de cada una de las directivas del fichero de configuración. DESACTIVANDO OPCIONES NO RECOMENDABLES
DESACTIVANDO FUNCIONES Y CLASES Mediante el uso de las directivas disable_functions y disable_classes es posible deshabilitar funciones y clases. Uno de los ejemplos más claros es el de la función openlog(). Esta función junto con syslog() permite a los scripts en PHP enviar mensajes al syslog. Desafortunadamente, es posible modificar el nombre con el cual el proceso queda registrado en el syslog. Por lo tanto si se modifica este nombre, en grandes sistemas se complicaría la identificación de los datos almacenados en syslog con ese nombre. Para evitar estas situaciones configuraremos disable_functions = openlog Existen otras funciones de integración de PHP/Apache que son potencialmente peligrosas. Y son las siguientes: apache_child_terminate apache_get_modules apache_get_version apache_getenv apache_note apache_setenv virtual Si ninguno de los scripts de las aplicaciones que se ejecutan en PHP necesitan estas funciones es recomendable deshabilitarlas. NOTA: En drupal versión 4.5.4-1 para debian con los módulos del core de la aplicación no hay problemas deshabilitando estas funciones. En Phpbb tampoco hay problemas con las versiones 2.0.13-6 también para debian. RESTRICCIONES DE ACCESO AL SISTEMA DE FICHEROS La directiva más útil en relación con la seguridad en PHP es open_basedir. Esta directiva indica a PHP a que ficheros puede acceder y a cuales no. El valor de esta directiva es una lista de prefijos de ficheros separados por una coma en Unix y por punto y coma en Windows. Las restricciones configuradas aquí, afectan a los scripts de PHP y a los ficheros de datos. Se recomienda que se active esta opción incluso en aquellos servidores con un único sitio web, y debe de apuntar un nivel por encima del directorio raíz del servidor web, la configuración sería open_basedir = /var/www/ Es importante recordar la diferencia entre establecer las restricciones a un prefijo frente a establecer las restricciones a un directorio, por ejemplo: open_basedir=/var/www permitiría acceso tanto a ficheros de /var/www como de /var/www2 ... sin embargo si usamos ... open_basedir=/var/www/ permitiría acceso a los ficheros que estén únicamente en /var/www/. NOTA: Independientemente de esta consideración no es posible controlar todos los módulos de php que desarrollan terceros, FraMe publicó en Bugtraq PHP4 cURL functions bypass open_basedir como es posible eludir las restricciones de open_basedir mediante la extensión cURL PHP. ACTIVANDO OPCIONES DE REGISTRO Por defecto no se registran todos los eventos en PHP. Hay mensajes importantes etiquetados con nivel E_NOTICE y que se pasan por alto. Es importante activar el registro de todos los eventos con: error_reporting = E_ALL log_errors = On Para ver cualquier error, es necesario activar el registro de errores. Para ello usaremos la opción de configuración error_log. Por defecto los errores irán a la salida estándar de error, en este caso, el log de error de Apache. Sin embargo podemos cambiar el destino de los mensajes de error especificando por ejemplo syslog en este caso syslog registraría los eventos. O < logphp > en cuyo caso los mensajes se almacenarían en ese fichero de nombre logphp. Si utilizamos un fichero distinto del de Apache para registrar los errores, estableceremos los permisos de acceso adecuados. A diferencia de los logs de Apache que se abren al comienzo cuando Apache aún esta corriendo como root, los logs de PHP se crean y escriben después, cuando el proceso ya esta ejecutándose con los permisos del usuario que inicia el servicio web. Por lo tanto los ficheros de log no se pueden guardar en el mismo sitio. Así que nos crearemos una carpeta y daremos permisos de acceso al usuario del servidor web (www-data en debian): #mkdir /var/www/logs/php #chown www-data /var/www/logs/php En el fichero de configuración php.ini configuramos error_log=/var/www/logs/php/php_error_log En los servidores en producción se deberá desactivar la opción de mostrar errores de inicialización de PHP como errores de ejecución. Para ello: display_errors = Off display_startup_errors = Off ESTABLECIENDO LIMITES DE MEMORIA
CONTROL DE SUBIDA DE FICHEROS Las consideraciones relativas al control de "upload" de ficheros se establecen en el parámetro de php.ini, identificado por file_uploads que pondremos file_uploads = Off o a On si queremos permitir subir ficheros mediante las aplicaciones en php. Los parámetros relacionados con esta opción son upload_max_filesize = 2M donde se indica el tamaño máximo de ficheros que se pueden subir a la vez, y que por defecto es de 2 MB. Se pueden subir varios ficheros simultáneamente, y el tamaño total es el que se indique en este parámetro. NOTA: Es necesario establecer en la configuración un valor levemente superior de post_max_size al de max_filesize. Los ficheros se suben al servidor web antes de ser procesados por un script, y por defecto se almacenan en /tmp . Si se quiere cambiar esta configuración se especificará la ruta con la variable upload_tmp_dir = /var/www/tmp . Esta ruta se habilitará con los comandos: #mkdir /var/www/tmp #chown www-data /var/www/tmp CONTROL DE SESIONES HTTP es un protocolo sin control de estados. Lo que quiere decir que el servidor trata cada petición de usuario de forma independiente y sin tener en cuenta que ha sucedido antes. No solo no lo toma en cuenta si no que ni siquiera lo "recuerda". A la hora de realizar desarrollos que utilizan las sesiones para agrupar peticiones, puede ser un inconveniente que no exista un control de estados. Las sesiones funcionan asignando una porción de información a cada usuario cuando conecta al sitio Web por primera vez. Esta porción de información se denomina identificador de sesión sessionid. El mecanismo mediante el cual se asigna el sessionid esta ideado para que el navegador del usuario devuelva información al servidor en cada petición. El servidor Web utiliza la información del sessionid para identificar datos del usuario y peticiones anteriores. Desde que el identificador de sesión se utiliza para identificar a un usuario anterior, se podría decir que actúa como un identificador único de usuario temporal. Con esto surge la problemática de los ataques de secuestro de sesiones, donde conociendo el sessionid se podría suplantar la identidad del usuario autenticado, es decir, se podría conectar a la aplicación con los privilegios del usuario autenticado. El soporte de sesiones en PHP permite a las aplicaciones recordar a un usuario, manteniendo cierta información entre peticiones. Por defecto, esta información se almacena en la ruta /tmp. La información de las sesiones tiene el siguiente formato: sess_ed6128354913y91y3249183y42 Analizando este código se puede identificar que PHP utiliza identificadores de sesión cuando construye los nombres de los ficheros para los datos de las sesiones (el identificador de sesión después de sess_). Como consecuencia, cualquier usuario del sistema con acceso a la carpeta /tmp podría utilizar los identificadores de sesión y secuestrar la sesión de los usuarios activos. Para evitarlo, especificaremos a PHP como almacenar los datos de las sesiones en un directorio separado, con acceso únicamente para el usuario de Apache (www-data). Para ello: # mkdir /var/www/sessions # chown www-data /var/www/sessions Indicamos esta ruta en el fichero php.ini mediante session.save_path = /var/www/sessions Este cambio de configuración no soluciona todos los problemas. Los usuarios del sistema no podrán utilizar los identificadores de sesión si los permisos de la carpeta de sesiones /var/www/sessions están configurados para no permitirlo. Aún así, para cualquier usuario que pueda escribir y ejecutar scripts en PHP en el sistema, será muy sencillo escribir un programa que obtenga la lista de identificadores de sesión ya que el script se ejecutará con los privilegios del usuario que ejecuta el servicio Web. NOTA:Un directorio de sesiones nunca ha de ser compartido por varias aplicaciones, grupos de usuarios, o sitios Web. Las fugas de identificadores de sesión y los intentos de secuestro pueden evitarse con la ayuda de la opción session.referer_check. Activando esta opción PHP analizará el contenido de la cabecera Referer en busca de la cadena que le indiquemos. Se debería establecer este valor a una cadena que contenga parte del nombre de dominio del sitio Web. En nuestro caso podríamos indicar session.referer_check = hacktimes.com Como la cabecera Referer contiene la URL de la página anterior que ha visitado el usuario, contendrá el nombre del dominio del sitio Web en todas las peticiones. Sin embargo, si alguien sigue un link desde otro sitio y llega a el site con un identificador valido de sesión sessionid, PHP rechazará la petición. Esta protección no ha de tomarse muy en serio . Esta opción se diseño para invalidar sesiones que hubieran sido comprometidas por usuarios de forma accidental al publicar enlaces que contienen identificadores de sesión. Sin embargo, protegerán de ataques sencillos de cross-site request forgery (CSRF), estos ataques consisten en la creación de un sitio web que pide al navegador del usuario los identificadores de sesión de otro site. Cuando se puede controlar completamente la petición, también se puede controlar el contenido de la cabecera Referer, haciendo que esta verificación sea ineficaz. Con esta opción activa, incluso aquellos usuarios con navegadores con soporte para cookies (y que estén usando las cookies para la gestión de la sesión) tendrán sesiones no validas si siguen un enlace desde cualquier sitio a nuestro site. Por lo tanto, aunque session.referer_check no soluciona completamente ningún problema, es recomendable activarlo aunque habrá que establecer medidas efectivas que eviten el secuestro de sesión en el desarrollo de las aplicaciones en PHP. ACTIVANDO LAS OPCIONES DE MODO SEGURO (SAFE_MODE)
Existen proyectos desarrollados exclusivamente para establecer más mecanismos de control en relación con la seguridad en php, por ejemplo hardened-php.net es un parche para PHP que habilita nuevas opciones de configuración desde php.ini, estas características afectan a elementos como:
__________________ ![]() ![]() Un comentario no cuesta nada, Agradece los posts para que den ganas de seguir posteando! Super Truco Revistas Gratis, no gastes más comprando |
| Este usuario agradecio a Snake por este post: | ||
| Recomendamos |
![]() |
| Etiquetas |
| asegurar, configuracion, php, segura |
| Herramientas | Buscar en Tema |
| Desplegado | |
| |
Temas Similares | ||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Xuxa quiere una Internet segura para los niños | Snake | General | 2 | 16-ago-2008 03:05 |
| Pregunta abierta: La barra de megaupload es segura? | El Experto | Problemas con tu PC | 0 | 23-jun-2008 11:20 |
| Pregunta abierta: lista segura? | El Experto | Problemas con tu PC | 0 | 08-jun-2008 07:50 |
| Pregunta abierta: yo estoy segura q no esta con ninguna chica, muy segura si quiere e | El Experto | Sexualidad | 0 | 28-may-2008 14:30 |
| Buffet retira su oferta de asegurar 527.000 millones a las 'monolines' | Snake | General | 0 | 03-mar-2008 22:11 |
| Registrarse | Ayuda | Miembros | Calendario | Buscar | Temas de Hoy | Marcar Foros Como Leídos |