¿Qué debemos configurar WAF?





Al desarrollar o mantener aplicaciones web, en algún momento debe lidiar con la necesidad de usar WAF (Web Application Firewall). Si no tienes experiencia con esta clase de solución o estás cansado de los constantes falsos positivos, te diré cómo simplificar la tarea, además de compartir algunos consejos y trucos. Como herramienta usaremos Nemesida WAF Free, una versión gratuita de Nemesida WAF.



Visualización, o comencemos por el final



Puede monitorear el trabajo de Nemesida WAF Free a través de un navegador, por lo que luego de una breve configuración del sistema, obtendremos acceso a la interfaz web, donde estará disponible información sobre ataques bloqueados, motivos de bloqueo, información sobre direcciones IP, etc. Además, aparecerán secciones con estadísticas resumidas en forma de gráficos, diagramas y datos sobre el tráfico del módulo VTS (si se utiliza).







Stand de demostración: demo.lk.nemesida-security.com (demo@pentestit.ru / pentestit) Procedamos







con la instalación.



Instalación de Nemesida WAF Free



A pesar de que la versión gratuita es una bifurcación de la versión completa, contiene un gran conjunto de capacidades para detectar, bloquear y visualizar ataques a aplicaciones web. Por aplicación web nos referimos a todo lo que se basa en el protocolo HTTP: sitios web, cuentas personales, tiendas en línea, sitios de formación, API y todo lo demás.



En el párrafo anterior, dividí específicamente la funcionalidad de bloqueo de ataques en detección y bloqueo, ya que existen 2 (incluso tres) modos de operación del producto: IDS, IPS y PseudoIDS (modo LM).



Modo IDS



El modo IDS le permite usar WAF en una copia de tráfico, detectando pero no bloqueando ataques. Este modo de funcionamiento es útil, por ejemplo, para la puesta en marcha inicial o para la monitorización pasiva, para evitar cualquier bloqueo de solicitudes o un aumento, por pequeño que sea, del tiempo de respuesta. Para la configuración de ejemplo, usaremos Nginx para el servidor de envío (aunque puede usar cualquier otro, por ejemplo, Apache2 o IIS).



Configuración del servidor de envío:



location / {
    mirror /mirror;
    ...
}

location = /mirror {
    internal;
    proxy_pass http://192.168.0.1$request_uri;
}
      
      



(en lugar de 192.168.0.1, debe especificar la dirección del servidor con Nemesida WAF instalado)



Después de realizar cambios y reiniciar el servidor web, las solicitudes que lleguen a este servidor se transmitirán al servidor 192.168.0.1 con Nemesida WAF instalado (su configuración es simple y se describirá a continuación). Este esquema de trabajo le permite monitorear los ataques sin bloquearlos, pero al mismo tiempo, sin afectar el servidor principal.



Modo IPS y PseudoIDS



Los 2 modos de funcionamiento restantes asumen el uso de WAF "a la inversa", mientras que en el modo IPS se bloquean los incidentes de seguridad detectados, en el modo PseudoIDS se registran, pero no se bloquean. El último modo es conveniente porque el cambio entre estos dos modos se realiza mediante opciones simples: la capacidad de cambiar al modo PseudoIDS tanto por el nombre del servidor (opción nwaf_host_lm



) como por la dirección IP del cliente (opción nwaf_ip_lm



).



En general, Nemesida WAF Free proporciona muchos parámetros para "ajustar" el sistema: funcionalidad flexible para crear sus propias reglas de bloqueo y exclusión, la capacidad de agregar la IP de un cliente a la "lista de exclusiones", la opción de configurar una prohibición para todos y para cada host virtual individual, etc. ... Toda esta economía se puede controlar a través de un archivo de configuración en la versión gratuita y en la versión completa también a través de llamadas a API.



Volvamos al procedimiento de instalación. Nemesida WAF se presenta en forma de varios componentes:



  • Módulo dinámico para Nginx
  • API de WAF de Nemesida (acepta eventos de WAF de Nemesida y los coloca en Postgres para su posterior visualización en el LC o integración con sistemas SIEM)
  • Cuenta personal (interfaz web para monitorear incidentes)
  • Módulo de aprendizaje automático de Nemesida AI
  • Escáner de vulnerabilidades Escáner WAF de Nemesida
  • Nemesida WAF Signtest: interfaz web para administrar un módulo de aprendizaje automático


