GNU/Linux >> Tutoriales Linux >  >> Debian

Cómo configurar ModSecurity con Nginx en Debian/Ubuntu

Este tutorial le mostrará cómo instalar y usar ModSecurity con Nginx en servidores Debian/Ubuntu. ModSecurity es el cortafuegos de aplicaciones web de código abierto más conocido (WAF), que brinda protección integral para sus aplicaciones web (como WordPress, Nextcloud, Ghost, etc.) contra una amplia gama de ataques de Capa 7 (HTTP), como inyección SQL, secuencias de comandos entre sitios e inclusión de archivos locales.

Nota :Este tutorial funciona en todas las versiones actuales de Debian y Ubuntu, incluidas Debian 10, Ubuntu 18.04, Ubuntu 20.04 y Ubuntu 20.10.

Las aplicaciones web son intrínsecamente inseguras. Si es un administrador de WordPress, probablemente escuchará noticias de piratas informáticos que explotan vulnerabilidades en los complementos y temas de WordPress de vez en cuando. Es esencial que implemente un WAF en su servidor web, especialmente cuando tiene aplicaciones antiguas que no reciben actualizaciones. ModSecurity fue creado originalmente por Ivan Ristić en 2002, actualmente mantenido por Trustwave SpiderLabs. Es el WAF más implementado del mundo, utilizado por más de un millón de sitios web. cPanel, el panel de control de alojamiento más utilizado, incluye ModSecurity como su WAF.

Es posible que haya escuchado otros firewalls basados ​​en host como iptables, UFW y Firewalld, etc. La diferencia es que funcionan en las capas 3 y 4 del modelo OSI y toman medidas según la dirección IP y el número de puerto. ModSecurity, o firewalls de aplicaciones web en general, está especializado para centrarse en el tráfico HTTP (capa 7 del modelo OSI) y actúa en función del contenido de la solicitud y respuesta HTTP.

ModSeguridad 3

ModSecurity fue diseñado originalmente para el servidor web Apache. Podía funcionar con Nginx antes de la versión 3.0, pero tenía un rendimiento deficiente. ModSecurity 3.0 (también conocido como libmodsecurity ) se lanzó en 2017. Es un lanzamiento histórico, especialmente para los usuarios de Nginx, ya que es la primera versión que funciona de forma nativa con Nginx. La advertencia de ModSecurity 3 es que todavía no tiene todas las características de la versión anterior (2.9), aunque cada nueva versión agregará algunas de las características que faltan.

Paso 1:Instale la última versión de Nginx en Debian/Ubuntu

ModSecurity se integra con Nginx como un módulo dinámico, lo que le permite compilar el código fuente de módulos individuales sin compilar Nginx.

El binario de Nginx debe compilarse con --with-compat argumento, que hará que los módulos dinámicos sean compatibles con su binario Nginx existente. Sin embargo, no todos los binarios de Nginx enviados desde el repositorio predeterminado de Debian/Ubuntu se compilan con el --with-compat argumento. Para facilitar las cosas, podemos instalar la última versión de Nginx desde ondrej/nginx-mainline PPA, que es mantenido por un desarrollador de Debian.

Nota :El repositorio nginx.org también proporciona la última versión de Nginx. Sin embargo, el ondrej/nginx-mainline PPA proporciona módulos dinámicos adicionales que pueden resultarle útiles, como el módulo Brotli.

Ubuntu

Si usa Ubuntu 16.04, 18.04, 20.04 o 20.10, ejecute los siguientes comandos para instalar la última versión de Nginx.

sudo add-apt-repository ppa:ondrej/nginx-mainline -y
sudo apt update
sudo apt install nginx-core nginx-common nginx nginx-full

Durante el proceso de instalación, puede indicarle que el distribuidor del paquete envió una versión actualizada del archivo de configuración principal. Se recomienda presionar n para mantener su versión actual. Siempre puedes examinar la diferencia más tarde.

De forma predeterminada, solo está habilitado el repositorio binario. También necesitamos habilitar el repositorio de código fuente para poder descargar el código fuente de Nginx. Edite el archivo del repositorio principal de Nginx.

sudo nano /etc/apt/sources.list.d/ondrej-ubuntu-nginx-mainline-*.list

Encuentra la línea que comienza con # deb-src .

# deb-src http://ppa.launchpad.net/ondrej/nginx-mainline/ubuntu/ focal main

Eliminar el # carácter para habilitar este repositorio de código fuente.

deb-src http://ppa.launchpad.net/ondrej/nginx-mainline/ubuntu/ focal main

Guarde y cierre el archivo. Luego actualice el índice del repositorio.

sudo apt update

Debian

Si usa Debian 10 o Debian 11, ejecute los siguientes comandos para instalar la última versión de Nginx.

curl -sSL https://packages.sury.org/nginx-mainline/README.txt | sudo bash -x
sudo apt update 
sudo apt install nginx-core nginx-common nginx nginx-full

