Técnicas: Medidas de Seguridad en Joomla!
Consideraciones generales e ISPs
- Cambie sus passwords regularmente y no use siempre los mismos. Utilice una combinación aleatoria de letras, números, o símbolos y evite usar nombres o palabras que puedan ser encontradas en un diccionario. Nunca utilice los nombres de sus parientes, mascotas, etc.
- Si usted esta usando un servicio compartido de hosting en su proveedor, asegurese de que ningún otro usuario en el servidor pueda ver o accedes a los archivos de su sitio, por ejemplo a través de cuentas shell, cpanels, etc.
- Nunca dependa de los backups de otro. Hágase responsable personalmente de respaldar regularmente los archivos de su sitio y su base de datos. Muchos ISPs expresan en sus contratos que usted no puede confiar únicamente en los backups que hace el proveedor de hosting.
- Utilice un sistema de Prevención/Detección de intrusos para bloquear/alertar sobre solicitudes HTTP maliciosas.
Ejemplo de búsqueda en Google (Intrusión+Prevención)
Servidores de desarrollo
HTTP Server (Apache, etc.)
- PHP, MySQL y muchos otros componentes base fueron originalmente diseñados para, y generalmente funcionan mejor en, servidores Apache. Evite usar otros servidores si es posible.
- Utilice archivos .htaccess para bloquear intentos de exploits. Puede encontrar un muy buen y pequeño tutorial en
Post: Cómo proteger un sitio utilizando .htaccess y mod_rewrite
- Regularmente revise los registros de acceso en busca de actividad sospechosa. No confie en sumarios y graficas. Revise los "raw logs" (registros en crudo) para detalles mas reales.
- Configure los filtros de Apache mod_security y mod_rewrite para que bloqueen ataques PHP.
MySQL
- Asegurese de que la cuenta MySQL de Joomla! esta configurada con acceso limitado. Este consciente de que la instalación inicial de MySQL es insegura. Una cuidadosa configuración manual es requerida luego de la instalación.
Ver Documentación MySQL
- En un servidor compartido, si usted puede ver los nombres de las bases de datos de otros usuarios, entonces puede estar bastante seguro de que ellos ven las suyas. Si ellos pueden ver las bases de datos que usted posea, ellos están innecesariamente un paso más cerca de entrar. Un buen ISP limitara estrictamente el acceso de cada usuario a sus propias bases de datos.
PHP
- Antes que nada PHP 4 ya no es mantenido activamente, actualice su código PHP a PHP 5.
- Aplique todos los parches necesarios para PHP y para aplicaciones basadas en PHP.
- Se recomienda un frecuente escaneo wen en ámbitos donde un gran numero de aplicaciones PHP están en uso.
- Utilice herramientas como Paros Proxy para realizar pruebas automáticas de SQL Injection en contra de sus aplicaciones PHP.
- Siga el principio de "Least Privilege" (El menor privilegio) para correr PHP usando herramientas como PHPsuExec, php_suexec o suPHP desde suPHP.
php.ini
- Estudie la lista oficial de directivas php.ini en www.php.net.
Lista de directivas php.ini
- Configure register_globals OFF. Esta directiva determina si registrar o no las variables EGPCS (Environment, GET, POST, Cookie, Server) como variables globales.
Post: Seguridad con php.ini
- Use disable_functions para desactivar peligrosas funciones PHP que no son necesarias para su sitio.
- Desactive allow_url_fopen. Esta opción activa las URL-aware fopen wrappers que permite el acceso a los objetos URL como archivos. Los wrappers (envolturas) son proveidos para el acceso de archivos remotos usando el ftp o el protocolo http, algunas extensiones como zlib son capaces de registrar wrappers adicionales. Nota: Esto solo puede ser configurado en php.ini por motivos de seguridad.
- Ajuste la directiva magic_gpc_quotes como sea necesario para su sitio. Debería estar en off para usar software bien escrito, y para los pobremente escritos scripts PHP 3 y PHP 4 . magic_gpc_quotes configura el estado magic_quotes state para operaciones GPC (Get/Post/Cookie). Cuando magic_quotes esta on, todas las ' (single-quote/comillas-simples), " (double quote/comillas dobles), \ (backslash-barra invertida) y NUL's son evitadas con una barra invertida \ automáticamente.
- Modo Seguro: safe_mode (debería estar activado y configurado correctamente)
Post: Directivas de configuración Seguridad PHP y Modo Seguro
Post: Funciones PHP restringidas/desactivadas por Modo Seguro
- open_basedir (debería estar activado y configurado correctamente). Limite los archivos que pueden ser abiertos por PHP a el arbol de directorios especificado, incluyendo el archivo mismo. Esta directiva no es afectada si el Safe Mode esta On u Off. La restriccion especificada con open_basedir es en realidad un prefijo, no un nombre de directorio. Esto significa que "open_basedir = /dir/incl" también permite el acceso "/dir/include" y "/dir/incls" si es que existen. Cuando quiere restringir el acceso solamente al directorio especificado, cierre con una barra /.
Post: Directivas de configuración Seguridad PHP y Modo Seguro
Aquí hay directivas de ejemplo para las sugerencias anteriores:
register_globals = 0 disable_functions = show_source, system, shell_exec, passthru, exec, phpinfo, popen, proc_open
allow_url_fopen = 0 magic_gpc_quotes = 0 safe_mode = 1 open_basedir = /dir/incl/
Núcleo de Joomla! (Core)
- Siempre actualice a la ultima versión estable.
Validez de la Versión de Joomla!
- Descargue Joomla! solo de sitios oficiales, sitios de confianza, tales como:
Joomla! Forge
- Suscribase, o revise regularmente:
Anuncios Relacionados con la seguridad Joomla!
- Si usted descubre un problema de seguridad en el core de Joomla!, por favor repórtelo lo antes posible:
Reportar Errores de Joomla!
- Remueva todas las plantillas (templates) que no sean necesarias en su sitio.
Post: No ponga lógica de seguridad en archivos de plantillas (templates).
- Edite globals.php para correr register_globals emulation off en Joomla! . Aunque la emulación Joomla! es mucho mas segura que la directiva PHP register_globals, es mejor no permitir para nada register_globals. Comenzando con PHP 6, esta ni siquiera será una opción, y es cuestión de tiempo.
- Una vez que su sitio esta configurado y es estable, Proteja contra escritura la mayor cantidad de archivos y directorios que pueda cambiando los permisos de directorios a 755, y los permisos de archivos a 644. Existe una característica de sitio --> Global Configuration (configuración global) --> que puede colocar los permisos de forma masiva por usted. Tenga en cuenta de que esta función masiva puede afectar el funcionamiento de los componentes, si lo hace pruebe el funcionamiento de los mismos. También tenga en cuenta de que es posible que no se puedan cambiar los permisos en todos los componentes o extensiones de 3eros.
Script automático para ajustar los permisos de directorios y archivos
Ajustes del Archivo de Configuración Global
Nota: Necesitara resetear los permisos si es que desea instalar extensiones mas tarde. Sea conciente de que en algunos servidores, la opción de (Anular la protección contra escritura al guardar) puede que no funcione, aunque el aviso del sistema diga que si, por eso tendrá que cambiar las opciones de la configuración dándole permisos de escritura manualmente a su configuration.php. (Eso es algo bueno!)
Extensiones (Componentes, Módulos, y Bots) de Joomla!
- Remueva todas las extensiones Joomla! que requieran register_globals ON.
- Descargue extensiones solo de sitios de confianza. La definición oficial de "sitio de confianza" es aquel sitio en el que USTED confía.
- Antes de instalar extensiones de 3eros (third party extensions), revise:
Post: Lista oficial de extensiones de 3eros vulnerables!
- Tenga cuidado! Las extensiones de 3eros vienen en todos los sabores, tamaños y antigüedad. Aunque existen los estándares de código Joomla! (coding standards), la extensiones listadas en el sitio oficial de Joomla! no son revisadas para ver si cumplen dichos estándares. Prueba todas las extensiones en un sitio de desarrollo antes de instalarlas en un sitio "real" sitio en producción.
- Respalde su sitio y la base de datos del mismo antes de instalar nuevas extensiones.
- Revise regularmente:
Post: Cuestiones de seguridad de 3eros/No Joomla!
- Remueva cualquier extensión no usada, y revise doblemente que los directorios y archivos relacionados hayan sido borrados. (Una contribución de joomaboom)
Reforzando Joomla!
Nota: Esta sección es para aquellos que buscan la mayor seguridad posible, por ejemplo para sitios de comercio. Algunos de estos items requieren más que la paranoia promedio... habilidad, control del servidor y buena voluntad para experimentar y aprender.
- Requerido: Contrate a un consultor profesional de seguridad Joomla! para que revise la configuración de su sitio.
- Requerido: No utilice un servidor compartido. Algunos expertos difieren en este item. El punto es, no importa como este configurado su servidor, asegurese de que usted sea la única organización con acceso.
- Requerido: Utilice un servidor SSL para todos los logins y funciones administrativas, y por supuesto para transacciones confidenciales con los clientes. Asegurese de tener un muy buen abogado si es que no quiere usar SSL.
- Requerido: Separe los servidores de desarrollo y producción (pruebas y sitio real), y desactive las funciones administrativas en la parte pública del sitio. Utilizar subdominios es una buena forma de hacer esto.
- Recomendado: Mueva archivos básicos que no requieran acceso de escritura por sobre la raíz web (Web root) y modifique las variables de ruta (path variables) o utilice Symlinks. Por ejemplo los archivos de configuración o el directorio de administración.
- Recomendado: Para evitar el acceso URL directo a las extensiones, edite la configuración Apache, .htaccess, o mueva directorios de las extensiones por sobre la raiz web, y modifique las variables de ruta.
- Opcional: Asegurese de que todos los directorios escribibles (images, galleries, caches, etc.) están por sobre la raíz web y modifique las variables de ruta. Revise los directorios de las extensiones en busca de sus propios directorios de descarga o con permisos de escritura.
- Opcional: Mueva todo el sitio Joomla! por sobre la raiz web excepto por aquellos archivos que requieran acceso http directo, tales como "/index.php", y modifique las variables de ruta. Alguien ha tratado de hacer esto alguna vez?
- Opcional: Para un mejor control de espacios de nombre dentro de PHP, utilice código OO en sus extensiones.
- Opcional: Bloquee accesos cruzados a la base de datos. Suerte con esta! Por favor postee buenas soluciones aquí.
- Opcional: Cree bases de datos y cuentas MySQL separadas para extensiones confidenciales.
- Opcional: Para el acceso a la base de datos principal para extensiones no del todo confiables (inicialmente casi todas), utilice una cuenta de MySQL separada con pocos privilegios.
- Opcional: Si no quiere anunciarle a los script kiddies cuales URLs necesitan protección del acceso directo, puede tratar de redirigirlos a una pagina de error 404. Esto les indicara que esa URL no es valida, mas que anunciarles que existe pero que necesita protección. (No olvide crear la página de error.) friesengeist apunta a eso, si un cracker usa alguna otra herramienta mas que un navegador para acceder a su sitio, el script ignorara el header(), corriendo, y ejecutando el resto del código. Si realmente quiere la redirección, debe añadir exit; después de header(). En el ejemplo a continuación, se utilizan ambos métodos. Esto es un exceso, pero tampoco va a romper nada.
_________________
- Texto original: "Joomla Administrator's Security Checklist", por rliskey (Joomla! Forum Moderator).
- Traducido por: Equipo de Traducción y Documentación de Joomla! Spanish.