En Nemesida WAF Free, solo necesitamos los tres primeros: el módulo dinámico en sí, la API de Nemesida WAF y la cuenta personal. Todos los componentes están disponibles como distribuciones de instalación y le permiten conectar Nemesida WAF a una instancia de Nginx ya instalada, a partir de la versión 1.12 (se admiten las versiones Stable, Mainline y Plus de Nginx).



Módulo dinámico Nemesida WAF



Para aquellos que no han instalado el kit de distribución por primera vez, el proceso de instalación y ejecución del módulo dinámico tarda entre 5 y 10 minutos. El módulo dinámico de Nemesida WAF se puede conectar a un Nginx ya instalado (o compilado desde la fuente con sus propios módulos).



Los repositorios WAF de Nemesida están disponibles para los siguientes sistemas operativos: Debian 9/10, Ubuntu 16.04 / 18.04 / 20.04, Centos 7/8. Las instrucciones en video sobre la instalación y la configuración inicial de los componentes se publican en el canal de Youtube. Recomendamos que se familiarice con uno de ellos, pero recomendamos instalarlo y configurarlo de acuerdo con la documentación del sitio principal, ya que algunos parámetros pueden quedar desactualizados, otros pueden agregarse.



Instalación del módulo dinámico Nemesida WAF (video)


Una vez configurado Nginx, conecte el repositorio WAF de Nemesida correspondiente a su sistema operativo y continúe con la instalación. El producto también se actualiza desde el repositorio. Las instrucciones de instalación están disponibles en: github.com/nemesida-waf/nemesida_waf_free .



API y cuenta personal de Nemesida WAF



Una vez que se instala y ejecuta el módulo dinámico, es hora de pasar a instalar los dos componentes restantes: la API de WAF de Nemesida y la cuenta personal.



La API de Nemesida WAF se presenta en forma de una API escrita con Flask y está diseñada para recibir eventos de Nemesida WAF, Nemesida WAF Scanner y Nemesida AI, y luego colocar estos eventos en la base de datos. PostgreSQL se utiliza como DBMS. En la versión gratuita de Nemesida WAF, solo se transmitirá a la base de datos la información sobre las solicitudes bloqueadas.



Una vez que la API de Nemesida WAF está configurada y conectada a PostgreSQL, es hora de comenzar a iniciar su cuenta personal. Según la documentación, instalamos, configuramos, realizamos la migración, especificamos el usuario y contraseña para ingresar.



Por experiencia, instalar los dos últimos componentes causa más dificultades (generalmente se omiten algunos pasos, por ejemplo, se olvidan de migrar o permitir la conexión a Postgres), por lo que para un inicio rápido, preparamos un Dispositivo Virtual (disco virtual con componentes Debian 10 y Nemesida WAF, 3GB a desempaquetado), y también hizo 2 imágenes de Docker : para el módulo dinámico y para la API / Cuenta personal de WAF de Nemesida.



Bueno, la parte más aburrida terminó, ahora podemos probar WAF en acción.



Primer truco



Para probar el funcionamiento de un WAF ya configurado, no es necesario recordar diferentes variaciones de ataque. Hemos creado una firma de prueba que comprobará si Nemesida WAF está funcionando y si los ataques bloqueados se muestran en la LC. El conjunto actual de firmas utilizadas siempre se puede ver en rlinfo.nemesida-security.com .



Enviamos una solicitud (lo hice a través de la consola, pero es mejor hacerlo a través del navegador para mayor claridad):



curl --noproxy '*' example.com/nwaftest
      
      





o, si quieres algo más cercano a la realidad:



curl --noproxy '*' example.com/?cmd=;+cat+/etc/passwd
      
      





En respuesta, recibimos un código de respuesta 403:



<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
      
      





Y en unos segundos debería aparecer un ataque en el LC:







si la solicitud no está bloqueada - WAF está conectado o configurado incorrectamente (tal vez la dirección o el host se agregó a WL / LM), si la solicitud fue bloqueada, pero no hay información en el LC - verifique la corrección de la interacción con Nemesida WAF API y LC. En cualquier caso, siempre puedes hacer una pregunta en el foro .



Página 403 personalizada