Durante el proceso de instalación, puede indicarle que el distribuidor del paquete envió una versión actualizada del archivo de configuración principal. Se recomienda presionar n para mantener su versión actual. Siempre puedes examinar la diferencia más tarde.

De forma predeterminada, solo está habilitado el repositorio binario. También necesitamos habilitar el repositorio de código fuente para poder descargar el código fuente de Nginx. Edite el archivo del repositorio principal de Nginx.

sudo nano /etc/apt/sources.list.d/nginx-mainline.list

Debería encontrar una sola línea que habilite el repositorio binario de Nginx. Agregue la siguiente línea para habilitar el repositorio de código fuente de Nginx en Debian 10.

deb-src https://packages.sury.org/nginx-mainline/ buster main

Si usa Debian 11, agregue la siguiente línea en su lugar.

deb-src https://packages.sury.org/nginx-mainline/ bullseye main

Guarde y cierre el archivo. Luego actualice el índice del repositorio.

sudo apt update

Comprobación de los argumentos de configuración de Nginx

Ahora verifique los argumentos de configuración de Nginx con el siguiente comando:

sudo nginx -V

Todos los archivos binarios de Nginx en el PPA se compilan con --with-compat argumento.

Paso 2:Descargue el paquete fuente de Nginx

Aunque no necesitamos compilar Nginx en sí, necesitamos el paquete de código fuente de Nginx para compilar el módulo dinámico ModSecurity. Ejecute el siguiente comando para hacer un nginx directorio bajo /usr/local/src/ para almacenar el paquete de código fuente de Nginx. Reemplazar username con tu nombre de usuario real.

sudo chown username:username /usr/local/src/ -R 

mkdir -p /usr/local/src/nginx

cd en el directorio fuente de Nginx.

cd /usr/local/src/nginx/

Descargue el paquete fuente de Nginx con los siguientes comandos:

sudo apt install dpkg-dev

apt source nginx

Si ve el siguiente mensaje de advertencia, puede ignorarlo con seguridad.

W: Download is performed unsandboxed as root as file 'nginx_1.19.5.orig.tar.gz' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)

Consulte los archivos de código fuente descargados.

ls

Salida de muestra:

nginx-1.19.5
nginx_1.19.5-3+ubuntu20.04.1+deb.sury.org+1.debian.tar.xz
nginx_1.19.5-3+ubuntu20.04.1+deb.sury.org+1.dsc
nginx_1.19.5.orig.tar.gz

Asegúrese de que la versión del código fuente sea la misma que su versión binaria de Nginx (sudo nginx -v ).

Paso 3:Instalar libmodsecurity3

libmodseguridad es la biblioteca ModSecurity que realmente hace el filtrado HTTP para sus aplicaciones web. En Debian 10 y Ubuntu 20.04, 20.10, puede instalarlo con sudo apt install libmodsecurity3 , pero te recomiendo que lo compiles desde la fuente.

Para compilar libmodsecurity , primero clona el código fuente de Github.

sudo apt install git

git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity /usr/local/src/ModSecurity/

cd /usr/local/src/ModSecurity/

Instalar dependencias de compilación.

sudo apt install gcc make build-essential autoconf automake libtool libcurl4-openssl-dev liblua5.3-dev libfuzzy-dev ssdeep gettext pkg-config libpcre3 libpcre3-dev libxml2 libxml2-dev libcurl4 libgeoip-dev libyajl-dev doxygen

Instale los submódulos necesarios.

git submodule init

git submodule update

Configure el entorno de compilación.

./build.sh 

./configure

Si ve el siguiente error, puede ignorarlo.

fatal: No names found, cannot describe anything.

Compile el código fuente con el siguiente comando. Por defecto, make utilizará sólo un núcleo de CPU. Tengo 4 núcleos de CPU en mi servidor, así que especifico 4 trabajos (-j4 ) para make para acelerar el proceso de compilación. Cambiar 4 a su propia cantidad de núcleos de CPU.

make -j4

Después de make comando terminado sin errores, instale el binario.

sudo make install

Se instalará en /usr/local/modsecurity/ directorio.

Resolución de errores de compilación

error n.º 1

Si ve el siguiente error al ejecutar make comando, es probable que su servidor no tenga RAM.

g++: internal compiler error: Killed (program cc1plus)

Las siguientes líneas en /var/log/syslog El archivo indica que el servidor no tiene memoria, así que considere actualizar las especificaciones del servidor.

Alternativamente, puede crear un espacio de intercambio para resolver el problema de falta de memoria. Sin embargo, solo debe usarse como una medida temporal. El uso de espacio de intercambio en servidores SSD puede ser perjudicial para el rendimiento del sistema.

error n.º 2

Si ve el siguiente error al compilar ModSecurity,

utils/geo_lookup.cc: In member function ‘bool modsecurity::Utils::GeoLookup::lookup(const string&, modsecurity::Transaction*, std::function<bool(int, const std::__cxx11::basic_string<char>&)>) const’:
utils/geo_lookup.cc:124:32: error: invalid conversion from ‘const MMDB_s*’ to ‘MMDB_s*’ [-fpermissive]
r = MMDB_lookup_string(&mmdb, target.c_str(), &gai_error, &mmdb_error);

