Fundamentos y Organización del Sistema
SNORT opera como una plataforma NIDS/NIPS que inspecciona tráfico en tiempo real cruzando flujos de red contra un repositorio de firmas deterministas. La lógica básica de evaluación se ilustra mediante una directiva de detección:
alert tcp $RED_EXTERNA any -> $RED_LOCAL 443 (msg: "Conexión HTTPS Identificada"; sid:2001; rev:1;)
La estructura se compone de la acción desencadenante (alert), el protocolo de transporte, los extremos de comunicación, el operador de dirección (-> o <->) y un bloque semántico entre paréntesis que define comportamientos. Este enfoque permite analizar paquetes sin interromper el flujo nativo.
Jerarquía de Archivos y Configuración Central
La distribución estándar en /etc/snort segmenta responsabilidades operativas:
/etc/snort
├── snort.conf # Archivo maestro de configuración
├── classification.config # Definición de clases de amenaza
├── reference.config # Catálogo de referencias externas
├── threshold.conf # Filtros de umbral y anti-spam
├── gen-msg.map / sid-msg.map # Mapeo de identificadores a descripciones
├── unicode.map # Transformador de codificaciones
├── preproc_rules/ # Firmas internas de decodificación
│ └── decoder.rules
├── so_rules/ # Bibliotecas compartidas dinámicas
└── rules/ # Conjunto principal de detección
├── web-iis.rules
└── local.rules (personalizado)
El núcleo operativo reside en snort.conf. Su procesamiento secuencial sigue estas prioridades:
- Declaración de variables de red para abstracción de direcciones.
- Inicialización del subsistema de decodificación.
- Carga del motor de correlación base.
- Vinculación de módulos externos (Shared Objects).
- Parametrización de preprocesadores.
- Configuración de conectores de salida.
- Inclusión del repositorio de reglas locales.
- Habilitación de reglas específicas para preprocesamiento.
- Integración de conjuntos de reglas SO.
Pipeline Interno de Procesamiento
Los datos siguen un flujo de four-stage pipe:
- Captura y Decodificación: Intercepta frames brutos desde interfaces pasivas/activas y los reconstruye en estructuras anidadas siguiendo la pila TCP/IP.
- Preprocesamiento y Normalización: Mitiga técnicas de evasión clásicas (fragmentación IP maliciosa, sessions split, shellcode polimórfico) reensamblando streams y estandarizando payloads para garantizar coherencia en el motor.
- Motor de Correlación: Opera sobre una base tridimensional de reglas. Cuando una sección del paquete coincide con un patrón activo, inyecta una señal al subsistema de gestión.
- Persistencia y Notificación: Interpreta la acción solicitada (
log,alert) y rotea el evento hacia sistemas de archivo plano o gestores relacionales.
Sistemas de Decodificación y Preprocesadores
Estas capas ejecutan transformaciones preventivas antes de que el motor aplique firmas complejas. La configuración inicial en snort.conf puede optimizar la tolerancia a errores y controlar alertas genéricas:
# Suprime notificaciones rutinarias de inconsistencia de cabecera
config disable_decode_alerts
# Activa monitoreo de sobredimensionamiento en UDP/TCP/IP
config enable_decode_oversized_alerts
# Invoca reglas nativas de validación
include $PREPROC_RULE_PATH/decoder.rules
Para entornos web, http_inspect resulta crítico. Se ajusta definiendo profundidades de descompresión, mapas de caracteres y extracción contextual:
preprocessor http_inspect: global iis_unicode_map unicode.map 1252 compress_depth 65535 decompress_depth 65535
preprocessor http_inspect_server: server default \
http_methods { GET POST PUT SEARCH MKCOL HEAD OPTIONS TRACE CONNECT PATCH DELETE } \
normalize_uri \
normalize_javascript \
enable_cookie \
overlap_limit 100
Las directivas vinculadas a este nivel generalmente carecen de especificaciones de IP/puerto, pues actúan como filtros contextuales transparentes gestionados internamente por el daemon.
Motor de Detección y Sintaxis de Reglas
La gramática se partition en metadatos operativos y cláusulas lógicas de emparejamiento. Las acciones soportadas incluyen alert (registra y notifica), log (persiste silenciosamente), pass (ignora flujo), activate (dispara contexto) y dynamic (modo espera/reactivación).
Las direcciones admiten notation CIDR, listas delimitadas por coma dentro de corchetes, exclusión con !, y el comodín universal any. Los puertos aceptan rangos semiabiertos (80:, :1024) o rangos completos.
Opciones de Regla
- Generales:
sid(identificador único, >1000000 reserva para scripts propios),gid(fuente del detector: 1=Engine, valores distintos = preprocessors/decoders),rev(versionado),msg(cadena legible sincronizada víasid-msg.map),reference(hipervínculos a CVE/BID integrados en alertas),classtypeypriority(severidad gestionada enclassification.config). - Payload (Carga Útil):
contentbusca bytes específicos o texto. Soporta modificadores comonocase,depth,offset,distance,within, y extractores HTTP (http_header,raw_url). Permite regex compatibles con PCRE mediantepcre.protected_contentaplica hash MD5/SHA para cifrar firmas sensibles en repositorios públicos.rawbytesfuerza coincidencia saltando capas de normalización previa. - No-Payload (Metadatos/Estructura): Filtrado directo sobre campos de cabecera:
ttl,tos,ipopts,dsize,flags,seq,ack,window, e identificadores ICMP. - Post-Detección:
logtoredefine ruta de salida,tagagrega etiquetas temporales,respdevuelve replies TCP/RST para abortar conexiones,countlimita frecuencia de disparo, yreplacemuta datos en vuelo.
Ejemplo práctico refactorizado demostrando composición avanzada:
alert tcp $RED_LOCAL any -> $RED_EXTERNA any 80 \
(msg:"Reconocimiento de Rutas Administrativas"; \
flow:to_server,established; \
content:"/dashboard"; http_uri; depth:40; \
classtype:attempted-admin; \
priority:1; sid:40015; rev:2;)
Gestión de Logs e Integración Relacional
Para entornos productivos, el formato binario unified2 reduce latencia y overhead de disco:
config logdir: /var/log/snort_prod
output unified2: filename snort_u2.log, limit 128
El daemon Barnyard2 consume este stream y lo transforma en inserciones SQL eficientes. Su configuración tipica incluye control de offsets y credenciales de conexión:
# Barnyard2 config
config waldo_file: /var/log/snort_prod/waldo.snort
output database: log, mysql, user=auditor_db pass=contraseña_fuerte dbname=nids_history host=db_central
El modelo de datos resultante organiza la telemetría mediante tablas especializadas:
sensor: Metadatos físicos del agente (hostname, interfaz, nivel de detalle fast/full, encoding binario).event: Registro atómico por incidente (PK compuesto porsidy contadorcid). Contiene timestamp y firma vinculada.signature: Diccionario maestro de reglas vivas (sig_id, nombre, categoría, prioridad, versión, identificador Snort).referenceysig_reference: Tablas puente que asignan IDs internos a catálogos de vulnerabilidades abiertas.sig_class: Diccionario de grupos operativos de alarma.iphdr,tcphdr,udphdr,icmphdr: Espejos de cabeceras extraídas en el momento del cruce.datayopt: Almacenan payload utilizable y extensiones de protocolo respectivamente.