Por defecto, la página 403 (página con el código de respuesta 403) es poco atractiva y tacaña con la información. Nemesida WAF junto con Nginx le permite hacerlo más bonito y más informativo.



Para que su servidor sirva tal página, debe:



1. Crear un archivo de configuración para páginas personalizadas (por ejemplo, en /etc/nginx/snippets/custom_pages.conf



);



Agregue los parámetros requeridos a Nginx
## Error pages
error_page      403 405 = 222 /403.html;

## Locations
location /403.html {

        internal;
        root /var/www/custom_pages/;
        proxy_no_cache 1;
        proxy_cache_bypass 1;

        add_header X-Request-ID $request_id always;
        add_header Host $host always;
        add_header X-Remote-IP $remote_addr always;
        add_header NemesidaWAF-BT $nwaf_block_type always;

}
      
      







Descripción:



error_page 403 405 = 222 /403.html;



— 222 403 405 /403.html



;



/403.html



( example.com/403.html — ), ID ($request_id), ($host), , IP ($remote_addr) ( ) Nemesida WAF ($nwaf_block_type). Nemesida WAF , , 1 2 — , 3 — , 4 — ..









2. Conecte el archivo creado:



Conecte el archivo creado a la configuración de Nginx
(, /etc/nginx/conf.d/example.com.conf



):



server {
        ...
        ## Custom pages
        include                 snippets/custom_pages.conf;
       ....
}
      
      







3. Cree una página personalizada (por ejemplo /var/www/custom_pages/403.html



) con el siguiente contenido (por ejemplo):



