Nginx és un servidor HTTP popular de codi obert que destaca per la seua estabilitat, configuració simple i baixos requeriments de maquinari. Podeu augmentar  la seguretat del vostre servidor Nginx mitjançant l’instal·lació d’un mòdul com NAXSI. NAXSI (Nginx Anti-XSS and SQL Injection) és un mòdul Nginx que ofereix funcions de tallafoc d’aplicacions web (WAF). NAXSI analitza, filtra i protegeix el trànsit que arriba al vostre web i actua com un tallafoc que bloqueja tot el trànsit, tret que li indiquen regles per permetre-hi l’accés.

En aquest tutorial, utilitzarem NAXSI per protegir Nginx instal·lat en ubuntu 18.04. Com que el mòdul NAXSI no ve amb el paquet Nginx de manera predeterminada, haurem de compilar Nginx amb NAXSI. Al final del tutorial, veurem quins tipus d’atacs NAXSI podem bloquejar i com configurar les regles per a que funcione correctament.

Requisits previs

IMPORTANT: aquest tutorial és vàlid per a la instal·lació d’un servidor NGINX en ubuntu 18.04 (serveix per altres versions d’ubuntu properes).

Abans de compilar assegureu-se que teniu instal·lades algunes dependències necessàries:

sudo apt install build-essential libpcre3-dev libssl-dev

Podeu consultar entrades anteriors on vos explicava com instal·lar i actualitzar un servidor web amb apache o nginx:


Instal·lar NGINX amb NAXSI

La majoria dels mòduls Nginx no estan disponibles a través de repositoris d’ubuntu o els oficials d’nginx, i NAXSI no és una excepció. Per aquesta raó, haureu de descarregar i compilar manualment nginx des de la pàgina oficial d’NGINX.

Primer, des del terminal, executeu la següent ordre per a descarregar la última versió NGINX:

wget http://nginx.org/download/nginx-1.17.5.tar.gz

Nota: aquest tutorial utilitza la versió 1.17.5 Nginx. Reviseu la pàgina de descarrega d’nginx per comprovar si hi ha una versió més nova.

Després, descarregueu NAXSI a la pàgina dels seus desenvolupadors a Github. A l’hora d’escriure aquesta entrada, la versió disponible més nova és la 0.56. Si trobeu una versió més nova, podeu provar a instal·lar-la.

wget https://github.com/nbs-system/naxsi/archive/0.56.tar.gz -O naxsi.tar.gz

En primer lloc, hem de descomprimir l’arxiu font del servidor nginx. Després hem de fer el mateix amb l’arxiu descarregat de naxsi.

tar -xvf nginx-1.17.5.tar.gz
tar -xvf naxsi.tar.gz

Ara tindreu dos carpetes, una amb els arxius d’nginx i altra amb els de naxsi. Doncs ara, heu de moure la carpeta de naxsi dins la carpeta d’nginx. Si heu descarregat els arxius a l’arrel de “HOME”, només heu de teclejar:

mv naxsi-0.56/ nginx-1.17.5/

Ara, executeu l’ordre següent al terminal des de la carpeta d’instal·lació d’nginx:

./configure \
--conf-path=/etc/nginx/nginx.conf \
--add-module=naxsi-0.56/naxsi_src/ \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \ 
--modules-path=/usr/lib/nginx/modules \ 
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \ 
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \ 
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \ 
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--user=nginx \
--group=nginx \
--with-compat \
--with-file-aio \ 
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \ 
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \ 
--with-http_gzip_static_module \ 
--with-http_mp4_module \
--with-http_random_index_module \ 
--with-http_realip_module \
--with-http_secure_link_module \ 
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \ 
--with-http_sub_module \ 
--with-http_v2_module \
--with-mail \
--with-mail_ssl_module \ 
--with-stream \
--with-stream_realip_module \ 
--with-stream_ssl_module \
--with-stream_ssl_preread_module \  
--with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.17.5/debian/debuild-base/nginx-1.17.5=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'

Cadascuna de les línies de l’ordre anterior defineix un paràmetre per al servidor web Nginx. El més important és el paràmetre --add-module=naxsi-0.56/naxsi_src/, que connecta el mòdul NAXSI amb Nginx. La resta dades de configuració són les genèriques que s’instal·len amb el paquet nginx d’ubuntu. Per obtenir més informació sobre aquests paràmetres, consulteu la documentació oficial Nginx (en anglès).

Després d’utilitzar l’ordre ./configure, executeu l’ordre make per tal d’executar una sèrie de tasques definides al Makefile per crear el programa des del codi font.

make
sudo make install

Alternativament, en compte de compilar directament, podeu crear un paquet DEB per al vostre sistema, escrivint l’ordre següent:

sudo checkinstall

