Servidor Web Apache y el modulo mod_security en CentOS 7

En otra entrada estuvimos hablando de como aumentar la seguridad de nuestro servidor Web Apache a través del modulo mod_evasive pensado para mitigar el efecto de los ataques DoS y DDoS. En esta entrada hablaremos de un modulo mucho más potente, completo y complejo que nos permite llegar a un nivel de seguridad mucho más avanzado. Este modulo se llama mod_security; mod_security es un modulo que trabaja como cortafuego para aplicaciones Web. Una premisa: el 70% de los ataques que recibe un servidor, se realizan a nivel del servidor Web y se basan en solicitudes de tipo POST que contienen un anexo que el sistema de LOG base del servidor Web no es capaz de analizar.

mod_security es capaz de analizar cualquier tipo de anexo presente en las solicitudes recibidas y, trabajando en tiempo real, es capaz de analizar todo el trafico en entrada y bloquear cualquier tipo de solicitud que considera sospechosa. Todas las reglas se pueden personalizar ofreciendo un producto solido, versátil y altamente profesional.

En CentOS 7 podemos instalar mod_security de tres formas; la más sencilla es desde los paquetes presentes en los repositorios:

yum install mod_security mod_security-mlogc mod_security_crs

El primer paquete es el modulo, el segundo permite tener un LOG de auditoría donde es posible revisar que tipo de trafico se ha bloqueado y en base a que regla, el tercer modulo contiene todas las reglas que se pueden personalizar y que se activarán junto al modulo.

La segunda forma es instalar solamente el modulo y el paquete de LOG de auditoría:

yum install mod_security mod_security-mlogc

y luego bajar las reglas actualizadas desde GitHub:

cd /usr/src/

git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git

entrar en la carpeta:

cd owasp-modsecurity-crs

copiar el archivo de configuración general de las reglas en la carpeta donde el modulo mod_secutiry lo buscará por defecto:

cp crs-setup.conf.example /etc/httpd/modsecurity.d/crs-setup.conf

copiar todas las reglas en la carpeta donde el modulo mod_secutiry las buscará por defecto:

cp rules/* /etc/httpd/modsecurity.d/activated_rules/

La versión de mod_security presente en CentOS7 es:

yum info mod_security

la versión 2.9.2 y de ahí la tercera forma de instalar el modulo que es directamente desde las fuentes para aprovechar la ultima versión disponible que es este momento (Agosto 2022) es la 3.0.7. Primero los paquetes para poder realizar la compilación desde las fuentes:

yum groupinstall "Development tools" -y

luego algunas dependencias especificas de mod_security:

yum install lua-devel httpd-devel libxml2 pcre-devel libxml2-devel curl-devel -y

Ya se puede descargar la ultima versión disponible:

cd /usr/src

wget https://github.com/SpiderLabs/ModSecurity/releases/download/v3.0.7/modse...

se descomprime:

tar -xf modsecurity-v3.0.7.tar.gz

se entra en la carpeta de las fuentes:

cd modsecurity-v3.0.7

se inicia la compilación:

./autogen.sh

./configure

make

para averiguar que todo esté bien:

make CFLAGS=-DMSC_TEST test

El resultado:

se termina con:

make install

se copian los archivos de configuración predefinidos de mod_security y del LOG de autoría en las respectivas carpetas. Más adelante hablaremos del archivo de configuración y sus parámetros:

cp modsecurity.conf-recommended /etc/httpd/conf.d/modsecurity.conf

cp mlogc/mlogc-default.conf /etc/mlogc.conf

se copia el archivo que sigue, requerido por mod_security:

cp unicode.mapping /etc/httpd/conf.d/

El modulo depende, para su funcionamiento, de otro modulo, unique_id, que es parte del corazón del paquete httpd, pero para asegurarnos que se cargue correctamente junto al modulo mod_security:

nano /etc/httpd/conf.modules.d/10-mod_security.conf

se copian las siguientes lineas:

LoadModule security2_module modules/mod_security2.so

<IfModule !mod_unique_id.c>

LoadModule unique_id_module modules/mod_unique_id.so

</IfModule>

con la primera linea se carga el modulo mientras en el bloque de tres lineas que sigue, aplica la siguiente lógica: si el modulo mod_unique_id no está cargado, se carga ya que es requerido por el modulo mod_security.

Como se ha hecho con la segunda forma de instalar el modulo, se descargan y configuran las reglas:

cd /usr/src/

git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git

entrar en la carpeta:

cd owasp-modsecurity-crs

crear las carpetas donde se va a guardar el archivo de configuración general de las reglas y las reglas respectivamente:

mkdir -p /etc/httpd/modsecurity.d

mkdir -p /etc/httpd/modsecurity.d/activated_rules/

copiar el archivo de configuración general de las reglas en la carpeta donde el modulo mod_secutiry lo buscará por defecto:

cp crs-setup.conf.example /etc/httpd/modsecurity.d/crs-setup.conf

copiar todas las reglas en la carpeta donde el modulo mod_secutiry las buscará por defecto:

cp rules/* /etc/httpd/modsecurity.d/activated_rules/

A partir de este momento se puede empezar con la configuración del modulo a través del archivo dedicado.

IMPORTANTE: en el caso de la primera y segunda forma de instalación el archivo es el mismo. Con la tercera forma cambia ya que se copia desde las fuentes. Aquí vamos a utilizar el archivo como viene con las fuentes:

nano /etc/httpd/conf.d/mod_security.conf

donde encontraremos todas una serie de parámetros de configuración que vamos a analizar en detalle pero primero, antes de esta linea:

SecRuleEngine DetectionOnly

añadimos:

<IfModule mod_security2.c>

# ModSecurity Core Rules Set configuration

IncludeOptional modsecurity.d/*.conf

IncludeOptional modsecurity.d/activated_rules/*.conf

de esta forma se cargará el archivo de configuración de las reglas y todas las reglas presentes en la carpeta activated_rules. Al final del archivo se añade la siguiente linea:

</IfModule>

para cerrar el If abierto con el bloque añadido al inicio del archivo. Volviendo al inicio del modulo el primer parámetro que encontramos y que es quizás el más importante es:

  • SecRuleEngine

    • on aplica las reglas a las solicitudes recibidas

    • off no aplica las reglas

    • DetectionOnly aplica las reglas pero no realiza ningún tipo de acción de bloque. Es la configuración aconsejada cuando se instala el modulo. Solamente después de probar el servidor y tener la certeza que todo funciona bien, se puede cambiar a on

  • SecRequestBodyAccess

    • on el modulo tiene acceso a los anexos presentes en las solicitudes recibidas, que, como dijimos anteriormente, son las que se utilizan para lanzar ataques

    • off no se accede a los anexos

  • SecRule es el parámetro que se puede repetir más de una vez en el archivo y es donde se definen las reglas generales del modulo. El parámetro tiene la siguiente sintaxis:

    • variable

    • operator

    • action

    • ejemplo: en el archivo la primera vez que aparece es para permitir parsear los anexos XML

  • SecRequestBodyLimit: el tamaño máximo de un anexo que mod_security aceptará en el área de trabajo. El valor es en byte y el predefinido es 13107200 que corresponde a 12,5 MByte. Si llega alguna solicitud con un anexo de tamaño más grande, el servidor web contestará con el siguiente mensaje de error: 413 Request Entity Too Large. Limite máximo intrínseco al modulo: 1 GB

  • SecRequestBodyNoFilesLimit: el tamaño máximo de una anexo que mod_security aceptará cuando no se trata de un archivo. El valor predefinido corresponde a 128KBytes

  • SecRequestBodyInMemoryLimit: el tamaño máximo de una anexo que mod_security aceptará en la memoria de trabajo. El valor predefinido corresponde a 128 KBytes

  • SecRequestBodyLimitAction: controla que tipo de acción se toma cuando llega una solicitud con un anexo de tamaño más grande al definido en el parámetro SecRequestBodyLimit:

    • reject: se rechaza

    • ProcessPartial: se procesa parcialmente hasta llegan al tamaño máximo definido. IMPORTANTE: si SecRuleEngine = DetectionOnly el valor de este parámetro se configurará automáticamente en ProcessPartial

  • SecResponseBodyAccess: se define si los anexos presentes en las repuestas (no en las solicitudes) se aceptarán en el área de trabajo de mod_security.

    • On: activo

    • Off: no activo

  • SecResponseBodyMimeType: que tipo de anexo de las respuestas se analizarán si el parámetro anterior está en On:

    • text/plain: texto plano

    • text/html: formato HTML

    • text/xml: formato XML

  • SecResponseBodyLimit: tamaño maximo aceptado para el anexo presente en una respuesta; valor predefinido 524288 correspondiente a 512KBytes

  • SecResponseBodyLimitAction: acción que se tomará si el tamaño del anexo de la respuesta supera el valor presente en el parametro anterior

    • Reject: se rechaza

    • ProcessPartial: se procesa parcialmente hasta llegan al tamaño máximo definido

  • SecTmpDir: carpeta donde mod_security guardará los archivos temporales

    • /tmp/

  • SecDataDir: carpeta donde mod_security guardará los archivos persistentes

    • /tmp/

  • SecDebugLog: carpeta y archivo donde se guardará el debug del programa

    • /var/log/modsecurity/debug.log

  • SecDebugLogLevel

    • 0: LOG desactivado

    • 1: errores

    • 2: Advertencias

    • 3: noticias

    • 4: detalles de como las transacciones se han procesado

    • 5: como la anterior añadiendo más datos de las transacciones

    • 9: cualquier tipo de operación realizada por el modulo

  • SecAuditEngine RelevantOnly

  • SecAuditLogParts ABIJDEFHZ

  • SecAuditLogType Serial

  • SecAuditLog /var/log/modsecurity/audit.log

 

NOTA Nextcloud

en uno de mis servidores tengo instalado Nextcloud y esto me ha creado dos tipos de problemas:

  1. la aplicación para Windows 10 iOS dejaba de conectarse

  2. si enviaba archivos de un tamaño más grande al definido en el parámetro SecRequestBodyLimit no pasaban

Par resolver el primero problema se añade Nextcloud a la lista blanca de mod_security:

nano /etc/httpd/modsecurity.d/crs-setup.conf

al final del archivo se añade:

SecAction \

"id:900130,\

phase:1,\

nolog,\

pass,\

t:none,\

setvar:tx.crs_exclusions_nextcloud=1"

se guardan los cambios. Para el segundo punto hay que aumentar el valor del parámetro SecRequestBodyLimit con una valor adecuado al tamaño de loas archivos que se manejan con Nextcloud ya que los archivos, del cliente al servidor, viajan como anexos a través del servidor web.

Vota el Articulo: 

No votes yet
Evalúa la calidad del articulo
Subscribe to Comments for "Servidor Web Apache y el modulo mod_security en CentOS 7" Subscribe to VozToVoice - All comments