Diferencia entre revisiones de «Como instalar WAF Naxsi en Nginx»
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 305: | Línea 307: | ||
Y el contenido será algo como lo siguiente: | Y el contenido será algo como lo siguiente: | ||
− | + | <pre> | |
user www-data; | user www-data; | ||
worker_processes auto; | worker_processes auto; | ||
Línea 376: | Línea 378: | ||
} | } | ||
− | + | </pre> | |
sudo vim /etc/nginx/sites-available/kolibers.com | sudo vim /etc/nginx/sites-available/kolibers.com | ||
− | + | <pre> | |
server { | server { | ||
Línea 436: | Línea 438: | ||
} | } | ||
− | + | </pre> | |
-- crear el servicio | -- crear el servicio | ||
vim /lib/systemd/system/nginx.service | vim /lib/systemd/system/nginx.service |
Revisión actual del 16: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