Probablemente se deba a que instaló una versión obsoleta de libmaxminddb-dev . Puede eliminar este paquete.

sudo apt remove libmaxminddb-dev

E instale libgeoip-dev , que es una alternativa a libmaxminddb-dev .

sudo apt install libgeoip-dev

Luego vuelva a compilar ModSecurity.

make clean

./configure

make -j4

Instale el binario.

sudo make install

Paso 4:Descargue y compile el código fuente del conector ModSecurity v3 Nginx

El conector ModSecurity Nginx enlaces libmodsecurity al servidor web Nginx. Clone el repositorio ModSecurity v3 Nginx Connector Git.

git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git /usr/local/src/ModSecurity-nginx/

Asegúrese de estar en el directorio fuente de Nginx.

cd /usr/local/src/nginx/nginx-1.19.5/

Instale dependencias de compilación para Nginx.

sudo apt build-dep nginx

sudo apt install uuid-dev

A continuación, configure el entorno con el siguiente comando. No compilaremos Nginx en sí, pero compilaremos el ModSecurity Nginx Connector módulo solamente. El --with-compat flag hará que el módulo sea compatible con su binario Nginx existente.

./configure --with-compat --add-dynamic-module=/usr/local/src/ModSecurity-nginx

Cree el Conector ModSecurity Nginx módulo.

make modules

El módulo se guardará como objs/ngx_http_modsecurity_module.so . Cópielo en /usr/share/nginx/modules/ directorio.

sudo cp objs/ngx_http_modsecurity_module.so /usr/share/nginx/modules/

Paso 5:Cargue el módulo conector ModSecurity v3 Nginx

Edite el archivo de configuración principal de Nginx.

sudo nano /etc/nginx/nginx.conf

Agregue la siguiente línea al principio del archivo.

load_module modules/ngx_http_modsecurity_module.so;

Además, agregue las siguientes dos líneas en el http {...} sección, por lo que ModSecurity se habilitará para todos los hosts virtuales de Nginx.

modsecurity on;
modsecurity_rules_file /etc/nginx/modsec/main.conf;

Guarde y cierre el archivo. A continuación, cree el /etc/nginx/modsec/ directorio para almacenar la configuración de ModSecurity

sudo mkdir /etc/nginx/modsec/

Luego copie el archivo de configuración de ModSecurity.

sudo cp /usr/local/src/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf

Edite el archivo.

sudo nano /etc/nginx/modsec/modsecurity.conf

Busque la siguiente línea.

SecRuleEngine DetectionOnly

Esta configuración le dice a ModSecurity que registre las transacciones HTTP, pero no realiza ninguna acción cuando se detecta un ataque. Cámbielo a lo siguiente, para que ModSecurity detecte y bloquee los ataques web.

SecRuleEngine On

Luego busque la siguiente línea (línea 224), que le indica a ModSecurity qué información debe incluirse en el registro de auditoría.

SecAuditLogParts ABIJDEFHZ

Sin embargo, la configuración predeterminada es incorrecta. Sabrá por qué más adelante cuando explique cómo entender los registros de ModSecurity. La configuración debe cambiarse a la siguiente.

SecAuditLogParts ABCEFHJKZ

Si tiene un sitio web de codificación, es posible que desee deshabilitar la inspección del cuerpo de respuesta; de lo contrario, podría obtener errores prohibidos 403 simplemente cargando una página web con mucho contenido de código.

SecResponseBodyAccess Off

Guarde y cierre el archivo. A continuación, cree el /etc/nginx/modsec/main.conf archivo.

sudo nano /etc/nginx/modsec/main.conf

Agregue la siguiente línea para incluir el /etc/nginx/modsec/modsecurity.conf archivo.

Include /etc/nginx/modsec/modsecurity.conf

Guarde y cierre el archivo. También necesitamos copiar el archivo de mapeo Unicode.

sudo cp /usr/local/src/ModSecurity/unicode.mapping /etc/nginx/modsec/

Luego pruebe la configuración de Nginx.

sudo nginx -t

Si la prueba es exitosa, reinicie Nginx.

sudo systemctl restart nginx

Paso 6:habilitar el conjunto de reglas básicas de OWASP

Para que ModSecurity proteja sus aplicaciones web, debe definir reglas para detectar actores maliciosos y bloquearlos. Para los principiantes, es una buena idea instalar conjuntos de reglas existentes, para que pueda comenzar rápidamente y luego aprender los detalles más importantes en el camino. Hay varios conjuntos de reglas gratuitos para ModSecurity. El conjunto de reglas básicas de OWASP (CRS) es el conjunto de reglas estándar utilizado con ModSecurity.

  • Es gratuito, mantenido por la comunidad y el conjunto de reglas más utilizado que proporciona una configuración predeterminada vendida para ModSecurity.
  • Contiene reglas para ayudar a detener los vectores de ataque comunes, incluida la inyección SQL (SQLi), las secuencias de comandos entre sitios (XSS) y muchos otros.
  • Puede integrarse con Project Honeypot.
  • También contiene reglas para detectar bots y escáneres.
  • Se ha ajustado a través de una amplia exposición para tener muy pocos falsos positivos.

