# ModSecurity de Apache2 como WAF: creando reglas ModSecurity es un módulo complementario para Apache que funciona como un cortafuegos. Funciona a través de conjuntos de reglas, que le permiten personalizar y configurar la seguridad de su servidor. ModSecurity también puede monitorizar el tráfico web en tiempo real y ayudarle a detectar y responder a las intrusiones. Se puede utilizar con Apache, Nginx y IIF y es compatible con Debian, Ubuntu y CentOS. en este pequeño proyecto crearemos unas reglas especificas para probar ModSecurity. la sintaxys basica de las reglas es: **SecRule VARIABLES OPERATOR [ACTIONS]** Las variables mas utilizadas son: ## VARIABLES **ARGS** es una colección por lo que significa todos los argumentos incluyendo el Payload de POST. **ARGS_GET** contiene sólo los parámetros de la cadena de consulta. **ARGS_POST** contiene los argumentos del cuerpo del POST. **FILES** Contiene una colección de nombres de archivos originales. Disponible sólo en peticiones multipart/form-data inspeccionadas. **FULL_REQUEST** Contiene la solicitud completa: Línea de solicitud, cabeceras de solicitud y cuerpo de solicitud. **QUERY_STRING** Contiene la parte de la cadena de consulta de un URI de solicitud. El valor de QUERY_STRING siempre se proporciona sin procesar, sin decodificar la URL. **REQUEST_BODY** Contiene el cuerpo de la solicitud sin procesar. Esta variable sólo está disponible si se ha utilizado el procesador del cuerpo de la petición URLENCODED, lo que ocurrirá por defecto cuando se detecte el tipo de contenido application/x-www-form-urlencoded, o si se ha forzado el uso del analizador del cuerpo de la petición URLENCODED. **REQUEST_HEADERS** Esta variable puede ser utilizada como una colección de todas las cabeceras de la petición o puede ser utilizada para inspeccionar cabeceras seleccionadas. **REQUEST_METHOD** Esta variable contiene el método de solicitud utilizado en la transacción. **REQUEST_URI** Esta variable contiene la URL completa de la solicitud, incluyendo los datos de la cadena de consulta (por ejemplo, /index.php? p=X). ## OPERADORES Especifica una expresión regular, un patrón o una palabra clave que debe comprobarse en la(s) variable(s). Los operadores comienzan con el carácter @. ## ACCIONES Especifica qué hacer si la regla coincide. Cada acción pertenece a uno de los cinco grupos: **Disruptiva** Se usa para permitir que ModSecurity tome una acción, por ejemplo permitir o bloquear **Acción no disruptiva** Hace algo, pero ese algo no afecta ni puede afectar al flujo de procesamiento de la regla. Establecer una variable, o cambiar su valor es un ejemplo de una acción no disruptiva. La acción no disruptiva puede aparecer en cualquier regla, incluso en cada regla perteneciente a una cadena. **FlOW(flujo)** Estas acciones afectan al flujo de la regla (por ejemplo, skip o skipAfter). **Meta-datos** Las acciones de meta-datos se utilizan para proporcionar más información sobre las reglas. Algunos ejemplos son id, rev, severity y msg. **Datos** No son realmente acciones, son meros contenedores que contienen datos utilizados por otras acciones. Por ejemplo, la acción de estado contiene el estado que se utilizará para el bloqueo (si se produce). ## creando nuevas reglas hemos decidido crear una regla que al mandar ciertas palabras como "Xavi". la regla quedaria algo asi: **SecRule REQUEST_FILENAME "test.php" "id:'400001',chain,deny,log,msg:'No puedes pasar Xavi :('" SecRule REQUEST_METHOD "POST" chain SecRule REQUEST_BODY "@rx (?i:(Xavi))"** tambien hemos intentado crear un regla para bloquear palabras en alfabeto cirilico pero por desgracia no funciona por el regex, pero la dejamos como prueba. **SecRule REQUEST_FILENAME "test.php" "id:'400002',chain,deny,log,msg:'Cirilico no queremos'" SecRule REQUEST_METHOD "POST" chain SecRule REQUEST_BODY "@rx (?i:^/[бБвВгГдДёЁжЖзЗиИйЙкКлЛпПуУфФцЦчЧшШщЩъЪыЫьЬэЭюЮяЯ])"** ademas hemos creado una regla para bloquear metodo get desde la url, esta regla la hemos creado en el archivo sites-available/default.conf la regla seria: <VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SecRuleEngine On SecRule ARGS:name "@contains Xavi" "id:1234,deny,status:403,msg:'You shall noT pass by Pedro & Javier'" </VirtualHost>