Hace un tiempo demostré cómo proteger el panel de administración de Joomla! con reglas de reescritura Apache. En esta oportunidad voy a demostrar cómo ofuscar el acceso al mismo cuando se utiliza un servidor Web Nginx.

El Panel de Administración de Joomla! es el back-end del sitio donde los administradores, redactores, editores, etc. ingresan para realizar sus tareas. Similar al "/wp-admin" de Wordpress. Debido a esto es el primer componente por donde los atacantes intentan penetrar sitios Joomla!, probando contraseñas de usuarios por defecto mediante ataques de fuerza bruta o diccionario.

Más allá de que usemos contraseñas prácticamente irrompibles, el mayor problema de sufrir un ataque de fuerza bruta o diccionario, es que puede transformarse rápidamente en un ataque de denegación de servicio (DoS) provocado por un alto consumo de ancho de banda y/o CPU en el servidor víctima.

Lamentablemente Joomla!, al igual que muchas extensiones desarrolladas por terceros, depende fuertemente en la existencia del directorio /administrator. Por supuesto es posible proteger con contraseña este directorio, si el servicio de hosting lo permite. Pero existe una solución, aunque algo más complicada de implementar, mucho más amigable para los usuarios, ya que no requiere utilizar usuarios y contraseñas adicionales y funciona como si efectivamente pudiésemos renombrar el directorio /administrator.

La solución consiste en solicitar una cookie cada vez que se intenta acceder al directorio /administrator. Esta cookie será utilizada como clave secreta y será otorgada al cliente únicamente al acceder a un directorio específico, cuya ubicación debe ser secreta, por ejemplo /ultrasecreto (¡NO UTILIZAR ESTE NOMBRE PARA EL DIRECTORIO SECRETO!). Para finalizar el circuito, el acceso a este directorio secreto implementa una redirección automática a /administrator (además de entregar la cookie al cliente). Parece complicado pero funciona perfectamente y es una barrera de contención para restringir el acceso e impedir ataques al panel de administración. De esta forma, cada intento de acceso al recurso "/administrator" sin la cookie es rechazado automáticamente por Nginx sin siquiera ser procesado por PHP. Lo cual permite optimizar recursos en caso de ataques o intentos de ataque (mitigar DoS en cierta medida).

Para comenzar, cambiar a la raíz del sitio Web y crear el directorio "ultrasecreto" (¿mencioné que se debe utilizar un nombre secreto para este directorio?)

# cd /var/www/misitioweb/
# mkdir ultrasecreto
# nano ultrasecreto/index.php

Dentro del mismo se crea el archivo index.php con el siguiente contenido:

<?php
    $admin_cookie_code = "12345678";
    $segundos = 1;
    $minutos = 60 * $segundos;
    $horas = 60 * $minutos;
    $dias = 24 * $horas;
    $expire = time() + 7 * $dias; // duración de la sesión del administrador (segundos)
    setcookie("SesionAdministradorJoomla",$admin_cookie_code,$expire,"/");
    header("Cache-Control: no-cache");
    header("Location: ../administrator/index.php");

Cambiar la clave secreta ($admin_cookie_code = "12345678") por una aleatoria y de mayor longitud.

Luego cambiar el ownsership al usuario con el que corre Nginx/PHP-FPM:

# chown -R www-data:www-data ultrasecreto

Finalmente se debe configurar adecuadamente el acceso a "/administrator" en Nginx. Esto es extremadamente simple, sólo basta con retornar 403 (forbidden) si no está presente la cookie o su valor es incorrecto:


            # Proteger panel de control
            location ~ /administrator/ {
                if ($cookie_SesionAdministradorJoomla != "12345678") {
                    return 403;
                }

                location ~ \.php {
                    root /var/www/misitioweb;
                    fastcgi_pass php7-fpm-sock;
                    fastcgi_param SCRIPT_FILENAME $request_filename;
                    include fastcgi_params;
                }
            }

Como se observa, es necesario definir la sentencia if dentro de un bloque location, lo cual obliga a replicar la configuración de PHP-FPM para archivos de extensión .php dentro del directorio (de lo contrario no funcionará el panel de control.

Si alguien conoce una mejor forma de implementarlo, que no requiera replicar el bloque location ~ \.php { dentro de la configuración para el directorio, por favor agradecería que me lo haga saber.

Por último, reiniciar Nginx:

# service nginx reload

Al ingresar directamente al panel de administración "/administrator", Nginx retorna 403:

Si en cambio se ingresa a "/ultrasecreto", Nginx redirige a "/administrator", esta vez con la cookie establecida correctamente:

Referencias


Tal vez pueda interesarte


Compartí este artículo