Packaging Docker du WAF Naxsi : quels avantages ?

XCG a packagé Naxsi, extension de Nginx, en Docker. Mais qu’est-ce que Naxsi et quels sont les avantages de cette « dockerisation » ?

Naxsi est un Web Application Firewall (WAF), extension du logiciel open source Nginx.

En tant que serveur HTTP (ou serveur web) et reverse proxy, Nginx est un logiciel qui permet de servir des requêtes respectant le protocole de communication client-serveur Hypertext Transfer Protocol (HTTP), développé pour le World Wide Web. Nginx joue en effet le rôle d’intermédiaire entre, d’une part, les utilisateurs d’Internet et, d’autre part, les applications situées sur le réseau interne. Ainsi, lorsqu’un client HTTP, en particulier un navigateur web, se connecte à un logiciel comme Nginx, cela permet à des utilisateurs d’accéder à des sites ou à d’autres applications web.

En tant que Web Application Firewall (en français pare-feu applicatif web), Naxsi vise à prévenir les attaques de ces sites ou applications web, notamment celles liées à des failles cross-site scripting (XSS), injections SQL ou attaques directory traversal. Le XSS est un type de faille de sécurité que les pirates exploitent en injectant des scripts dans des pages web côté client, ce qui permet de générer des actions sur les navigateurs web visitant la page. Quant à l’injection SQL, il s’agit d’une attaque par laquelle une requête SQL pirate est injectée dans une application interagissant avec une base de données. Les attaques directory traversal (« traversement de répertoires ») consistent à forcer l’accès à des sections du site normalement non accessibles en modifiant le chemin de l'arborescence dans l'URL. Pour contrer l’ensemble de ces attaques, le WAF, comme tout pare-feu applicatif, contrôle les informations entrant et sortant des sites ou applications web ainsi que leurs accès. Plus précisément, il applique un ensemble de règles à une conversation HTTP.

Seul WAF open source basé sur l’analyse heuristique

Open source, Naxsi a pour autre particularité notable de s’appuyer sur l’analyse heuristique et non sur la méthode standard basée sur les signatures (signature-based). Il s’agit du seul WAF open source utilisant la méthode heuristique. Mais en quoi cette méthode diffère-t-elle de la méthode signature-based ?

Pour savoir si une requête constitue une menace, un WAF pratiquant la détection signature-based compare le contenu du fichier aux signatures des logiciels malveillants déjà rencontrés. Ainsi, un WAF signature-based ne bloque que les menaces qu’il parvient à identifier. Des mises à jour sont donc indispensables à l’arrivée de chaque nouveau type d’attaque et la protection contre les nouvelles menaces ne peut être assurée.

À l’inverse d’un WAF signature-based, un WAF s’appuyant sur la méthode heuristique bloque par défaut toutes les requêtes ne répondant pas à la norme HTTP (telle que décrite dans les « requests for comments » (RFC), série de documents officiels décrivant les aspects techniques d'Internet et de différents équipements informatiques). Une « whitelist » est établie afin d’autoriser les requêtes HTTP nécessaires à l’utilisation de l’application protégée par le WAF. L’activation du  mode « learning » permet en outre d’analyser le journal des erreurs et de générer des « whitelists » à partir de ce fichier. Les WAF appliquant la méthode heuristique présentent ainsi l’avantage de ne pas exiger de mise à jour à l’arrivée de chaque nouveau type d’attaque.

Prêt à l’emploi grâce au packaging Docker

La virtualisation ou le « packaging » d’une application permet de réunir l’ensemble des composants de celle-ci en un seul fichier, ce qui facilite le travail des équipes techniques (développeurs, administrateurs système…) en leur évitant de devoir adapter les développements au système sous-jacent.

Mi-2013, XCG a choisi de laisser de côté les machines virtuelles au profit de Docker pour virtualiser les applications qu’il déployait. Docker est un logiciel open source qui automatise le déploiement des applications en les empaquetant avec leurs dépendances dans des conteneurs virtuels. Les applications peuvent ainsi être exécutées sur n’importe quel serveur Linux, que ce soit sur une machine locale, un cloud privé ou public… Contrairement aux machines virtuelles, qui virtualisent l’environnement complet, système d’exploitation inclus, les conteneurs Docker n’embarquent que le code indispensable à l’application et s’adressent au système d’exploitation et aux ressources logicielles présentes sur le serveur pour le reste. Ils ont, ainsi, l’avantage d’être moins encombrants que les machines virtuelles, de consommer moins de ressources (notamment moins de mémoire) et de démarrer plus rapidement.

La société XCG empaquetant l’ensemble des applications qu’elle déploie dans des conteneurs virtuels Docker, elle n’a ainsi besoin, pour les faire fonctionner sur sa plate-forme d’hébergement, que d’utiliser un système d’exploitation minimal de type CoreOS.

XCG ayant déjà dockerisé Nginx, il était nécessaire de faire de même pour Naxsi, extension de Nginx qui ne constituait pas un plug-in mais devait être compilée avec ce logiciel dans le code source, ce qui la rendait donc pénible à installer. Packagé en Docker, Naxsi est, au contraire, prêt à l’emploi.

Lorsque Nginx est utilisé pour permettre à des utilisateurs d’accéder à une application comme Odoo, l’emploi de Naxsi permet de sécuriser l’utilisation de cette application en empêchant les attaques de type XSS, injections SQL et autres directory traversal.

Retrouvez l’image Docker de Naxsi sur le Registry Hub Docker.

Ce package est compilé à partir de Nginx 1.6.2 et de Naxsi 0.54rc1.

Vous devez réaliser la configuration vous-même et établir des whitelists afin d’autoriser les requêtes http nécessaires à l’utilisation de vos applications.

Usage

docker run -d -p 80:80 django_xcgd/nginx-naxsi-autodiscovery

Par défaut, Nginx n’est pas démarré en mode démon. Cela garantit que Nginx reste au premier plan afin que Docker surveille correctement le process (autrement, votre conteneur cessera immédiatement de fonctionner) !

Attacher un répertoire de données persistantes

docker run \
    -d \
    -p 80:80 \
    -v :/etc/nginx/sites-enabled \
    -v :/etc/nginx/certs \
    -v :/var/log/nginx \
    -v :/etc/nginx \
    -v :/etc/nginx/conf.d \
    dockerfile/nginx

Si vous souhaitez utiliser un autre conteneur pour exposer un site vers lequel effectuer la redirection, vous pouvez ajouter –link <container-name>:<alias-in-nginx-conf>.

Au bout de deux secondes, ouvrez http://<host> pour accéder à la page d’accueil.

Le projet Nginx sur GitHub.

Le projet Naxsi sur GitHub.