Diferencia entre revisiones de «Como instalar WAF Naxsi en Nginx»

De Luis Moreno Wiki
Ir a la navegación Ir a la búsqueda
(Página creada con «Instalación de Nginx con Naxsi -- Agregar un usuario adduser lmoreno usermod -aG sudo lmoreno -- Instalar nginx sudo apt update sudo apt install nginx -- Ver los pe…»)
 
 
(No se muestran 2 ediciones intermedias del mismo usuario)
Línea 96: Línea 96:
  
 
  Poner el siguiente contenido
 
  Poner el siguiente contenido
 +
<pre>
 
   server {
 
   server {
 
           listen 80;
 
           listen 80;
Línea 109: Línea 110:
 
           }
 
           }
 
   }
 
   }
 
+
</pre>
 
-- Crear un symbolic link hacia sites enabled
 
-- Crear un symbolic link hacia sites enabled
 
  sudo ln -s /etc/nginx/sites-available/kolibers.com /etc/nginx/sites-enabled/
 
  sudo ln -s /etc/nginx/sites-available/kolibers.com /etc/nginx/sites-enabled/
Línea 138: Línea 139:
 
-- Personalizar error 404 y 50x
 
-- Personalizar error 404 y 50x
 
  Después de crear los htmls 400.html y 50x.hml agregar entro de la directiva server {} agregar las siguientes líneas:
 
  Después de crear los htmls 400.html y 50x.hml agregar entro de la directiva server {} agregar las siguientes líneas:
 
+
<pre>
 
         error_page 404 /404.html;
 
         error_page 404 /404.html;
 
         location = /404.html {
 
         location = /404.html {
Línea 148: Línea 149:
 
                 internal;
 
                 internal;
 
         }
 
         }
 +
</pre>
  
 
-- Optimizar SSL
 
-- Optimizar SSL
Línea 304: Línea 306:
 
  sudo vim /etc/nginx/nginx.conf  
 
  sudo vim /etc/nginx/nginx.conf  
  
