Naxsi est un module de nginx qui fait office de pare feu web. Il fonctionne avec des whitelist.

Installation sur debian/ubuntu

Attention installer le paquet ci-dessous, désinstalle la version “full” de NGinx. Il faut absolument lire la description suivante des paquets Debian avant de faire cette opération.Pour installer Naxsi avec d’autres modules non prévus dans les package Debian, il est nécessaire de prendre tous les sources et de compiler.

apt-get install nginx-naxsi;

Dans le fichier /etc/nginx/nginx.conf, décommenter:

include /etc/nginx/naxsi_core.rules;  

Dans le fichier */etc/nginx/sites-available/default *, ajouter:

location /RequestDenied { return 404; }  

Exemple de fichier: /etc/init.d.nginx/naxsi.rules

SecRulesEnabled;  
DeniedUrl "/RequestDenied";  
## check rules
CheckRule "$SQL >= 8" BLOCK;  
CheckRule "$RFI >= 8" BLOCK;  
CheckRule "$TRAVERSAL >= 4" BLOCK;  
CheckRule "$EVADE >= 4" BLOCK;  
CheckRule "$XSS >= 8" BLOCK;  

Activer le LearningMode pour le site, et inclure les naxsi.rules. Dans ce mode tout sera autorisé, et des événements seront enregistrés dans les logs d’erreur nginx.

Exemple: /etc/nginx/sites-available/site.domain

## (...)
 access_log /var/log/nginx/site_access.log;
 error_log /var/log/nginx/site_error.log;
 location / {
 LearningMode;
 include /etc/nginx/naxsi.rules;
 # include /etc/nginx/naxsi/site.rules;
 try_files $uri/index.html $uri.html $uri;
 }
 ## (...)

Télécharger nx_util: http://code.google.com/p/naxsi/downloads/list

Décompresser l’archive:

tar xvf nx_util-1.0.tgz

Pour générer les whitelist, il faut avoir navigué sur tout le site (formulaires compris) pour générer tous les éléments possibles.

Générer les whitelist avec nx_util.py

./nx_util.py -d site -l /var/log/nginx/site_error.log -o
  • -d => Nom de la base sqlite ou sera stockée la whitelist, on peut donner le nom du site.
  • -l => Fichiers de log à parser. On peut utiliser les wildcards, et les fichiers .tgz sont pris en comptes.
  • -H => Génère un rapport html
  • -i => incremental (sinon omis, la base actuelle est écrasée)

Plus de détails ici: http://code.google.com/p/naxsi/wiki/NxUtil_man

Exemple de whitelist:

########### Optimized Rules Suggestion ##################
# total_count:409 (47.23%), peer_count:1 (100.0%) | double encoding !
BasicRule wl:1315 "mz:$HEADERS_VAR:cookie";  
# total_count:409 (47.23%), peer_count:1 (100.0%) | mysql comment (--) 
BasicRule wl:1007 "mz:$HEADERS_VAR:cookie";  
# total_count:38 (4.39%), peer_count:1 (100.0%) | 0x, possible hex encoding 
BasicRule wl:1002 "mz:$HEADERS_VAR:cookie";  
# total_count:2 (0.23%), peer_count:1 (100.0%) | equal in var, probable sql/xss 
BasicRule wl:1009 "mz:$URL:/projects|$BODY_VAR:authenticity_token";  
# total_count:2 (0.23%), peer_count:1 (100.0%) | html comment tag
BasicRule wl:1100 "mz:$URL:/login|$BODY_VAR:back_url";  
# total_count:2 (0.23%), peer_count:1 (100.0%) | equal in var, probable sql/xss
BasicRule wl:1009 "mz:$URL:/login|$BODY_VAR:authenticity_token";  
# total_count:2 (0.23%), peer_count:1 (100.0%) | sql keywords
BasicRule wl:1000 "mz:$URL:/javascripts/select_list_move.js|URL";  
# total_count:1 (0.12%), peer_count:1 (100.0%) | equal in var, probable sql/xss
BasicRule wl:1009 "mz:$URL:/logout|$BODY_VAR:authenticity_token";  
# total_count:1 (0.12%), peer_count:1 (100.0%) | html comment tag
BasicRule wl:1100 "mz:$URL:/login|$ARGS_VAR:back_url";  

Copier les whitelists affichées dans un fichier, par exemple /etc/nginx/naxsi/site.rules
Décommenter la ligne y faisant appel dans /etc/nginx/sites-available/site.domain, puis commenter la ligne LearningMode.

Redémarrer nginx et le pare feu devrait être actif.
En cas de blocage sur certaines adresses qui ne devrait pas l’être, il est possible de reactiver le LearningMode afin de générer des règles additionnelles (nx_util.py -i…).

Une série d'exemples de règles est disponible ici.