MOD_SECURITY es una robusta librería que se encuentra disponible para servidores web Apache y que permite a un administrador, extender la seguridad del servidor con mecanismos adicionales incluidos en este módulo. Se encuentra dentro de la categoría de los WAF (Web Application Firewall) dado que contiene directivas que permiten detectar y filtrar ataques comunes contra la infraestructura de un servidor web. Una de las principales características de este módulo es su capacidad para capturar y analizar de forma dinámica el trafico HTTP, esto es una gran ventaja, dado que estas características le permiten monitorizar, registrar y controlar el acceso de todas las peticiones HTTP que son llevadas a cabo por los clientes, dándole paso a aquellas que son legitimas y filtrando aquellas que tienen altas probabilidades de no serlo. Este módulo es importante habilitarlo en servidores web ya que permite habilitar una capa extra de protección, sin embargo es también importante tener en cuenta que no puede proteger por completo un servidor web, ya que su contexto de ejecución esta limitado solamente a las aplicaciones web y hay mucho código (propio del servidor web) que se ejecuta antes de que MOD_SECURITY entre en acción.
Para comprender como funciona este módulo antes de proceder a instalar y llevar a cabo tareas más concretas como las de establecer reglas y explicar las directivas disponibles, se indica cual es su ciclo vida, explicando cada uno de los pasos involucrados:
- Request Headers. Este es el primer paso para el procesamiento de MOD_SECURITY, el principal objetivo de esta etapa es interceptar la petición de un cliente y enviar los headers y el body de la petición del cliente al motor de reglas de ModSecurity, todo esto antes de que se lleve a cabo el procesamiento propiamente dicho de la petición por parte del servidor web.
- Request Body. Este paso es uno de los más importantes, ya que se pone en marcha el proceso de análisis de la petición anteriormente interceptada, en este punto las reglas definidas en el motor tienen a su disposición toda la información relacionada con el cuerpo de la petición, es aquí donde las reglas determinan si la petición debe continuar siendo procesada por el servidor, si debe interrumpirse la interacción o debe llevarse a cabo alguna acción adicional.
- Response Headers. Este paso entra en acción después de que el servidor web genera la respuesta para una petición dada, donde las cabeceras ya se encuentran generadas pero el body aun no se ha leído, en este punto el motor de reglas define que campos deben ser inspeccionados en el cuerpo de la repuesta.
- Response Body Se trata de la principal fase de análisis del cuerpo de la respuesta, toma como insumo la fase anterior (Response Headers) donde el motor de reglas para la respuesta ha sido inicializado y ahora el cuerpo de la respuesta se ha tenido que leer completamente para que con toda la información de la respuesta, el motor de reglas pueda tomar decisiones sobre los datos leídos.
- Logging Se trata de la única fase del ciclo de vida que no puede ser bloqueada, ya que cuando se ejecuta, la transacción habrá finalizado y es poco lo que el administrador podrá hacer al respecto, las reglas definidas en este paso, solamente definen la forma en la que el logging se llevará a cabo.
Anotar que todos estos pasos, son llevados a cabo por medio de filtros Input/Output de Apache (que se han explicado en una publicación anterior) y de esta forma, el ciclo de vida se mueve por cada una de sus etapas
Ahora se procede a indicar el proceso de instalación de MOD_SECURITY en un servidor web Apache.
Instalación Mod_Security
En primer lugar la instalación recomendada (y la que explicaré a continuación) es la instalación partiendo del código fuente del módulo, también es posible instalar MOD_SECURITY utilizando alguna versión pre compilada disponible para cada sistema operativo (Debian, Fedora, Ubuntu, etc.) o versiones pre compiladas de terceros.
En primer lugar se deben cumplir las dependencias exigidas por MOD_SECURITY, en sistemas basados en Debian, basta con ejecutar
>apt-get install libcurl3-dev liblua5.1-dev libxml2-dev |
Ahora ejecutar el script configure indicando la ruta donde se encuentra disponible APXS.
>./configure –with-apxs=/opt/WebServerFull/httpd-2.2.22/bin/apxs |
Finalmente ejecutar
>make install |
Con las instrucciones anteriores será suficiente para tener instalado Mod_Security en el servidor web, con lo anterior, se ha debido generar el fichero mod_security2.so en el directorio de módulos del servidor web ubicado en <APACHE_INSTALL>/modules.
Ahora que MOD_SECURITY se encuentra instalado en el servidor web, se puede comenzar a utilizar sus directivas (obviamente después de cargar el módulo).
Conocer las directivas, permite tener un mejor entendimiento y conocimiento sobre como funciona este módulo y cuales son las características que implementa, antes de pasar a esa parte, es aconsejado crear una estructura de directorios especifica para este módulo, de tal forma que sea fácil de identificar los ficheros de configuración necesarios y cual será el espacio de trabajo definido para las operaciones que lleve a cabo el módulo. En este caso, se ha creado la siguiente estructura de directorios dentro del directorio de instalación de Apache:
<APACHE_INSTALL_DIR>/etc
<APACHE_INSTALL_DIR>/var
<APACHE_INSTALL_DIR>/var/audit
<APACHE_INSTALL_DIR>/var/data
<APACHE_INSTALL_DIR>/var/log
<APACHE_INSTALL_DIR>/var/tmp
<APACHE_INSTALL_DIR>/var/upload
Esta estructura de directorios cobrará sentido en la medida que se avance con el estudio de las directivas. Ahora, para tener una configuración limpia, en el directorio etc se incluirán todos los ficheros de configuración que se utilizarán, el primero de los ficheros será llamado mainConfig.conf
Ahora, en el de configuración del Apache (httpd.conf) se deben incluir las siguientes lineas:
# Load libxml2LoadFile /usr/lib/libxml2.so# Load LuaLoadFile /usr/lib/liblua5.1.so
# Finally, load ModSecurity LoadModule security2_module modules/mod_security2.so Include /opt/WebServerFull/httpd-2.2.22/modsecurity/etc/mainConfig.conf |
Ahora bien, el contenido del fichero mainConfig.conf, inicialmente puede ser el siguiente:
SecDataDir /opt/WebServerFull/httpd-2.2.22/modsecurity/var/dataSecTmpDir /opt/WebServerFull/httpd-2.2.22/modsecurity/var/tmp |
Ahora que se encuentra correctamente instalado y configurado este módulo en el Apache, es el momento de conocer las principales directivas disponibles para conocer su alcance y lo que se puede hacer con él.
DIRECTIVAS EN MOD_SECURITY
Algunas de las directivas más interesantes y las que seguro serán utilizadas.
Directivas para Procesamiento de Peticiones
SecRequestBodyAccess
Sus posibles valores son “on” y “off” y le indica a mod_security cuando debe y cuando no debe acceder al cuerpo de las peticiones, tal como se recordará de los apartados anteriores, dentro del ciclo de vida hay una separación en los datos a los que puede acceder con mod_security, en cualquier caso, los headers de la petición siempre estarán disponibles, (paso 1 del ciclo de vida) sin embargo el cuerpo de la misma esta disponible solamente en el siguiente paso (paso 2 del ciclo de vida). En el caso de que esta directiva tenga un valor de “off” indica que no será posible acceder a los valores que viajan en el cuerpo de la petición (como por ejemplo parámetros que viajan por POST) lo cual desde luego, no es siempre deseado. Sin embargo hay una “desventaja” cuando esta directiva se encuentra activada (con valor “on”) y es que los buffers de los cuerpos de las peticiones son almacenadas en memoria volátil (RAM) lo cual puede ser un problema cuando MOD_SECURITY se ejecuta como un módulo embebido en el Apache. Es aquí donde entran otras directivas que permiten controlar los tamaños de los buffers en memoria, estas directivas se explican a continuación.
SecRequetsBodyInMemoryLimit
Esta directiva, como su nombre indica, permite definir el tamaño en bytes que será reservado en la memoria RAM para que MOD_SECURITY almacene allí los buffers correspondientes a los cuerpos de las peticiones, para que esta directiva tenga alguna efecto, la directiva SecRequestBodyAccess debe encontrarse activada.
#512 KBSecRequetsBodyInMemoryLimit 524288 |
En el caso de que una petición multipart/form-data superé este tamaño en memoria, automáticamente se comenzarán a volcar bytes a un fichero temporal en disco.
SecRequestBodyLimit
Indica el tamaño máximo de bytes permitido para los buffers correspondientes a los cuerpos de las peticiones, cualquier petición que superé este limite, será rechazada con un error HTTP 413 (Request Entity Too Large)
En el caso de que alguna de las aplicaciones alojadas en el servidor web tenga FileUploads o componentes similares en los que se permita a los usuarios subir ficheros, el tamaño que se le debe asignar a esta directiva debe de ser igual al tamaño máximo de los ficheros que se podrán subir.
#131072 KBSecRequestBodyLimit 134217728 |
SecRequestBodyNoFilesLimit
Esta directiva es similar a la anterior, con la diferencia de que en este caso, no se toman en cuenta las peticiones que transfieran archivos al servidor (FileUploads), en tales casos toma preferencia la directiva SecRequestBodyLimit. Normalmente este valor debe de ser más pequeño que el establecido en la directiva anterior, ya que el procesamiento de ficheros (que normalmente suelen tener un peso mucho mayor que las peticiones simples)
SecRequestBodyNoFilesLimit 131072 |
El valor por defecto de esta directiva es de 1 MB.
Esta directiva se ha introducido a partir de la versión 2.5 con el fin de evitar ataques DoS con el uso de la directiva SecRequestBodyLimit.
SecRequestBodyLimitAction
Permite controlar cual será el comportamiento del módulo cuando una petición alcanza o supera el limite definido en la directiva SecRequestBodyLimit en este caso pueden definirse dos valores posibles Reject y ProcessPartial. El valor por defecto es Reject a menos que la directiva SecRuleEngine tenga el valor DetectionOnly en cuyo caso el valor que tomará esta directiva será ProcessPartial
Directivas para Procesamiento de Respuestas
Del mismo modo que existen directivas para controlar los tamaños de los buffers para las peticiones y permitir que MOD_SECURITY haga un análisis de sus contenidos, también existen directivas que permiten tomar control sobre las respuestas que son emitidas por parte del servidor. Aunque en algunos entornos, toman como buenas practicas, desactivar el filtrado de MOD_SECURITY para el análisis de las respuestas que genera el servidor web, esto con el fin de mejorar el desempeño general del servidor ya que el uso de CPU se verá reducido (si, la seguridad cuesta). En algunos casos esto puede ser útil, pero en otros casos, puede convenir analizar las respuestas que esta generando el servidor para verificar que no existen fugas de información o se producen respuestas que exponen información sensible del servidor.
SecResponseBodyAccess
Esta directiva activa o desactiva el procesamiento de MOD_SECURITY para las respuestas generadas por el servidor web. Los posibles valores de esta directiva son “On” y “Off”. El valor por defecto es “Off”
SecResponseBodyLimit
Se trata de una directiva que permite establecer el limite en bytes de las respuestas generadas por el servidor. Es importante tener en cuenta que si este valor es muy pequeño, se pueden “romper” páginas en el servidor, es decir, si las respuestas a peticiones a dichas páginas tienen un tamaño superior al permitido por esta directiva, la respuesta al final será un error HTTP 500 (Internal Server Error)
#512 KB.SecResponseBodyLimit 524288 |
SecResponseBodyLimitAction
Si el cuerpo de una respuesta es demasiado grande y supera el tamaño definido en la directiva SecResponseBodyLimit se lanzará un error, sin embargo esto no siempre resulta conveniente, por este motivo existe esta directiva que permite indicarle al módulo que acción se debe llevar a cabo en el caso de que se presente esta situación. Los valores posibles para esta directiva son Reject y ProcessPartial, en el caso de que se establezca ProcessPartial la respuesta generada llegará solamente hasta el limite establecido en bytes, el resto de la respuesta será cortado.
SecResponseMimeType
Con esta directiva, se le puede indicar al modulo, los tipos de contenidos MIME que podrán ser almacenados en buffers de memoria, lo cual es bastante útil para indicar al servidor web que se debe procesar y que no. Esta directiva permite la definición de varios tipos MIME.
SecResponseMimeType text/plain text/html text/xml |
Esta ha sido una introducción al uso de Mod_security en Apache, en la próxima publicación se hablará más sobre otras directivas interesantes y configuraciones que pueden aplicarse con este módulo.