user  www-data;
+
Y el contenido será algo como lo siguiente:
worker_processes  auto;
+
<pre>
pid /run/nginx.pid;
+
user  www-data;
include /etc/nginx/modules-enabled/*.conf;
+
worker_processes  auto;
 +
pid /run/nginx.pid;
 +
include /etc/nginx/modules-enabled/*.conf;
  
events {
+
events {
    worker_connections  1024;
+
    worker_connections  1024;
}
+
}
  
  
http {
+
http {
  
 
     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
 
     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
Línea 373: Línea 377:
  
  
}
+
}
 
+
</pre>
  
 
  sudo vim /etc/nginx/sites-available/kolibers.com
 
  sudo vim /etc/nginx/sites-available/kolibers.com
 
+
<pre>
server {
+
server {
 
+
        root /var/www/kolibers.com/html;
+
        root /var/www/kolibers.com/html;
        index index.html;
+
        index index.html;
 
+
        server_name kolibers.com www.kolibers.com;
+
        server_name kolibers.com www.kolibers.com;
 
+
        location / {
+
        location / {
                include /etc/nginx/naxsi.rules;
+
                include /etc/nginx/naxsi.rules;
                try_files $uri $uri/ =404;
+
                try_files $uri $uri/ =404;
        }
+
        }
 
+
#if ($request_method !~ ^(GET|HEAD|POST)$ ){
+
#if ($request_method !~ ^(GET|HEAD|POST)$ ){
#return 405;
+
#return 405;
#}
+
#}
 
+
 
     listen [::]:443 ssl ipv6only=on; # managed by Certbot
 
     listen [::]:443 ssl ipv6only=on; # managed by Certbot
 
     listen 443 ssl; # managed by Certbot
 
     listen 443 ssl; # managed by Certbot
Línea 405: Línea 409:
 
                 internal;
 
                 internal;
 
         }
 
         }
 
+
 
         error_page 500 502 503 504 /50x.html;
 
         error_page 500 502 503 504 /50x.html;
 
         location = /50x.html {
 
         location = /50x.html {
Línea 414: Línea 418:
 
add_header X-XSS-Protection "1; mode=block";
 
add_header X-XSS-Protection "1; mode=block";
  
}
+
}
 
 
server {
 
    if ($host = www.kolibers.com) {
 
        return 301 https://$host$request_uri;
 
    } # managed by Certbot
 
 
 
 
 
    if ($host = kolibers.com) {
 
        return 301 https://$host$request_uri;
 
    } # managed by Certbot
 
 
 
 
 
        listen 80;
 
        listen [::]:80;
 
 
 
        server_name kolibers.com www.kolibers.com;
 
    return 404; # managed by Certbot
 
 
 
  
 +
server {
 +
    if ($host = www.kolibers.com) {
 +
        return 301 https://$host$request_uri;
 +
    } # managed by Certbot
 +
 +
 +
    if ($host = kolibers.com) {
 +
        return 301 https://$host$request_uri;
 +
    } # managed by Certbot
 +
  
 +
        listen 80;
 +
        listen [::]:80;
  
}
+
        server_name kolibers.com www.kolibers.com;
 +
    return 404; # managed by Certbot
  
 +
}
 +
</pre>
 
-- crear el servicio  
 
-- crear el servicio  
 
  vim /lib/systemd/system/nginx.service
 
  vim /lib/systemd/system/nginx.service

Revisión actual del 17:08 30 mar 2022

Instalación de Nginx con Naxsi

-- Agregar un usuario

adduser lmoreno
usermod -aG sudo lmoreno

-- Instalar nginx

sudo apt update
sudo apt install nginx

-- Ver los perfiles de nginx

sudo ufw app list

Se verá la siguiente salida

Output
 Available applications:
   Nginx Full
   Nginx HTTP
   Nginx HTTPS
   OpenSSH

-- Habilitar las reglas principales

sudo ufw allow 'Nginx HTTP'
sudo ufw allow 'Nginx HTTP'
sudo ufw allow 'OpenSSH'

--- Habilitar el firewall

sudo ufw enable

-- Verificar el estado

sudo ufw status

Se verá una salida como la siguiente:


Status: active
To                         Action      From
--                         ------      ----
Nginx HTTP                 ALLOW       Anywhere                  
Nginx HTTPS                ALLOW       Anywhere                  
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP (v6)            ALLOW       Anywhere (v6)             
Nginx HTTPS (v6)           ALLOW       Anywhere (v6)             
OpenSSH (v6)               ALLOW       Anywhere (v6) 


-- Verificar el estado del servidor

systemctl status nginx

-- Administrar el servicio -- Iniciar el servicio

sudo systemctl start nginx

-- Detener el servicio

sudo systemctl stop nginx


-- Reinicar el servicio

sudo systemctl restart nginx

-- Después de hacer cambios y recargar

sudo systemctl reload nginx

-- Habilitar que el servicio se inicie al arrancar el sistema

sudo systemctl enable nginx

-- Deshabilitar el servicio para que no inicie automáticamente

sudo systemctl disable nginx

-- Crear un folder para almacenar los archivos

sudo mkdir -p /var/www/kolibers.com/html

-- Cambiar el owner del directorio

sudo chown -R www-data:www-data /var/www/kolibers.com/html


-- Crear archivo html de prueba

sudo vim /var/www/kolibers.com/html/index.html

Con un contenido similar al siguiente

 <html>
     <head>
         <title>Welcome to Example.com!</title>
     </head>
     <body>
         <h1>Success!  The example.com server block is working!</h1>
     </body>
 </html>

-- Editar el archivo de configuración del sitio

vim /etc/nginx/sites-available/kolibers.com
Poner el siguiente contenido
  server {
          listen 80;
          listen [::]:80;

          root /var/www/example.com/html;
          index index.html index.htm index.nginx-debian.html;
 
          server_name example.com www.example.com;
 
          location / {
                  try_files $uri $uri/ =404;
          }
  }

-- Crear un symbolic link hacia sites enabled

sudo ln -s /etc/nginx/sites-available/kolibers.com /etc/nginx/sites-enabled/


-- Editar el archivo nginx.conf

sudo vim /etc/nginx/nginx.conf

Buscar la línea siguiente y remover el # para evitar comentario

server_names_hash_bucket_size

-- Asegurarse que no hay errores de Syntaxis en los archivos de configuración

sudo nginx -t

-- Reiniciar el servicio

sudo systemctl restart nginx

-- los logs se encuentran en:

/var/log/nginx/access.log
/var/log/nginx/error.log

-- instalar certbot

sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

-- Personalizar error 404 y 50x

Después de crear los htmls 400.html y 50x.hml agregar entro de la directiva server {} agregar las siguientes líneas:
        error_page 404 /404.html;
        location = /404.html {
                internal;
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
                internal;
        }

-- Optimizar SSL Deshabilitar soporte para protocolos viejos e inseguros como TLSv1 y TLSv1.1 También desactivar ciphers inseguros

en el archivo

/etc/letsencrypt/options-ssl-nginx.conf

Cambiar las líneas:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;


ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";

Por las líneas:

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM";


-- Deshabilitar los tokens de nginx para evitar information disclosure, en el archivo

/etc/nginx/nginx.conf 

quitar el hash que indica que es un comentario pasaría de:

# server_tokens off;

a

server_tokens off;

Reiniciar nginx con

sudo service nginx restart

-- Las nuevas versiones de nginx por default solo aceptan headers seguros como GET, POST y HEAD los demás están desactivados por default

-- agregar X-Frame-Options para prevenir clickjacking attacks la opción debe estar dentro de la directiva server en el archivo de configuración del sitio ejemplo:

/etc/nginx/sites-available/kolibers.com

y la línea agregar sería:

add_header X-Frame-Options "sameorigin" always;

-- muy parecida a la anterior agregar header anti XSS, la opción debe estar dentro de la directiva server en el archivo de configuración del sitio ejemplo:

/etc/nginx/sites-available/kolibers.com

la opción esta vez es:

add_header X-XSS-Protection "1; mode=block";

-- Agregar naxsi WAF Primero hay que respaldar la configuración actual con el comando similar a:

sudo cp -a /etc/nginx/ /home/lmoreno/nginx.backup

Ahora hay que checar la versión de nginx

nginx -v

Dará una salida como por ejemplo:

nginx version: nginx/1.14.0 (Ubuntu)

Descargar nginx de acuerdo a tu versión

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

Descargar la versión más reciente de naxsi

wget https://github.com/nbs-system/naxsi/archive/master.zip

Descomprimir los archivos con

tar -xvzf nginx-1.14.0.tar.gz
unzip master.zip

Verificar todos los módulos instalados en el sistema

nginx -V

Se verá algo como lo siguiente:

nginx version: nginx/1.14.0 (Ubuntu)
built with OpenSSL 1.1.1  11 Sep 2018
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fdebug-prefix-map=/build/nginx-GkiujU/nginx-1.14.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module

Detener el servicio

sudo service nginx stop


-- remover nginx Remueve todo excepto los archivos de configuración

sudo apt-get remove nginx nginx-common

Remueve todo

sudo apt-get purge nginx nginx-common

Después de ejecutar alguno de los comandos anteriores removerá dependencias sudo apt-get autoremove


-- instalar nxsi con nginx Instalar dependencias

sudo apt install libpcre3-dev libssl-dev unzip build-essential daemon libxml2-dev libxslt1-dev libgd-dev libgeoip-dev

-- Descargar la versión estable de nginx por ejemplo en agusto 1 2020 era la 1.19.1

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

-- Descomprimir nginx

tar xzf nginx-1.15.8.tar.gz

-- Descargar la última versión de naxsi

wget https://github.com/nbs-system/naxsi/archive/master.zip

-- Descomprimir naxsi

unzip master.zip

- Entrar al folder de nginx para compilar

cd nginx-1.19.1

-- Establecer los parámetros de configuración por ejemplo, para compilar debes estar firmado como root

./configure \
--conf-path=/etc/nginx/nginx.conf \
--add-module=../naxsi-master/naxsi_src/ \
--error-log-path=/var/log/nginx/error.log \
--http-client-body-temp-path=/var/lib/nginx/body \
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
--http-log-path=/var/log/nginx/access.log \
--http-proxy-temp-path=/var/lib/nginx/proxy \
--lock-path=/var/lock/nginx.lock \
--pid-path=/var/run/nginx.pid \
--user=www-data \
--group=www-data \
--with-http_ssl_module \
--without-mail_pop3_module \
--without-mail_smtp_module \
--without-mail_imap_module \
--without-http_uwsgi_module \
--without-http_scgi_module \
--prefix=/usr

-- si todo salió bien puedes ejecutar el comando

make 

y posteriormente

make install

-- crear los directorios de las dynamic data libraries

sudo mkdir -p /var/lib/nginx/{body,fastcgi}

-- configurar NAXSI -- Copiar las reglas

cp /home/lmoreno/naxsi-master/naxsi_config/naxsi_core.rules /etc/nginx/

-- crear el archivo de reglas

vim /etc/nginx/naxsi.rules

y poner un contenido como el siguiente

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

-- modificar los archivos de configuración para incluir las reglas de naxsi

sudo vim /etc/nginx/nginx.conf 

Y el contenido será algo como lo siguiente:

 user  www-data;
 worker_processes  auto;
 pid /run/nginx.pid;
 include /etc/nginx/modules-enabled/*.conf;

 events {
     worker_connections  1024;
 }


 http {

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout  65;
    types_hash_max_size 2048;
    server_tokens off;
   
    server_names_hash_bucket_size 64;

    include /etc/nginx/mime.types;
    include /etc/nginx/naxsi_core.rules;
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    default_type application/octet-stream;

       ##
       # SSL Settings
       ##

       ssl_protocols TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
       ssl_prefer_server_ciphers on;

       ##
       # Logging Settings
       ##

       access_log /var/log/nginx/access.log;
       error_log /var/log/nginx/error.log;

       ##
       # Gzip Settings
       ##

       gzip on;

       # 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/javascript text/xml application/xml application/xml+rss text/javascript;

       ##
       # Virtual Host Configs
       ##


 }
sudo vim /etc/nginx/sites-available/kolibers.com
 server {
 
         root /var/www/kolibers.com/html;
         index index.html;
 
         server_name kolibers.com www.kolibers.com;
 
         location / {
                 include /etc/nginx/naxsi.rules;
                 try_files $uri $uri/ =404;
         }
 
 	 #if ($request_method !~ ^(GET|HEAD|POST)$ ){
 	 #return 405;
 	 #}
 
    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/kolibers.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/kolibers.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
    
        error_page 404 /404.html;
        location = /404.html {
                internal;
        }
 
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
                internal;
        }
	
	add_header X-Frame-Options "sameorigin" always;
	add_header X-XSS-Protection "1; mode=block";

 }

 server {
     if ($host = www.kolibers.com) {
         return 301 https://$host$request_uri;
     } # managed by Certbot
 
 
     if ($host = kolibers.com) {
         return 301 https://$host$request_uri;
     } # managed by Certbot
 

         listen 80;
         listen [::]:80;

         server_name kolibers.com www.kolibers.com;
     return 404; # managed by Certbot

 }

-- crear el servicio

vim /lib/systemd/system/nginx.service

y poner un contenido como el siguiente:

[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=man:nginx(8)
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

-- iniciar el servicio

systemctl start nginx

Otros recursos

https://github.com/prajal/nxutil