Que devrions-nous mettre en place WAF





Lors du développement ou de la maintenance d'applications Web, vous devez à un moment donné faire face à la nécessité d'utiliser WAF (Web Application Firewall). Si vous n'avez aucune expérience avec une telle classe de solution ou si vous êtes fatigué des faux positifs constants, je vous expliquerai comment simplifier la tâche, ainsi que partager des trucs et astuces. Comme outil, nous utiliserons Nemesida WAF Free - une version gratuite de Nemesida WAF.



Visualisation, ou commençons par la fin



Vous pouvez surveiller le travail de Nemesida WAF Free via un navigateur, donc après une brève configuration du système, nous aurons accès à l'interface Web, où des informations sur les attaques bloquées, les raisons du blocage, des informations sur les adresses IP, etc. seront disponibles. De plus, des sections contenant des statistiques récapitulatives sous forme de graphiques, de diagrammes et de données sur le trafic du module VTS (le cas échéant) apparaîtront.







Stand de démonstration: demo.lk.nemesida-security.com (demo@pentestit.ru / pentestit)







Continuons l'installation.



Installer Nemesida WAF gratuitement



Bien que la version gratuite soit une fourchette de la version à part entière, elle contient un large éventail de capacités pour détecter, bloquer et visualiser les attaques sur les applications Web. Par application Web, nous entendons tout ce qui est construit sur le protocole HTTP: sites Web, comptes personnels, boutiques en ligne, sites de formation, API et tout le reste.



Dans le paragraphe précédent, j'ai spécifiquement divisé la fonctionnalité de blocage des attaques en détection et blocage, car il existe 2 (voire trois) modes de fonctionnement du produit: IDS, IPS et PseudoIDS (mode LM).



Mode IDS



Le mode IDS permet d'utiliser WAF sur une copie de trafic, détectant mais non bloquant les attaques. Ce mode de fonctionnement est utile, par exemple, pour le démarrage initial ou pour la surveillance passive pour éviter tout blocage des demandes ou une augmentation, certes négligeable, du temps de réponse. Pour l'exemple de configuration, nous utiliserons Nginx pour le serveur d'envoi (bien que vous puissiez en utiliser n'importe quel autre, par exemple Apache2 ou IIS).



Configuration du serveur d'envoi:



location / {
    mirror /mirror;
    ...
}

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



(au lieu de 192.168.0.1, vous devez spécifier l'adresse du serveur sur lequel Nemesida WAF est installé)



Après avoir effectué des modifications et redémarré le serveur Web, les requêtes provenant de ce serveur seront transmises au serveur 192.168.0.1 avec Nemesida WAF installé (sa configuration est simple et sera décrite ci-dessous). Ce schéma de travail vous permet de surveiller les attaques sans les bloquer, mais en même temps, sans affecter le serveur principal.



Mode IPS et PseudoIDS



Les 2 modes de fonctionnement restants supposent l'utilisation du WAF "inversement", alors qu'en mode IPS, les incidents de sécurité détectés sont bloqués, en mode PseudoIDS ils sont enregistrés, mais pas bloqués. Le dernier mode est pratique dans la mesure où la commutation entre ces deux modes se fait à l'aide d'options simples: la possibilité de passer en mode PseudoIDS à la fois par le nom du serveur (option nwaf_host_lm



) et par l'adresse IP du client (option nwaf_ip_lm



).



En général, Nemesida WAF Free fournit de nombreux paramètres pour «affiner» le système: une fonctionnalité flexible pour créer vos propres règles de blocage et d'exclusion, la possibilité d'ajouter l'adresse IP d'un client à la «liste des exclusions», la possibilité de mettre en place une interdiction pour tous et pour chaque hôte virtuel individuel, etc. ... Toute cette économie peut être contrôlée via le fichier de configuration dans la version gratuite, et dans la version à part entière également via des appels API.



Revenons à la procédure d'installation. Nemesida WAF se présente sous la forme de plusieurs composants:



  • Module dynamique pour Nginx
  • API Nemesida WAF (accepte les événements de Nemesida WAF et les place dans Postgres pour affichage ultérieur dans le LC ou intégration avec les systèmes SIEM)
  • Compte personnel (interface web pour surveiller les incidents)
  • Module d'apprentissage automatique Nemesida AI
  • Scanner de vulnérabilité Nemesida WAF Scanner
  • Nemesida WAF Signtest - interface web pour gérer un module d'apprentissage automatique