Descargue el último OWASP CRS de GitHub.

wget https://github.com/coreruleset/coreruleset/archive/v3.3.0.tar.gz

Extraiga el archivo.

tar xvf v3.3.0.tar.gz

Mueva el directorio a /etc/nginx/modsec/ .

sudo mv coreruleset-3.3.0/ /etc/nginx/modsec/

Cambie el nombre de crs-setup.conf.example archivo.

sudo mv /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf.example /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf

Luego edite el archivo de configuración principal.

sudo nano /etc/nginx/modsec/main.conf

Agregue las siguientes dos líneas, lo que hará que Nginx incluya el archivo de configuración de CRS y las reglas individuales.

Include /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf
Include /etc/nginx/modsec/coreruleset-3.3.0/rules/*.conf

Guarde y cierre el archivo. Luego pruebe la configuración de Nginx.

sudo nginx -t

Si la prueba es exitosa, reinicie Nginx.

sudo systemctl restart nginx

Paso 7:Aprenda cómo funciona OWASP CRS

Echemos un vistazo al archivo de configuración de CRS, que le proporciona una buena documentación sobre cómo funciona CRS.

sudo nano /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf

Puede ver que OWASP CRS puede ejecutarse en dos modos:

  • modo independiente . Este es el modo tradicional utilizado en CRS v2.x. Si una solicitud HTTP coincide con una regla, ModSecurity bloqueará la solicitud HTTP inmediatamente y dejará de evaluar las reglas restantes.
  • modo de puntuación de anomalías . Este es el modo predeterminado que se usa en CRS v3.x. ModSecurity comparará una solicitud HTTP con todas las reglas y agregará una puntuación a cada regla coincidente. Si se alcanza un umbral, la solicitud HTTP se considera un ataque y se bloqueará. La puntuación predeterminada para las solicitudes entrantes es 5 y para la respuesta saliente es 4.

Cuando se ejecuta en el modo de puntuación de anomalías, hay 4 niveles de paranoia.

  • Paranoia nivel 1 (predeterminado)
  • Paranoia nivel 2
  • Paranoia nivel 3
  • Paranoia nivel 4

Con cada aumento del nivel de paranoia, el CRS habilita reglas adicionales que le brindan un mayor nivel de seguridad. Sin embargo, los niveles más altos de paranoia también aumentan la posibilidad de bloquear tráfico legítimo debido a falsas alarmas.

Estos son los dos conceptos básicos que debe comprender antes de utilizar el CRS. Ahora podemos cerrar el archivo. Las reglas individuales de CRS se almacenan en /etc/nginx/modsec/coreruleset-3.3.0/rules/ directorio. Cada regla coincidente aumentará la puntuación de anomalía.

Paso 8:Prueba

Para verificar si ModSecurity está funcionando, puede lanzar un simple ataque de inyección SQL en su propio sitio web. (Tenga en cuenta que es ilegal realizar pruebas de seguridad en los sitios web de otras personas sin autorización). Ingrese la siguiente URL en su navegador web.

https://yourdomain.com/?id=3 or 'a'='a'

Si ModSecurity funciona correctamente, su servidor web Nginx debería devolver un mensaje de error 403 prohibido.

El navegador Firefox puede no mostrar el mensaje de error 403. Puedes presionar Ctrl+Shift+I para abrir la ventana de herramientas para desarrolladores y seleccionar la network pestaña. Luego presione F5 para recargar la página web. Ahora debería ver el código de error 403 en Firefox.

Si ModSecurity se ejecuta en DetectionOnly modo, no bloqueará este ataque de inyección SQL.

Paso 9:comprensión de los registros de ModSecurity

Es importante analizar los registros de ModSecurity, para que sepa qué tipo de ataques se dirigen a sus aplicaciones web y tome mejores medidas para defenderse de los actores de amenazas. Existen principalmente dos tipos de registros en ModSecurity:

  • registro de depuración:deshabilitado por defecto.
  • registro de auditoría:/var/log/modsec_audit.log

Para comprender los registros de auditoría de ModSecurity, debe conocer las 5 fases de procesamiento en ModSecurity, que son:

  • Fase 1:inspeccionar los encabezados de las solicitudes
  • Fase 2:Inspeccionar el cuerpo de la solicitud
  • Fase 3:inspeccionar los encabezados de respuesta
  • Fase 4:inspeccionar el cuerpo de respuesta
  • Fase 5:Acción (registro/bloqueo de solicitudes maliciosas)

También son dos tipos de archivos de registro.

  • Serie :un archivo para todos los registros. Este es el valor predeterminado.
  • Concurrente :varios archivos para iniciar sesión. Esto puede proporcionar un mejor rendimiento de escritura. Si nota que sus páginas web se ralentizan después de habilitar ModSecurity, puede optar por utilizar el tipo de registro simultáneo.

Los eventos en el registro se dividen en varias secciones.

  • sección A:encabezado del registro de auditoría
  • sección B:encabezado de solicitud
  • sección C:cuerpo de la solicitud
  • sección D:reservada
  • sección E:organismo de respuesta intermediario
  • sección F:encabezados de respuesta final
  • sección G:reservada
  • sección H:avance del registro de auditoría
  • sección I:cuerpo de solicitud compacto alternativo, que excluye archivos
  • sección J:información sobre los archivos cargados
  • sección K:todas las reglas coincidentes con un evento, en orden de coincidencia
  • sección Z:límite final

Si ejecuta un sitio web de alto tráfico, el registro de auditoría de ModSecurity puede volverse demasiado grande muy rápidamente, por lo que debemos configurar la rotación de registros para el registro de auditoría de ModSecurity. Cree un archivo de configuración logrotate para ModSecurity.

sudo nano /etc/logrotate.d/modsecurity

Agregue las siguientes líneas a este archivo.

/var/log/modsec_audit.log
{
        rotate 14
        daily
        missingok
        compress
        delaycompress
        notifempty
}

Esto rotará el archivo de registro todos los días (diariamente ), comprimiendo versiones antiguas (compress ). Los 14 archivos de registro anteriores se mantendrán (rotar 14 ), y no se producirá ninguna rotación si el archivo está vacío (notifempty ). Guarde y cierre el archivo.

Si su registro de ModSecurity está vacío, tal vez necesite reiniciar Nginx.

sudo systemctl restart nginx

Paso 10:Manejo de falsos positivos

ModSecurity es un firewall de aplicaciones web genérico y no está diseñado para una aplicación web específica. El conjunto de reglas básicas de OWASP también es un conjunto de reglas genérico sin una aplicación en particular en mente, por lo que es probable que vea falsos positivos después de habilitar ModSecurity y OWASP CRS. Si aumentas el nivel de paranoia en el CRS, habrá más falsos positivos.

Por ejemplo, de forma predeterminada, el CRS prohíbe la inyección de comandos de Unix como ingresar sudo en una página web, que es bastante común en mi blog. Para eliminar los falsos positivos, debe agregar exclusiones de reglas al CRS.

Exclusiones de reglas específicas de la aplicación

Hay algunas exclusiones preconstruidas específicas de la aplicación que se envían con OWASP CRS. Edite el crs-setup.conf archivo.

sudo nano /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf

Vaya a Exclusiones de reglas específicas de la aplicación sección y busque las siguientes líneas.

#SecAction \
# "id:900130,\
#  phase:1,\
#  nolog,\
#  pass,\
#  t:none,\
#  setvar:tx.crs_exclusions_cpanel=1,\
#  setvar:tx.crs_exclusions_drupal=1,\
#  setvar:tx.crs_exclusions_dokuwiki=1,\
#  setvar:tx.crs_exclusions_nextcloud=1,\
#  setvar:tx.crs_exclusions_wordpress=1,\
#  setvar:tx.crs_exclusions_xenforo=1"

Por ejemplo, si quiero habilitar las exclusiones de WordPress, las líneas anteriores deben cambiarse por las siguientes. Tenga cuidado con la sintaxis. No debe haber comentarios entre t:none,\ y setvar:tx.crs_exclusions_wordpress=1" . (La barra invertida \ carácter al final indica que la siguiente línea es una continuación de la línea actual.)

SecAction \
  "id:900130,\
   phase:1,\
   nolog,\
   pass,\
   t:none,\
   setvar:tx.crs_exclusions_wordpress=1"
#  setvar:tx.crs_exclusions_cpanel=1,\
#  setvar:tx.crs_exclusions_drupal=1,\
#  setvar:tx.crs_exclusions_dokuwiki=1,\
#  setvar:tx.crs_exclusions_nextcloud=1,\
#  setvar:tx.crs_exclusions_xenforo=1"

Guarde y cierre el archivo. Luego pruebe las configuraciones de Nginx.

sudo nginx -t

Si la prueba es exitosa, vuelva a cargar Nginx para que el cambio surta efecto.

sudo systemctl reload nginx

Tenga en cuenta que si tiene varias aplicaciones como (WordPress, Nextcloud, Drupal, etc.) instaladas en el mismo servidor, las exclusiones de reglas anteriores se aplicarán a todas las aplicaciones. Para minimizar los riesgos de seguridad, debe habilitar una regla de exclusión solo para una aplicación. Para hacerlo, vaya a /etc/nginx/modsec/coreruleset-3.3.0/rules/ directorio.

cd /etc/nginx/modsec/coreruleset-3.3.0/rules

Cambie el nombre de REQUEST-900-EXCLUSION-RULES-BEFORE-CRS archivo.

sudo mv REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf

Luego edite este archivo.

sudo nano REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf

Agregue la siguiente línea al final de este archivo. Si su WordPress está usando blog.yourdomain.com subdominio y el encabezado de solicitud enviado desde el navegador del visitante contiene este subdominio, luego ModSecurity aplicará las exclusiones de reglas para WordPress.

SecRule REQUEST_HEADERS:Host "@streq blog.yourdomain.com" "id:1000,phase:1,setvar:tx.crs_exclusions_wordpress=1"

Si ha instalado Nextcloud en el mismo servidor, también puede agregar la siguiente línea en este archivo, de modo que si un visitante accede a su subdominio de Nextcloud, ModSecurity aplicará las exclusiones de la regla de Nextcloud.

SecRule REQUEST_HEADERS:Host "@streq nextcloud.yourdomain.com" "id:1001,phase:1,setvar:tx.crs_exclusions_nextcloud=1"

Guarde y cierre este archivo. Luego pruebe las configuraciones de Nginx.

sudo nginx -t

Si la prueba es exitosa, vuelva a cargar Nginx para que el cambio surta efecto.

sudo systemctl reload nginx

Exclusiones de reglas personalizadas

Es posible que habilitar las exclusiones de reglas específicas de la aplicación preconstruidas no elimine todos los falsos positivos. Si es así, debe examinar el registro de auditoría de ModSecurity (/var/log/modsec_audit.log ), verifique qué regla causó el falso positivo y agregue sus exclusiones de reglas personalizadas en REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf archivo.

La sección H en el registro de auditoría le indica qué regla coincide. Por ejemplo, si trato de usar el <code>...</code> HTML en el formulario de comentarios, ModSecurity bloquea mi comentario. El siguiente registro me dice que la solicitud HTTP coincidió con una regla en REQUEST-941-APPLICATION-ATTACK-XSS.conf (línea 527). El ID de la regla es 941310. El URI de la solicitud es /wp-comments-post.php .

Se detecta como un ataque de filtro XSS de codificación incorrecta. Sin embargo, quiero que los usuarios puedan usar <code>...</code> y <pre>...</pre> etiqueta HTML en el formulario de comentarios, así que creé una regla de exclusión. Agregue la siguiente línea al final de REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf archivo.

SecRule REQUEST_URI "@streq /wp-comments-post.php" "id:1002,phase:1,ctl:ruleRemoveById=941310"

Esta línea le dice a ModSecurity que si el URI de la solicitud es /wp-comments-post.php , luego no aplique la regla ID 941310. Guarde y cierre el archivo. Luego pruebe la configuración de Nginx.

sudo nginx -t

Si la prueba es exitosa, vuelva a cargar Nginx.

sudo systemctl reload nginx

Si un falso positivo coincide con varios ID de reglas, puede agregar exclusiones de reglas en una línea de la siguiente manera:

SecRule REQUEST_URI "@streq /wp-admin/post.php" "id:1003,phase:1,ctl:ruleRemoveById=941160,ctl:ruleRemoveById=941310,ctl:ruleRemoveById=942100"

Nota :No se recomienda deshabilitar demasiadas reglas de nivel 1 en OWASP CRS, ya que hará que su sitio web sea pirateado con mucha más facilidad. Desactive las reglas solo si sabe lo que está haciendo.

Inclusión de direcciones IP en la lista blanca

Si desea deshabilitar ModSecurity para su propia dirección IP, pero dejarlo habilitado para todas las demás direcciones IP, agregue la siguiente regla personalizada en REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf expediente. Reemplazar 12.34.56.78 con tu dirección IP real.

SecRule REMOTE_ADDR "^12\.34\.56\.78" "id:1004,phase:1,allow,ctl:ruleEngine=off"

Para incluir en la lista blanca una subred, use la siguiente sintaxis, que incluirá en la lista blanca el 10.10.10.0/24 red.

SecRule REMOTE_ADDR "^10\.10\.10.*" "id:1005,phase:1,allow,ctl:ruleEngine=off"

Guarde y cierre el archivo. Luego pruebe las configuraciones de Nginx.

sudo nginx -t

Si la prueba es exitosa, reinicie Nginx para que el cambio surta efecto.

sudo systemctl restart nginx

Reglas de encadenamiento

Si su Nginx tiene varios hosts virtuales, es posible que desee incluir su dirección IP en la lista blanca para un host virtual específico. Necesitas encadenar dos reglas así:

SecRule REMOTE_ADDR "^12\.34\.56\.78" "id:1004,phase:1,allow,ctl:ruleEngine=off,chain"
SecRule REQUEST_HEADERS:Host "@streq nextcloud.yourdomain.com" "t:none"

La chain palabra clave al final de la primera regla indica que el ruleEngine=off solo se tomarán medidas si la condición de la siguiente regla también es verdadera.

(Opcional) Integrar ModSecurity con Project Honeypot

Project Honeypot mantiene una lista de direcciones IP maliciosas conocidas, disponible de forma gratuita para el público. ModSecurity puede integrarse con Project Honeypot y bloquear direcciones IP en la lista de Project Honeypot.

Tenga en cuenta que el uso de Project Honeypot hará que su sitio web sea más lento para los nuevos visitantes, porque su servidor web deberá enviar una consulta a Project Honeypot antes de que pueda enviar una respuesta al nuevo visitante. Sin embargo, una vez que los datos de reputación de IP se almacenan en caché en su servidor web, el impacto en el rendimiento será mínimo.

Para usar Project Honeypot, primero cree una cuenta gratuita en su sitio web. Luego vaya al panel de control de su cuenta y haga clic en get one enlace para solicitar una clave de acceso a la lista negra de HTTP.

A continuación, edite el crs-setup.conf archivo.

sudo nano /etc/nginx/modsec/coreruleset-3.3.0/crs-setup.conf

Encuentra las siguientes líneas.

#SecHttpBlKey XXXXXXXXXXXXXXXXX
#SecAction "id:900500,\
#  phase:1,\
#  nolog,\
#  pass,\
#  t:none,\
#  setvar:tx.block_search_ip=1,\
#  setvar:tx.block_suspicious_ip=1,\
#  setvar:tx.block_harvester_ip=1,\
#  setvar:tx.block_spammer_ip=1"

Eliminar el principio # caracteres para descomentarlos y agregar su clave API HTTPBL obtenida de Project Honeypot.

Tenga en cuenta que block_search_ip debe establecerse en 0 (deshabilitado), ya que no queremos bloquear los rastreadores de los motores de búsqueda. Guarde y cierre el archivo. Luego recarga Nginx.

sudo systemctl reload nginx

Ahora ModSecurity consultará Project Honeypot en todas las solicitudes HTTP. Para probar si esto funcionaría, edite el archivo /etc/nginx/modsec/main.conf.

sudo nano /etc/nginx/modsec/main.conf

Agregue la siguiente línea al final de este archivo. Esto nos permite pasar una dirección IP en una URL. (Una vez que la prueba sea exitosa, puede eliminar esta línea del archivo).

SecRule ARGS:IP "@rbl dnsbl.httpbl.org" "phase:1,id:171,t:none,deny,nolog,auditlog,msg:'RBL Match for SPAM Source'

Guarde y cierre el archivo. Pruebe las configuraciones de Nginx.

sudo nginx -t

Luego recarga Nginx.

sudo systemctl reload nginx

Vaya al sitio web de Project Honeypot y busque una dirección IP maliciosa, por ejemplo, 134.119.218.243. Ejecute el siguiente comando para probar la lista negra de HTTP.

curl -i -s -k -X $'GET' 'https://yourdomain.com/?IP=134.119.218.243'

Su servidor web debería devolver una respuesta prohibida 403, debido a la dirección IP en Project Honeypot.

Cómo usar Brotli con ModSecurity en Nginx

Tradicionalmente, las páginas web se comprimen con GZIP para una mayor velocidad de carga. Desarrollado por Google, Brotli es un nuevo algoritmo de compresión que proporciona una mejor relación de compresión. Es compatible con todos los principales navegadores web. Para usar Brotli en Nginx, primero debe instalar el módulo Brotli Nginx desde ondrej/nginx-mainline APP.

sudo apt install libnginx-mod-brotli

Luego abra el archivo de configuración principal de Nginx.

sudo nano /etc/nginx/nginx.conf

Agregue las siguientes líneas en el http {...} contexto.

        brotli on;
        brotli_comp_level 6;
        brotli_static on;
        brotli_types application/atom+xml application/javascript application/json application/rss+xml
             application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype
             application/x-font-ttf application/x-javascript application/xhtml+xml application/xml
             font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon
             image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml;

Save and close the file, then test Nginx configurations.

sudo nginx -t

If the test is successful, restart Nginx.

sudo systemctl restart nginx

Now go to the home page your website, open the developer tools in your web browser (In Firefox you can press Ctrl+Alt+I to open it up). Select the Network tab, and press F5 to reload the web page. Click on the main HTML page.

Check the response header on the right sidebar. If the content-encoding is set to br , then you have successfully enabled Brotli compression in Nginx.

If the content-encoding is gzip , then your Nginx web server is still using GZIP.

Upgrading Nginx

ModSecurity integrates with Nginx as a dynamic module, so every time the Nginx binary is upgraded, you need to rebuild the ModSecurity module for Nginx. This will make your application offline for a few minutes.

If a newer version of Nginx is available in the repository, the sudo apt upgrade command will upgrade Nginx. The newer version of Nginx is not going to be compatible with the previously compiled ModSecurity module. If Nginx is upgraded by the sudo apt upgrade command, it will fail to restart as shown in the screenshot below.

And if you run sudo nginx -t command, it tells you that Nginx expects a new version of the ModSecurity module.

My advice is to prevent Nginx from being upgraded when you run sudo apt upgrade dominio. This can be achieved by the following command:

sudo apt-mark hold nginx

Now if you run sudo apt update;sudo apt upgrade , and the package manager tells you that the nginx package is held back from upgrading, then it means there’s a new nginx version available in the repository.

You should download the new Nginx source package and compile the ModSecurity module again. Move the newly-compiled ModSecurity module to /usr/share/nginx/modules/ directorio. Basically that means you need to remove everything under /usr/local/src/ directory (sudo rm /usr/local/src/* -rf ) and go through step 2 and step 4 again.

Then unhold Nginx.

sudo apt-mark unhold nginx

And upgrade Nginx.

sudo apt upgrade nginx

Once the upgrade is complete, hold Nginx again.

sudo apt-mark hold nginx

To show what packages are held, run

apt-mark showhold

Nginx Plus

If you use the commercial Nginx Plus web server, then ModSecurity is included in the Nginx Plus binary. It’s known as the NGINX WAF .

If you don’t want to spend time re-compiling the ModSecurity source code, then you might want to purchase Nginx Plus, as the ModSecurity module is pre-compiled in the Nginx Plus binary. Benefits of Using ModSecurity 3.0 with NGINX Plus:

  • You don’t need to compile the ModSecurity dynamic module yourself;  NGINX, Inc. provides a precompiled module for you, saving time and effort.
  • NGINX, Inc. has extensively tested the dynamic module, so you know it’s suitable for production usage.
  • NGINX, Inc. continually tracks changes and updates the module for every important change and security vulnerability, so you don’t have to do this yourself.
  • Each new release of NGINX Plus includes a new version of the dynamic module, so you can upgrade without having to re-compile ModSecurity.
  • You get 24×7 support with both installation of the ModSecurity and the OWASP Core Rule Set, as well as troubleshooting and debugging assistance.

How to Disable ModSecurity for a Virtual Host

In this tutorial, I added the following line in the http {...} context.

modsecurity on;

This will enable ModSecurity for all Nginx server blocks (aka virtual hosts). If you want to disable ModSecurity for a specific server block, then edit the server block file (/etc/nginx/conf.d/example.com.conf ) and add the following line to the server {...} context.

modsecurity off;

Reload Nginx for the change to take effect.

sudo systemctl reload nginx

FAQ

Static Module vs Dynamic Module in Nginx

  • A static module must be compiled with Nginx and it’s integrated with Nginx as one binary. It can’t be unloaded from Nginx.
  • A dynamic module is a separate package from the main Nginx binary. It can be loaded and unloaded in Nginx.

What does Binary Compatible Mean?

  • If a dynamic module is not binary compatible, then the module and Nginx should be compiled together. If there’s an existing Nginx binary installed from a software repository using apt-get , it must be removed and you need to install the compiled Nginx binary in order to use the dynamic module.
  • If a dynamic module is binary compatible, then this module can be compiled individually without compiling Nginx. The module can be used with your existing Nginx binary installed from a software repository. It’s not perfect, though.

No matter a module is static or dynamic, binary compatible or non binary compatible, if you upgrade the Nginx binary later, you need to compile the module again.

Upgrade Server RAM

ModSecurity can use a fair amount of RAM. If you can see the following error in your Nginx error log (/var/log/nginx/error.log), it means your server is short of RAM.

fork() failed while spawning "worker process" (12: Cannot allocate memory)
sendmsg() failed (9: Bad file descriptor)
sendmsg() failed (9: Bad file descriptor)
sendmsg() failed (9: Bad file descriptor)

You need to restart Nginx and upgrade server RAM, then the above error is not going to happen again.

How to Upgrade OWASP CRS

Besides upgrading the ModSecurity Nginx module, you also need to upgrade the core rule set when a new version comes out. The process is straightforward.

  • Go through step 6 again to install the new version of core rule set.
  • Then go to step 10. Copy of your custom rules in the crs-setup.conf   and REQUEST-900-EXCLUSION-RULES-BEFORE-CRS archivo.

Next, test Nginx configurations.

sudo nginx -t

If the test is successful, reload Nginx for the change to take effect.

sudo systemctl reload nginx

How do you know if the new version is working? Launch a simple SQL injection attack like in step 8 and check your server logs. It will show you the CRS version that’s preventing this attack.


Debian
  1. Cómo implementar Modsecurity con Nginx en Ubuntu 20.04 LTS

  2. Cómo configurar un cortafuegos con UFW en Ubuntu \ Debian

  3. Cómo instalar Ghost en Debian con Nginx

  4. Cómo configurar Nginx con soporte HTTP/2 en Debian 9

  5. Cómo instalar WonderCMS con Nginx en Debian 11

Cómo instalar phpMyAdmin con Nginx en Debian 11 Bullseye

Cómo instalar ModSecurity 3 y el conjunto de reglas básicas de OWASP con Nginx en Debian 11 Bullseye

Cómo instalar phpMyAdmin con Nginx en Debian 11

Cómo instalar Nginx con PHP-FPM en Debian 11

Cómo configurar un cortafuegos con UFW en Debian 11

Cómo configurar un servidor Seafile con Nginx en Ubuntu 18.04