Ejemplo de una página 403 personalizada
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <meta http-equiv="Cache-Control" content="no-cache">
    <meta http-equiv="refresh" content="7; URL=/" />
    <style type="text/css">
        .error {color:#000; font-family:Arial, sans-serif; text-align: center; position: absolute; top: 50%; left: 50%; -moz-transform: translateX(-50%) translateY(-50%); -webkit-transform: translateX(-50%) translateY(-50%); transform: translateX(-50%) translateY(-50%);}
        .error-fon {font-weight:bold; color:#d0e3f7;}
        .error-text-top {font-size:16px; color:#434141}
        hr { display: block; height: 10px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; }
    </style>
    <title>403 Access denied</title>
</head>
<body>
<div class="error">
    <div class="error-fon">
        <font style="font-size:240px;">403</font>
        <br>
        <font style="font-size:40px;">ACCESS IS BLOCKED</font>
    </div>
    <br>
    <div class="error-text-wrap">
        <div class="error-text-top">
            <p>
            <hr>
            <p style="text-align: justify;">

              Suspicious activity. If the request is blocked by mistake, please email us at <a href="mailto:blocked@example.com">blocked@example.com</a> and  be sure to include technical information below (domain, IP, request ID), or try again in 5 minutes.

              <br><br>

               .     , ,    <a href="mailto:blocked@example.com">blocked@example.com</a>,      (domain, IP, request ID),     5 .

            </p>
	    <hr>
            <table style="text-align: left; margin: auto">
                <tr>
                    <td>
                        <code style="font-size:14px;"> Domain:</code>
                    </td>
                    <td>
                        <code style="font-size:14px;"> <span id="domain">-</span> </code>
                    </td>
                </tr>
                <tr>
                    <td>
                        <code style="font-size:14px;"> IP address:</code>
                    </td>
                    <td>
                        <code style="font-size:14px;"> <span id="ip">-</span> </code>
                    </td>
                </tr>
                <tr>
                    <td>
                        <code style="font-size:14px;"> Request ID:</code>
                    </td>
                    <td>
                        <code style="font-size:14px;"> <span id="id">-</span> </code>
                    </td>
                </tr>
            </table>
            </p>
        </div>
        <script type="application/javascript">
            function replace() {
                window.location.replace('/');
            }
            const req = new XMLHttpRequest();
            req.open('GET', document.location, false);
            req.send(null);
            const req_id = req.getResponseHeader('x-request-id');
            const req_domain = req.getResponseHeader('host');
            let req_ip = req.getResponseHeader('x-remote-ip');
            const req_bt = req.getResponseHeader('nemesidawaf-bt');
            if (req_bt == 6)
            {
                req_ip = req_ip  + " (banned)";
            }
            if (req_bt ==7)
            {
                req_ip = req_ip  + " (banned, bruteforce)";
            }
            document.getElementById('domain').innerHTML = req_domain;
            document.getElementById('ip').innerHTML = req_ip;
            document.getElementById('id').innerHTML = req_id;
            if (req_bt != 6 & req_bt !=7)
            {
                setTimeout(replace,3000);
            }
        </script>
    </div>
</div>
</body>
</html>
      
      







Después de reiniciar Nginx (con Nemesida WAF instalado), todas las páginas con los códigos de respuesta 403 y 405 se verán así:







en este caso, la página personalizada se actualizará cada 7 segundos, y si la IP del cliente no está prohibida, la página raíz del sitio volverá.



Prohibición automática



Probablemente haya escuchado o incluso haya utilizado sistemas de prohibición automática como Fail2ban y conozca sus ventajas y desventajas. Nemesida WAF utiliza un mecanismo de prohibición integrado y fácil de configurar que le permite establecer un período de bloqueo arbitrario para los hosts virtuales del servidor. El bloqueo se produce por dirección IP y las siguientes opciones están disponibles para su control:



  • El número de ataques de IP que conducen al bloqueo;
  • Período de bloqueo;
  • El host virtual al que se dirigen los ataques (opcional).


El parámetro de bloqueo automático está controlado por el parámetro nwaf_limit



disponible en el archivo /etc/nginx/nwaf/conf/global/nwaf.conf



. El uso de este parámetro será útil en los casos en que el sitio esté siendo escaneado en busca de vulnerabilidades o cuando se trate de promover una vulnerabilidad detectada.



Mientras listas



El trabajo de WAF se basa en el principio de analizar las solicitudes y respuestas que llegan al servidor en los casos en que contienen indicios de un ataque o anomalías. El uso de algoritmos de aprendizaje automático, junto con la tecnología de normalización mejorada en la versión completa de Nemesida WAF, permite detectar tales ataques con precisión y con un número ultramínimo de falsos positivos (alrededor del 0,01%), pero en la versión gratuita para reducir el número de falsos positivos, nos encontramos con las limitaciones de la arquitectura análisis de firmas. Por tanto, la versión gratuita tiene más falsos positivos y hay que utilizar listas de exclusión (o "listas blancas") para solucionar este problema. La creación de reglas de exclusión también está disponible en Nemesida WAF.



En la mayoría de los casos, los falsos positivos aparecen cuando el administrador / moderador de un recurso web realiza una actualización o un cambio a través de la interfaz web, transmitiendo construcciones que son atípicas para el usuario en el cuerpo de la solicitud: una solicitud legítima se bloqueará porque contiene una entrada de función , mientras que dichas solicitudes no son típicas de los visitantes normales recurso web. En los casos en que los administradores de la aplicación no puedan interactuar con ella sin pasar por WAF, puede agregar la dirección IP desde la que acceden al recurso a la lista de excepciones, o cambiar la dirección al modo PseudoIDS (opción ) para capturar eventos sin bloquear. Pero siempre debes tener cuidado con tales acciones.

...

$html = curl_exec($ch);

curl_close($ch);

return json_decode($html,true);

...








json_decode()







nwaf_ip_lm







Por cierto, Nemesida WAF le permite agregar no solo direcciones IP, sino también subredes, si es necesario.



Conclusión



Independientemente de lo bien que esté escrito el código en su opinión, utiliza funciones de filtrado de entrada y marcos especiales como HTML Purifier, diseñado para eliminar, si no todo el código malicioso, la mayor parte, debe usar WAF para aumentar el nivel de seguridad.



Si tiene la intención de utilizar WAF por primera vez, o está cansado de la adición interminable de reglas de exclusión, le recomendamos que pruebe Nemesida WAF Free. Para uso profesional (bloqueo de ataques complejos, ataques de fuerza bruta, inundación de SMS; búsqueda de vulnerabilidades; presencia de un sistema de parcheo virtual, etc.), se requiere una versión completa de Nemesida WAF con un módulo de aprendizaje automático y un escáner de vulnerabilidades. Sin embargo, para la mayoría de los ataques no dirigidos y los análisis masivos, Nemesida WAF Free será una herramienta buena y conveniente.



En el artículo, traté de revelar situaciones que surgen con mayor frecuencia cuando se utilizan soluciones de esta clase. Me alegrará si recuerda más en los comentarios.



All Articles