Dans Nemesida WAF Free, nous n'avons besoin que des trois premiers - le module dynamique lui-même, l'API Nemesida WAF et le compte personnel. Tous les composants sont disponibles en tant que distributions d'installation et vous permettent de connecter Nemesida WAF à une instance Nginx déjà installée, à partir de la version 1.12 (les versions Stable, Mainline et Plus de Nginx sont prises en charge).



Module dynamique Nemesida WAF



Pour ceux qui n'ont pas installé le kit de distribution pour la première fois, le processus d'installation et d'exécution du module dynamique prend environ 5 à 10 minutes. Le module dynamique Nemesida WAF peut être connecté à un Nginx déjà installé (ou compilé à partir des sources avec ses propres modules).



Les référentiels Nemesida WAF sont disponibles pour les OS suivants: Debian 9/10, Ubuntu 16.04 / 18.04 / 20.04, Centos 7/8. Des instructions vidéo sur l'installation et la configuration initiale des composants sont publiées sur la chaîne Youtube. Nous vous recommandons de vous familiariser avec l'un d'entre eux, mais nous vous recommandons de l'installer et de le configurer selon la documentation sur le site principal, car certains paramètres peuvent devenir obsolètes, d'autres peuvent être ajoutés.



Installation du module dynamique Nemesida WAF (vidéo)


Une fois Nginx configuré, connectez le référentiel Nemesida WAF correspondant à votre système d'exploitation et procédez à l'installation. Le produit est également mis à jour à partir du référentiel. Les instructions d'installation sont disponibles sur le lien: github.com/nemesida-waf/nemesida_waf_free .



API et compte personnel Nemesida WAF



Une fois le module dynamique installé et lancé, il est temps de passer à l'installation des deux composants restants: l'API Nemesida WAF et le compte personnel.



L'API Nemesida WAF est présentée sous la forme d'une API écrite à l'aide de Flask et est conçue pour recevoir les événements de Nemesida WAF, Nemesida WAF Scanner et Nemesida AI, puis placer ces événements dans la base de données. PostgreSQL est utilisé comme un SGBD. Dans la version gratuite de Nemesida WAF, seules les informations sur les demandes bloquées seront transmises à la base de données.



Une fois l'API Nemesida WAF configurée et connectée à PostgreSQL, il est temps de commencer à lancer votre compte personnel. Selon la documentation, nous installons, configurons, effectuons la migration, spécifions l'utilisateur et le mot de passe à saisir.



De l' expérience, l' installation des deux dernières composantes provoque plus de difficultés (généralement quelques étapes sont sautées, par exemple, ils oublient de migrer ou permettre la connexion à Postgres), donc pour un démarrage rapide, nous avons préparé un Virtual Appliance (disque virtuel avec Debian 10 et composants WAF Nemesida, 3GB déballage), et a également réalisé 2 images Docker : pour le module dynamique et pour l'API / compte personnel Nemesida WAF.



Eh bien, la partie la plus ennuyeuse est terminée, nous pouvons maintenant tester WAF en action.



Premier piratage



Pour tester le fonctionnement d'un WAF déjà configuré, il n'est pas nécessaire de se souvenir des différentes variations d'attaque. Nous avons créé une signature de test qui vérifiera si Nemesida WAF fonctionne et si les attaques bloquées sont affichées dans le LC. L'ensemble actuel des signatures utilisées peut toujours être consulté sur rlinfo.nemesida-security.com .



Nous envoyons une demande (je l'ai fait via la console, mais il vaut mieux le faire via le navigateur pour plus de clarté):



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





ou, si vous voulez quelque chose de plus proche de la réalité:



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





En réponse, nous recevons un code de réponse 403:



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





Et dans quelques secondes, une attaque devrait apparaître dans le LC:







Si la demande n'est pas bloquée - WAF est mal connecté ou configuré (peut-être que l'adresse ou l'hôte est ajouté à WL / LM), si la demande a été bloquée, mais il n'y a aucune information dans le LC - vérifiez l'exactitude de l'interaction avec Nemesida API WAF et LC. Dans tous les cas, vous pouvez toujours poser une question sur le forum .



Page 403 personnalisée



Par défaut, la page 403 (page avec le code de réponse 403) est peu attrayante et avare d'informations. Nemesida WAF en conjonction avec Nginx vous permet de le rendre beau et plus informatif.



Pour que votre serveur serve une telle page, vous devez:



1. Créer un fichier de configuration pour les pages personnalisées (par exemple, dans /etc/nginx/snippets/custom_pages.conf



);



Ajouter les paramètres requis à 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;

}
      
      







La description:



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. Connectez le fichier créé:



Connectez le fichier créé à la configuration Nginx
(, /etc/nginx/conf.d/example.com.conf



):



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







3. Créez une page personnalisée (par exemple /var/www/custom_pages/403.html



) avec le contenu suivant (par exemple):



Exemple de page 403 personnalisée
<!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>
      
      







Après avoir redémarré Nginx (avec Nemesida WAF installé), toutes les pages avec les codes de réponse 403 et 405 ressembleront à ceci:







La page personnalisée sera actualisée toutes les 7 secondes, et si l'adresse IP du client n'est pas interdite, la page racine du site reviendra.



Interdiction automatique



Vous avez probablement entendu ou même utilisé des systèmes d'interdiction automatique comme Fail2ban et connaissez leurs avantages et leurs inconvénients. Nemesida WAF utilise un mécanisme d'interdiction intégré et facile à configurer qui vous permet de définir une période de blocage arbitraire pour les hôtes de serveurs virtuels. Le blocage se produit par adresse IP et les options suivantes sont disponibles pour le contrôle:



  • Le nombre d'attaques IP qui mènent au blocage;
  • Période de blocage;
  • L'hôte virtuel vers lequel les attaques sont dirigées (facultatif).


Le paramètre de blocage automatique est contrôlé par le paramètre nwaf_limit



disponible dans le fichier /etc/nginx/nwaf/conf/global/nwaf.conf



. L'utilisation de ce paramètre sera utile dans les cas où le site est analysé à la recherche de vulnérabilités ou lorsque vous essayez de promouvoir une vulnérabilité détectée.



Alors que les listes



Le travail de WAF est basé sur le principe de l'analyse des requêtes et des réponses arrivant sur le serveur dans les cas où elles contiennent des signes d'attaque ou d'anomalies. L'utilisation d'algorithmes d'apprentissage automatique, associée à une technologie de normalisation améliorée dans la version complète de Nemesida WAF, permet de détecter de telles attaques avec précision et avec un nombre ultra-minimum de faux positifs (environ 0,01%), mais dans la version gratuite pour réduire le nombre de faux positifs, nous nous heurtons aux limites de l'architecture analyse de signature. Ainsi, la version gratuite a plus de faux positifs, et vous devez utiliser des listes d'exclusion (ou «listes blanches») pour résoudre ce problème. La création de règles d'exclusion est également disponible dans Nemesida WAF.



Le plus souvent, des faux positifs apparaissent lorsque l'administrateur / modérateur d'une ressource Web effectue une mise à jour ou une modification via l'interface Web, transmettant des constructions atypiques pour l'utilisateur dans le corps de la requête: une requête légitime sera bloquée car elle contient une entrée de fonction , alors que de telles requêtes ne sont pas typiques pour les visiteurs ordinaires ressource Web. Dans les cas où les administrateurs d'application ne peuvent pas interagir avec lui en contournant WAF, vous pouvez ajouter l'adresse IP à partir de laquelle ils accèdent à la ressource à la liste des exceptions ou basculer l'adresse en mode PseudoIDS (option ) pour capturer des événements sans blocage. Mais avec de telles actions, vous devez toujours être suffisamment prudent.

...

$html = curl_exec($ch);

curl_close($ch);

return json_decode($html,true);

...








json_decode()







nwaf_ip_lm







En passant, Nemesida WAF vous permet d'ajouter non seulement des adresses IP, mais également des sous-réseaux, si nécessaire.



Conclusion



Quelle que soit la qualité de l'écriture du code à votre avis, il utilise des fonctions de filtrage d'entrée et des cadres spéciaux tels que HTML Purifier, conçus pour supprimer sinon tout le code malveillant, vous devez utiliser WAF pour augmenter le niveau de sécurité.



Si vous avez l'intention d'utiliser WAF pour la première fois ou si vous en avez assez de l'ajout sans fin de règles d'exclusion, nous vous recommandons d'essayer le logiciel gratuit Nemesida WAF Free. Pour un usage professionnel (blocage des attaques complexes, attaques par force brute, inondation de SMS; recherche de vulnérabilités; présence d'un système de correctif virtuel, etc.), une version complète de Nemesida WAF avec un module d'apprentissage automatique et un scanner de vulnérabilité est nécessaire. Néanmoins, pour la plupart des attaques non ciblées et des analyses en masse, Nemesida WAF Free sera un bon outil pratique.



Dans l'article, j'ai essayé de révéler les situations qui surviennent le plus souvent lors de l'utilisation de solutions de cette classe. Je serai heureux si vous vous en souvenez plus dans les commentaires.



All Articles