Un reverse proxy WAF sous FreeBSD avec Nginx Naxsi
D’abord, pour les lecteurs qui ont ouvert cet article sans conviction parce que FreeBSD, bon, c’est un OS pour les moustachus, je vais expliquer mon choix un peu plus bas.
Naxsi
Avant tout quelques explications sur ce qu’est Naxsi :
Naxsi est un WAF.
Maintenant que c’est dit, quelques explications sur ce qu’est un WAF :
Un WAF est un firewall pour applications Web, autrement dit une bébête qui vérifie les requêtes des clients Web avant de les transmettre aux serveurs Web. Il protège notamment contre les attaques SQLi ou XSS qui sont les plus communes (voir TOP10 Owasp). C’est un reverse proxy, c’est à dire un proxy qui protège les serveurs Web.
Si c’est sous FreeBSD je préfère quitter cette page dès maintenant
Quand il s’agit de mettre en place un serveur public donc visible sur le Net, qui plus est chargé de faire de la sécurité, il n’y a pas photo, il vaut mieux utiliser un BSD.
Les chiffres vont parler d’eux même :
- 37 failles de sécurité en 2016 chez FreeBSD
- 370 failles chez Debian
- 427 failles chez Ubuntu
Et Maintenant, installation de Naxsi sous FreeBSD
Fini de rire, on est partis pour l’installation :
La bonne nouvelle c’est que depuis quelques années, il y a un gestionnaire de packages à la APT sous FreeBSD.
La mauvaise nouvelle c’est que Naxsi n’est pas livré par défaut avec le paquet nginx, il va donc falloir le compiler avec les ports.
cd /usr/ports/www/nginx
make config
A ce moment là, vous pouvez tout laisser par défaut et ne cocher que Naxsi en plus, ou alors choisir les modules que vous voulez pour votre Nginx.
Pour télécharger et installer Nginx on se contentera d’un :
make install
Configuration d’un reverse proxy/WAF Nginx/Naxsi :
Avant de commencer, on n’oublie pas les préconisations de sécurité que ce soit pour SSL, pour les headers ou encore pour rendre Nginx silencieux.
Dans la configuration du contexte http de /usr/local/etc/nginx/nginx.conf, on peut ajouter ces lignes :
### CONFIG FOR REV PROXY ### # Enable compress gzip on; gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x-js; # disable access log as apache already store them... access_log off; proxy_cache_path /var/tmp/nginx/cache levels=1:2 keys_zone=static:10m; include /usr/local/etc/nginx/naxsi_core.rules; ### / CONFIG FOR REV PROXY ###
Dans le contexte server, on peut ajouter ces lignes, où backend est l’adresse IP du « vrai » site :
set $backend "http://1.2.3.4"; include revproxy.conf;
Enfin le fichier revproxy qui est appelé peut contenir ces lignes :
location / { proxy_pass $backend; proxy_cache static; proxy_cache_valid 1h; proxy_cache_use_stale error timeout invalid_header updating; } # specific cache for static files location ~*^.+(swf|jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js) { proxy_pass $backend; # make apache named virtual host to work proxy_set_header Host $host; # set reverse proxy cache to offload Apache for static files proxy_cache static; proxy_cache_valid 10d; # Allow browser caching for 7 days expires 7d; # authorize cache for browser proxies add_header Pragma public; add_header Cache-Control "public, must-revalidate, proxy-revalidate"; # remove cookies as their are useless for static files fastcgi_hide_header Set-Cookie; # remove php cache control header to control them from nginx fastcgi_hide_header Cache-Control; fastcgi_hide_header Pragma; access_log off; # enable etag for proxy caching optimization on cluster etag on; } # Only allow common method : GET, POST and HEAD (for browser caching) if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 444; } # spam protection if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen) ) { return 403; }