En aquest moment tindreu una versió compilada de Nginx amb el mòdul NAXSI. Per tal d’aconseguir que NAXSI comenci a bloquejar el trànsit no desitjat, heu d’establir un conjunt de regles per a que NAXSI ho puga fer. 


Configuració NAXSI

La part més important del funcionament d’un tallafocs són les seues regles, que determinen la manera com es bloquegen les sol·licituds del servidor. El conjunt bàsic de regles de NAXSI s’anomenen “core rules”. Aquestes regles estan pensades per cercar patrons en parts d’una sol·licitud i filtrar les que poden ser atacs. Aquestes regles bàsiques (“core”) s’apliquen de forma global al servidor.

Per configurar Nginx per utilitzar aquestes regles “core”, copieu el fitxer naxsi_core.rules al directori de configuració d’Nginx.

sudo cp ~/naxsi/naxsi_config/naxsi_core.rules /etc/nginx/

Ara que s’han establert les regles “core”, afegiu les regles bàsiques de Naxsi, que permeten i implementen les regles “core” de manera localitzada i assigneu les accions que hauria de fer el servidor quan una sol·licitud d’URL no satisfà les regles “core”. Creeu un fitxer anomenat naxsi.rules dins del directori /etc/nginx/. Per fer-ho, utilitzeu la següent ordre per obrir el fitxer a l’editor de text nano o utilitzeu l’editor de text que vullgueu.

sudo nano /etc/nginx/naxsi.rules

Afegiu el següent codi que defineix algunes regles bàsiques del tallafocs.

LearningMode; # Mode aprenentatge activat
SecRulesEnabled;
DeniedUrl "/error.html";

## Check for all the rules
CheckRule "$SQL >= 8" BLOCK;
CheckRule "$RFI >= 8" BLOCK;
CheckRule "$TRAVERSAL >= 4" BLOCK;
CheckRule "$EVADE >= 4" BLOCK;
CheckRule "$XSS >= 8" BLOCK;

El codi anterior defineix DeniedUrl, que és l’URL que NAXSI redirigirà quan es bloqueja una sol·licitud. El fitxer també permet una llista de comprovació dels diferents tipus d’atacs que hauria de bloquejar NAXSI, incloent la injecció SQL, Cross-site scripting (XSS) i la inclusió remota de fitxers (RFI). Un cop afegit el codi precedent al fitxer, deseu i eixiu de l’editor de text.

Com que heu redirigit les sol·licituds bloquejades a /error.html, ara podeu crear un fitxer error.html al directori /usr/share/nginx/html per proporcionar aquesta destinació. Obriu el fitxer al vostre editor de text:

sudo nano /usr/share/nginx/html/error.html

A continuació, afegiu el següent codi HTML al fitxer per fer una pàgina web que permeta a l’usuari saber que la seua sol·licitud ha sigut bloquejada:

<html>
  <head>
    <title>Blocked By NAXSI</title>
  </head>
  <body>
    <div style="text-align: center">
      <h1>Malicious Request</h1>
      <hr>
      <p>This Request Has Been Blocked By NAXSI.</p>
    </div>
  </body>
</html>

Desa el fitxer i ix de l’editor.

A continuació, obriu el fitxer de configuració Nginx /etc/nginx/nginx.conf :

sudo nano /etc/nginx/nginx.conf

Ara heu d’inserir unes línies de codi a la secció http del fitxer nginx.conf per a que el servidor NGINX sapiga utilitzar NAXSI:

include /etc/nginx/naxsi_core.rules;    

A continuació, a la secció location / del mateix fitxer o altre que hageu configurat per al vostre servidor, heu d’afegir la línia de codi de més avall. Teniu en compte que si teniu diversos serveis web o subdominis en arxius de configuració diferents també s’hauria d’afegir a cadascun d’ells.

include /etc/nginx/naxsi.rules;

Ara que heu configurat Nginx amb les regles bàsiques per a NAXSI, el tallafocs bloquejarà les peticions malicioses que puguen arribar al servidor web. En realitat, també bloquejarà altres peticions legítimes, per aquesta raó és molt important configurar regles personalitzades per a cada servei web que tingueu instal·lat. 


Creació de regles personalitzades per a NAXSI

Naxi requereix un procés “d’aprenentatge” per poder distingir algunes peticions legítimes de les malicioses. Per exemple, per a un servei web com wordpress necessitarem crear un arxiu de configuració amb les regles específiques per a que el lloc funcione correctament.

Quan vaig configurar les regles per aquest lloc vaig utilitzar aquestes regles (wordpress.rules) com a punt de partida. És una plantilla confeccionada pels mateixos desenvolupadors de NAXSI. Després d’un procés d’aprenentatge vaig afegir algunes línies de codi ja que hi havia peticions legítimes que eren bloquejades pel servidor. Aleshores, heu de crear un altre arxiu amb regles personalitzades per al vostre lloc o servei web. Per exemple, podeu crear un nou arxiu on afegireu les regles personalitzades per a wordpress:

sudo nano /etc/nginx/wordpress.rules

Copieu el contingut de la plantilla següent: wordpress.rules a l’arxiu creat amb el mateix nom. Desem i tanquem l’arxiu. 

Ara heu d’afegir les regles personalitzades al vostre arxiu de configuració d’nginx al bloc location /, (de la mateixa manera que ho havíeu fet amb les regles naxsi.rules):

include /etc/nginx/wordpress.rules;

El més recomanable és activar el mode d’aprenentatge (LearningMode) i després d’un temps, revisar el registres d’errors del servidor. Si hi ha peticions que puguem identificar com vàlides, podem crear noves regles per evitar que siguen bloquejades. Tingueu en compte que amb el mode d’aprenentatge activat qualsevol petició al servidor identificada com a maliciosa no es bloquejada, només serà registrada.

El mateix paquet NAXSI inclou un eina per a poder automatitzar la creació de noves regles per al tallafocs, però no és la que vos propose utilitzar. Vos propose una altra, que al meu parer, és més senzilla: nxutil.

El creador de l’eina ho explica al seu blog: https://vpsfix.com/9114/analyze-naxsi-logs-create-whitelist-rules-nxutil/  (en anglès).

Instal·lació nxutil

Entreu a la carpeta /opt:

cd /opt

Després heu de clonar nxutil des dels repositoris de Github. Heu de tenir instal·lat l’eina git al vostre sistema, si no la teniu instal·lada teclegeu: sudo apt install git

git clone https://github.com/prajal/nxutil.git

Entreu a la carpeta creada nxutil:

cd nxutil

Instal·leu l’eina nxutil amb permisos de superusuari:

sudo python setup.py install

Creació de llistes blanques (withelist) amb nxutil

L’eina nxutil analitza els registres d’error d’nginx i crea regles optimitzades per al vostre lloc o servei web. Per a utilitzar-la, aneu al terminal i introduïu la següent ordre:

sudo python nx_util.py -l /var/log/nginx/error.log -o -p 1

El programa, si troba registres, generarà unes regles optimitzades que podeu afegir al vostre arxiu wordpress.rules. Podeu veure un exemple, més avall:

Exemple de regles creades amb nxutil

Editem el nostre arxiu wordpress.rules amb les noves regles, desem i guardem l’arxiu:

sudo nano /etc/nginx/wordpress.rules

Finalment, comprovem que no hi hagen error als arxius de configuració d’nginx amb:

sudo nginx -t

Si tot és correcte, apareix el següent missatge:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Queda recarregar canvis i reiniciar el servidor NGINX:

sudo service nginx reload
sudo service nginx restart

Si teniu algun problema amb el vostre web comproveu que NAXSI no estiga bloquejant peticions, podeu tornar a utilitzar l’eina nxutil per afegir noves regles.

Prova de funcionament

Podeu comprovar que, efectivament, NAXSI bloqueja peticions malicioses amb les següents ordres (heu de canviar ip_servidor per la IP pública del vostre servidor o la direcció del servei web):

curl 'http://ip_servidor/?q="><script>alert(0)</script>'
curl 'http://ip_servidor/?q=1" or "1"="1"'

Després comprovem els error amb:

tail -f /var/log/nginx/error.log

Vos eixirà un missatge semblant a aquest:

2019/11/09 17:55:48 [error] 6284#6284: *35 NAXSI_FMT: ip=192.168.1.1&server=exemple.com&uri=/&vers=0.56&total_processed=10&total_blocked=1&config=learning&cscore0=$SQL&score0=42&cscore1=$XSS&score1=40&zone0=ARGS&id0=1001&var_name0=q&zone1=ARGS&id1=1009&var_name1=q, client: 192.168.1.1, server: exemple.com, request: "GET /?q=1" or "1"="1" HTTP/2.0", host: "exemple.com"

Si després d’un temps de comprovacions, ja no teniu peticions legítimes bloquejades, podeu desactivar el mode d’aprenentatge de NAXSI (LearningMode), així, el vostre servidor quedarà protegit.

sudo nano /etc/nginx/naxsi.rules

Afegiu un # a la línia LearningMode, d’aquesta forma el mode d’aprenentatge quedarà desactivat. Deseu i tanqueu. Cada cop que feu canvis als arxius de configuració s’ha de reiniciar NGINX per a fer-los efectius, tal com us he explicat més amunt.

Enhorabona ja teniu el vostre servidor web protegit!!!

Publicat per dtalens

Professor. Amant de la tecnologia en general i especialment del món web.

Deixa un comentari

L'adreça electrònica no es publicarà.