Mod security es uno de los mejores WAF's (firewall para aplicaciones web) que existen, pero carece de modo gráfico lo que dificulta visualizar fácilmente los falsos positivos y las reglas aplicadas. Mediante el registro (log) en formato JSON podemos visualizar de forma gráfica todos los eventos gracias a Grafana.
ModSecurity, el WAF más extendido en la actualidad, implementa las reglas de seguridad de OWASP, Open Web Application Security Project, un proyecto de código abierto dedicado a determinar y combatir las causas que hacen que el software sea inseguro, ofreciendo protección genérica para cualquier aplicación en las siguientes categorías de ataques, entre otras:
- Protección HTTP – detectando anomalías y violaciones del protocolo HTTP.
- Listas negras en tiempo real – utilizando bases de datos de reputación de terceros.
- Ataques de denegación de servicio (DoS, DDoS) – protección frente a ataques de HTTP Flooding y Slow HTTP DoS.
- Ataques genéricos de aplicación – detectando vulnerabilidades comunes en las aplicaciones web.
- Detección de bots, crawlers, scanners y otros agentes de actividad sospechosa.
- Integración con Antivirus para escanear la subida de archivos a través de la aplicación.
- Protección frente a malware y troyanos.
- Identificación de defectos de aplicación · alertando de errores de configuración en aplicación o de cumplimiento de estándares.
Falsos positivos y ModSecurity WAF
Es inevitable, se producen falsos positivos cuando se usa un WAF. No es algo que afecte únicamente a ModSecurity.
La eficacia de un WAF depende del valor y aplicación de sus reglas de seguridad, al tratarse de reglas que por naturaleza son «genéricas» o «comunes» es posible que se produzcan falsos positivos en su aplicación dependiendo del escenario de cada aplicación web.
Todos los firewall de aplicaciones web van a generar falsos positivos de vez en cuando, especialmente en el despliegue inicial, actualizaciones de reglas de seguridad o actualizaciones en la aplicación web.
Supervisar, solucionar, implementar y comprobar nuevas reglas para
gestionar los falsos positivos es muy importante.
Una de las pocas herramientas que permite visualizar es un script en Python llamado modsecurity-parser:
Para poder visualizar los registros haremos uso de Loki y Promtail, para luego visualizarlos con Grafana:
La plantilla JSON de Grafana para ModSecurity WAF OWASP CRS Log for Apache/NGINX está disponible en:
La instalación de Loki y Promtail está disponible en otra entrada del blog así como añadir el datasource de Loki a Grafana.
Configuración Loki (/etc/loki/config.yml)
# This is a complete configuration to deploy Loki backed by the filesystem.
# The index will be shipped to the storage via tsdb-shipper.
auth_enabled: false
server:
http_listen_port: 3100
grpc_server_max_recv_msg_size: 104857600 # 100 Mb
grpc_server_max_send_msg_size: 104857600 # 100 Mb
ingester:
chunk_encoding: snappy
ingester_client:
grpc_client_config:
max_recv_msg_size: 104857600 # 100 Mb
max_send_msg_size: 104857600 # 100 Mb
querier:
max_concurrent: 8
common:
ring:
instance_addr: 127.0.0.1
kvstore:
store: inmemory
replication_factor: 1
path_prefix: /var/lib/loki
#new
query_range:
parallelise_shardable_queries: true
cache_results: true
results_cache:
cache:
embedded_cache:
enabled: true
max_size_mb: 100
schema_config:
configs:
- from: 2024-10-28
store: tsdb
object_store: filesystem
schema: v13
index:
prefix: index_
period: 24h
storage_config:
filesystem:
directory: /var/lib/loki/chunks
limits_config:
reject_old_samples: true
reject_old_samples_max_age: 168h
retention_period: 360h
max_query_series: 100000
max_query_parallelism: 24
split_queries_by_interval: 15m
max_global_streams_per_user: 100000
per_stream_rate_limit: "3MB"
per_stream_rate_limit_burst: "15MB"
Configuración de Promtail (/etc/promtail/config.yml)
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://localhost:3100/loki/api/v1/push
scrape_configs:
# Modsecurity Log
- job_name: modsec
pipeline_stages:
- tenant:
value: sysmid-sensitive
- json:
expressions:
request:
source: transaction
- json:
expressions:
headers:
source: request
- json:
expressions:
Host:
source: headers
- labels:
Host: Host
static_configs:
- targets:
- localhost
labels:
job: modsec
__path__: /var/log/modsec/modsec_audit.log
Configuración ModSecurity (apache o Nginx):
SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus "^(?:5|4(?!04))"
SecAuditLogParts ABFHJKZ
SecAuditLogType Serial
SecAuditLogFormat JSON
SecAuditLog /var/log/modsec/modsec_audit.log
SecAuditLogParts:
| Section | Description |
|---|---|
| A | Audit log header (mandatory) |
| B | Request headers |
| C | Request body |
| D | Reserved |
| E | Response body |
| F | Response headers |
| G | Reserved |
| H | Audit log trailer, which contains additional data |
| I | Compact request body alternative (to part C), which excludes files |
| J | Information on uploaded files |
| K | Contains a list of all rules that matched for the transaction |
| Z | Final boundary (mandatory) |
Fuentes:
https://portfoliodb.hslu.ch/files/fd545d6d-acab-442a-9254-c842ddacf0c1







No hay comentarios:
Publicar un comentario