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;
}

 

 

Sur le même sujet :