
Microsoft Sentinel SIEM Analizador de fuentes de registro
He tenido que responder "¿qué estamos obteniendo realmente de estos registros?" o "¿cuáles son los registros recomendados para Microsoft Sentinel?" más veces de las que puedo contar. La respuesta siempre depende de muchas cosas, pero podemos ser genéricos. Así que construí esta herramienta justo aquí.
Log Horizon se conecta a tu espacio de trabajo de Microsoft Sentinel (y opcionalmente a Defender XDR), revisa cada tabla de registros que estás ingiriendo y te dice si estás obteniendo valor de seguridad de ella o simplemente quemando dinero. Clasifica tablas, las puntúa frente a tus reglas de detección y te brinda recomendaciones concretas con estimaciones de ahorro.
Importante: Este es un enfoque genérico. Si sabes que una fuente de registros es importante para tu entorno, ese contexto siempre tiene prioridad sobre lo que esta herramienta te dice. Las clasificaciones son un punto de partida, no un dogma.
¿Quieres leer más? Tengo algunas publicaciones sobre Log Horizon en mi blog:
| Característica | Descripción |
|---|---|
| Motor de clasificación | Base de conocimiento de 481 entradas que cubre más de 240 conectores, 22 categorías, con estado del ciclo de vida (obsoleto/heredado más tablas de reemplazo) y respaldo heurístico automático para tablas desconocidas |
| Puntuación costo-valor | Matriz de nivel de costo por tabla frente a nivel de detección con evaluación combinada (Alto Valor a Bajo Valor), con precio según el plan observado (Analytics, Basic, Data Lake) |
| Recomendaciones | 13 tipos de acciones priorizadas: candidatos a data lake o Basic, tablas sin detecciones, desperdicio de streaming XDR, filtrado en el momento de la ingesta, candidatos a división, uso de planes, fuentes obsoletas, deficiencias de retención, hallazgos del XDR Checker y del Detection Analyzer, cada uno con estimaciones de ahorro |
| Mapeo de detecciones | Mapea reglas de análisis, consultas de caza y detecciones XDR a cada tabla para detectar brechas de cobertura |
| Etiquetas de correlación | Detecta etiquetas #DONT_CORR# / #INC_CORR# en las descripciones de reglas y marca reglas excluidas de la correlación de Defender |
| Cumplimiento de retención | Compara la retención real con los mínimos recomendados según estándares de la industria y mejores prácticas de seguridad |
| Optimización del SOC | Extrae las propias recomendaciones de mejora del SOC de Microsoft desde la API de Security Insights |
| Análisis de brechas por palabras clave | Marca tablas que deberías estar ingiriendo pero no lo haces, según palabras clave de proveedor/producto |
| Descubrimiento de transformaciones | Descubre reglas de recopilación de datos (DCR) dirigidas al espacio de trabajo (lista de suscripciones filtrada por destino, la DCR de transformación del espacio de trabajo y las asociaciones del espacio de trabajo), analiza transformaciones en línea y de múltiples etapas, y etiqueta cada operación (filtro, proyección, eliminación de columnas, enriquecimiento, agregación) |
| Detección de tablas divididas | Identifica tablas divididas _SPLT_CL y las vincula de vuelta a las tablas principales en el motor de clasificación |
| Generador KQL de división | Genera KQL de división listo para el portal desde una base de conocimiento curada, análisis de reglas en vivo y estadísticas de frecuencia de campos de la comunidad — formato solo de condición que se pega directamente en el editor de reglas de división de Sentinel. Las listas de campos se cruzan con el esquema en vivo de la tabla; cualquier cosa no presente se informa como descartada |
[!CAUTION] Aviso legal
Esta herramienta se desarrolla y mantiene con la ayuda de IA. Ten precaución al usar esta solución y comprende siempre qué estás ejecutando antes de ejecutarla en producción. El desarrollador no asume ninguna responsabilidad por vulnerabilidades o problemas.
Al descargar, instalar o usar esta herramienta, reconoces que has leído, comprendido y aceptado estos términos.
| Lo que necesitas | Versión |
|---|---|
| PowerShell | 7.0+ |
| Módulos Az | Az.Accounts |
| Otros módulos | PwshSpectreConsole 2.6.3+ |
| Opcional | Microsoft.Graph.Authentication (para -IncludeDefenderXDR como usuario con sesión iniciada) |
Los puntos finales siguen el entorno de Azure de la sesión actual de Connect-AzAccount, por lo que los espacios de trabajo de Azure Government y Azure China funcionan sin parámetros adicionales. Los valores de la nube pública se usan cuando no hay ningún entorno disponible.
Si aún no has iniciado sesión en Azure, el módulo iniciará Connect-AzAccount por ti. Si ya lo has hecho, simplemente continuará.
Permisos: Lector de Log Analytics y Lector de Microsoft Sentinel en el espacio de trabajo cubren el análisis. El descubrimiento de transformaciones también necesita Microsoft.Insights/dataCollectionRules/read (Lector de supervisión) en la suscripción o grupo de recursos; sin ello, la ejecución continúa e imprime una advertencia nombrando el permiso faltante. -IncludeDefenderXDR usa Microsoft Graph con CustomDetection.Read.All, que para un usuario con sesión iniciada significa el módulo opcional Microsoft.Graph.Authentication.
Bastante sencillo:```powershell
Install-Module -Name Az.Accounts -Scope CurrentUser Install-Module -Name PwshSpectreConsole -Scope CurrentUser
git clone https://github.com/lnfernux/log-horizon Import-Module ./log-horizon/LogHorizon.psd1
## Uso
### Conceptos básicos
Comienza conectándote a Azure y asegurándote de seleccionar la cuenta y la suscripción correctas:```powershell
Connect-AzAccount
Entonces podemos invocar la herramienta:```powershell Invoke-LogHorizon -SubscriptionId '00000000-0000-0000-0000-000000000000' -ResourceGroup 'rg-sentinel' -WorkspaceName 'my-sentinel-ws'
<img width="860" height="842" alt="{F4FFA929-B24F-490C-BD3D-F75E214BCD93}" src="https://assets.kitploit.com/production/public/readmes/13110/ff9d1da85043d02a216df72913ecf63520310b8d820b1bd1278b8e4aca718494.png" />
También tiene un menú para profundizar en otros resultados:
<img width="395" height="223" alt="{83CE9E6E-F373-49CD-BE05-182DB69F36BE}" src="https://assets.kitploit.com/production/public/readmes/13110/0606a575b10640bd13ebb87b930f74b2438167b5578cb843b412b4fcf273fc26.png" />
### Brechas de palabras clave + Defender XDR
¿Quieres saber si te faltan tablas relacionadas con proveedores específicos? Añade algunas palabras clave. Agrega `-IncludeDefenderXDR` si también quieres el análisis de XDR.```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Keywords 'CrowdStrike','AWS','Okta' -IncludeDefenderXDR
Habilite el análisis de calidad/ruido de reglas basado en incidentes y reglas de automatización:```powershell Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -IncludeDetectionAnalyzer -DetectionLookbackDays 90
### Exportar un informe```powershell
# JSON
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Output json -OutputPath ./report.json
# Markdown
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Output markdown -OutputPath ./report.md
# Static HTML (self-contained, no JS, works offline)
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Output html -OutputPath ./report.html
# Auto-generate timestamped filename by pointing at a directory
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -Output html -OutputPath ./reports/
Ahora puedes actualizar la retención y el tipo de tabla directamente desde la TUI interactiva:
Invoke-LogHorizon normalmente y luego elige Gestionar la retención y el tipo de tabla desde el menú principal para actualizaciones masivas de retención o tipo.Para scripting o automatización, usa el comando público dedicado:```powershell
Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'SigninLogs' -TotalRetentionInDays 365 -WhatIf
Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'AzureDiagnostics','VMConnection' -TargetPlan Basic -TotalRetentionInDays 730
Set-LogHorizonTableRetention -SubscriptionId '...' -ResourceGroupName 'rg' -WorkspaceName 'ws' ` -TableName 'SigninLogs' -RetentionInDays -1 -TotalRetentionInDays -1
### Modo no interactivo / CI
Omite la TUI interactiva y exporta directamente a un archivo, útil para pipelines o ejecuciones programadas:```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -NonInteractive -Output json -OutputPath ./reports/
Si omites -Output, el objeto de análisis se devuelve a la canalización para que puedas pasarlo a tu propia lógica.
La fase de recopilación de datos (uso, reglas, incidentes, tablas, DCR) se almacena en caché de forma predeterminada, por lo que volver a ejecutarla contra el mismo espacio de trabajo, por ejemplo, para exportar un segundo formato o para reabrir la TUI, tarda segundos en lugar de minutos. La caché se encuentra en $env:LOCALAPPDATA\LogHorizon\cache (se puede sobrescribir con -CachePath), un archivo por cada combinación de suscripción, grupo de recursos, espacio de trabajo, -DaysBack, -DetectionLookbackDays, -IncludeDefenderXDR, -IncludeDetectionAnalyzer, los tres parámetros de precio y la versión del módulo. Las entradas más antiguas que -CacheMaxAgeMinutes (60 por defecto) se ignoran, y cada guardado elimina las entradas caducadas para que la carpeta no acumule archivos de otros conjuntos de parámetros o versiones anteriores. Los tokens nunca se escriben en la caché; la autenticación se ejecuta en cada invocación, por lo que el asistente de retención siempre tiene credenciales activas.
El archivo de caché es Clixml en texto plano. Con -IncludeDetectionAnalyzer contiene títulos de incidentes, números, estado y clasificación de tu espacio de trabajo; los propietarios de incidentes, autores de reglas e identidades de propietarios asignados no se recopilan. Usa -NoCache en máquinas compartidas o apunta -CachePath a una ubicación con el control de acceso que necesites.```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -RefreshCache
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -NoCache
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -CacheMaxAgeMinutes 1440
### Ajuste de registros y KQL de división
La TUI interactiva incluye un menú de **Ajuste de registros / Transformaciones** con sugerencias de ajuste en vivo (uso de campos de tus reglas implementadas y consultas de caza), KQL de división basado en la base de conocimiento y un evaluador por tabla. Cada bloque KQL es solo de condición y se pega directamente en el editor de reglas de división de Sentinel, con atribución de fuente (base de conocimiento, análisis de reglas o combinado).
### Precios personalizados
Los precios predeterminados son los de Europa Occidental Simplified PAYG en USD: 5,59 $/GB Analytics, 1,15 $/GB Basic, 0,20 $/GB Data Lake (0,07 de ingesta + 0,13 de procesamiento). Cada tabla se factura según el plan observado en la tabla `Usage`, y el estado gratuito proviene de `Usage.IsBillable`. Los volúmenes usan GB de facturación (1000 MB). Si tu nivel de compromiso es diferente:```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' -PricePerGB 4.61 -BasicPricePerGB 1.15 -LakePricePerGB 0.20
| Parámetro | Tipo | Obligatorio | Predeterminado | Descripción |
|---|---|---|---|---|
-SubscriptionId | string | Sí | - | ID de suscripción de Azure |
-ResourceGroup | string | Sí | - | Grupo de recursos que contiene el espacio de trabajo de Sentinel |
-WorkspaceName | string | Sí | - | Nombre del espacio de trabajo de Log Analytics |
-WorkspaceId | string | No | - | ID del espacio de trabajo (se resuelve automáticamente si se omite) |
-Output | string | No | - | Formato de exportación: json, markdown / md o html (alias -o) |
-OutputPath | string | No | - | Ruta de archivo o directorio para la exportación. Un directorio existente o un separador final genera un nombre de archivo con marca de tiempo; un nombre de archivo sin extensión recibe la extensión del formato; los directorios faltantes se crean |
-Keywords | string[] | No | - | Palabras clave para el análisis de brechas (p. ej. 'AWS','CrowdStrike', alias -kw) |
-IncludeDefenderXDR | switch | No | - | Incluir el análisis de detecciones personalizadas de Defender XDR |
-IncludeDetectionAnalyzer | switch | No | - | Incluir el análisis de detecciones ruidosas por regla mediante incidentes y reglas de automatización |
-DetectionLookbackDays | int | No | 90 | Ventana de consulta para el análisis de detecciones basado en incidentes/automatización (1-365 días) |
-DaysBack | int | No | 90 | Ventana de consulta para los datos de uso (1-365 días) |
-PricePerGB | decimal |
Así que hay cuatro fases.
El módulo se conecta a Azure y extrae datos de las API de Log Analytics, Security Insights, Azure Monitor y Microsoft Graph. Cada llamada pasa por un envoltorio de reintentos (errores 429, 5xx y de transporte) y, a menos que se establezca -NoCache, los datos recopilados se almacenan en caché localmente para la siguiente ejecución.
| Fuente de datos | API | Qué capturamos |
|---|---|---|
| Uso de tablas | Tabla Usage (KQL) | Volumen de ingesta, plan y marca de facturación por tabla durante la ventana de consulta |
| Reglas de análisis | Security Insights REST | Reglas de detección activas + qué tablas consultan + etiquetas de correlación, además de consumidores de tablas implícitos para tipos de reglas no KQL |
| Consultas de búsqueda | Búsquedas guardadas de Log Analytics REST | Consultas de búsqueda guardadas + tablas referenciadas |
| Conectores de datos | Security Insights REST | Inventario de conectores instalados |
| Optimización de SOC | Security Insights REST (vista previa) | Recomendaciones de SOC integradas de Microsoft |
| Retención de tablas | Log Analytics Tables REST | Retención por tabla, archivo, plan (Analytics/Basic/Auxiliary), indicadores de herencia predeterminada y columnas de esquema |
| Reglas de recopilación de datos | Azure Monitor REST | DCR que apuntan al espacio de trabajo (lista de suscripciones, DCR de transformación del espacio de trabajo, asociaciones) y sus transformaciones |
| Defender XDR | Microsoft Graph | Reglas de detección personalizadas de XDR (opcional; CustomDetection.Read.All delegado o un token de Az Graph) |
| Incidentes | Security Insights REST | Resultados de incidentes (estado/clasificación), tiempos y pistas de vinculación de reglas para la puntuación de calidad de reglas |
| Reglas de automatización | Security Insights REST | Acciones de cierre de incidentes a nivel de regla y condiciones de coincidencia de títulos para la atribución de cierre automático |
| SentinelHealth | Log Analytics KQL | Eventos de ejecución de reglas de automatización con números de incidente para una atribución definitiva de cierre automático (opcional, requiere monitoreo de salud) |
Cada tabla se clasifica mediante dos pasadas:
Primero, una búsqueda directa contra la base de conocimiento de 481 entradas en Data/log-classifications.json. Cada entrada incluye el nombre del conector, clasificación primaria/secundaria, categoría de seguridad, asignaciones de fuentes de datos MITRE, un nivel de precios y retención recomendados, e indicadores de ciclo de vida opcionales (obsoletos/heredados con tablas de reemplazo, capacidad de transmisión XDR, plataforma).
Si no hay coincidencia, entran en juego reglas heurísticas, en este orden:
Alert, Incident, Threat, Signin, Logon, Audit, Risk, Detection (coincidencia al inicio de palabras en PascalCase) -> primariaFlow, Metric, Diagnostic, Perf, Heartbeat, Health, Inventory, Usage -> secundariaAAD, Microsoft, Azure, Defender, Purview, Entra, Sentinel, Office, Intune, Windows ...) -> primaria, marcada para revisión y adición a la base de datos*Log/*Logs -> secundariaCada tabla se puntúa en varias dimensiones:
tablasConReglas / totalTablas * 100. La cobertura por tabla suma reglas de análisis + consultas de búsqueda encontradas al analizar KQL en busca de nombres de tablas.Data/implicit-consumers.json las asigna (coincidencia de Threat Intelligence -> ThreatIntelIndicators/ThreatIntelObjects, Fusion -> SecurityAlert/Anomalies, UEBA -> BehaviorAnalytics/UserPeerAnalytics/IdentityInfo, creación de incidentes de Microsoft -> SecurityAlert). Las reglas habilitadas de esos tipos cuentan para la cobertura efectiva, y cada tabla informa un CoverageSource de kql, xdr, implicit, platform o none. Las tablas de plataforma que Sentinel escribe para sí mismo (SecurityIncident, SentinelHealth, Watchlist, Usage ...) nunca se marcan como cobertura faltante y reciben la evaluación Platform.Luego el módulo genera recomendaciones (13 tipos):
| Tipo | Cuándo se activa | Qué hacer |
|---|---|---|
| Data Lake | Secundaria + costo alto + pocas detecciones, y la tabla admite el plan Auxiliary (se recurre a una sugerencia de plan Basic cuando solo se admite Basic) | Mover al nivel Auxiliary/Data Lake; el ahorro es el costo actual menos el mismo volumen a la tarifa del lake (o Basic) |
| Bajo valor | Costo alto + cero detecciones | Añadir reglas, filtrar o mover a data lake |
| Optimizar XDR | Transmitida por XDR + 0 reglas de Sentinel + existen reglas XDR | Detener la transmisión, usar el portal XDR unificado en su lugar |
| Cobertura faltante | Primaria + cero detecciones (no tablas de plataforma) | Escribir reglas de análisis para obtener valor de los datos |
| Filtro en ingesta | Primaria + >20 GB + <=3 detecciones | Aplicar transformación en ingesta para reducir volumen |
| Candidata a división | Primaria + alto volumen + detecciones + sin transformación existente | Dividir la tabla para que las filas de alto valor permanezcan en Analytics y el resto vaya a Data Lake |
| Uso del plan | Las filas de uso muestran más de un plan, o el plan configurado difiere de lo observado en Usage | Revisar si la transición de plan fue esperada |
| Fuente obsoleta | Una tabla marcada como obsoleta o heredada en la base de datos aún está ingiriendo | Migrar las detecciones a las tablas de reemplazo y luego retirar el conector antiguo. Informativo: no se reclaman ahorros porque la ingesta se mueve en lugar de desaparecer |
| Deficiencia de retención | La retención del espacio de trabajo o de la tabla está por debajo de la línea base de 90 días | Aumentar la retención total/archivo para cumplir con las pautas regulatorias |
| Mejora de retención | Tabla de pago, no de plataforma, que cumple 90 días pero está por debajo de la recomendación de categoría | Considerar una retención total más larga |
| Por debajo de la línea base interactiva | Tabla de Analytics con retención interactiva (en caliente) inferior a 90 días | Elevar la retención interactiva a los 90 días que incluye Sentinel, a menos que la ventana en caliente corta sea deliberada |
| Verificador XDR | Tabla conocida de Defender XDR no transmitida, transmitida sin cobertura, no reenviada a Data Lake o por debajo del aviso de un año |
Las recomendaciones se ordenan una vez, Alta > Media > Baja y luego por ahorro estimado, y cada salida (JSON, Markdown, HTML, TUI) mantiene ese orden.
Cuando pasas -IncludeDetectionAnalyzer, el módulo obtiene incidentes recientes y reglas de automatización, y luego puntúa cada regla de análisis habilitada por posible ruido.
Métricas por regla (calculadas a partir de datos de incidentes):
| Métrica | Cómo se calcula |
|---|---|
| Total de incidentes | Conteo de incidentes vinculados a la regla |
| Proporción de cierre automático | Incidentes cerrados por reglas de automatización ÷ total de incidentes. Fuente principal: tabla SentinelHealth (ejecuciones de reglas de automatización por reglas de cierre de incidentes o playbooks habilitados, coincidencia por número de incidente). Respaldo: coincidencia de condiciones de reglas de automatización (ID de regla analítica, título y condiciones de severidad, combinadas con AND como hace Sentinel). Las reglas cuyas condiciones son solo estado/tácticas/entidades se tratan como aplicables a cada incidente. |
| Proporción de falsos positivos | Incidentes clasificados como falsos positivos ÷ total de incidentes |
Fórmula de puntuación de ruido:
Cada métrica se convierte en un rango percentil entre todas las reglas que tienen al menos un incidente. La puntuación compuesta es una combinación ponderada:``` Score = (Volume_percentile × 0.35) + (AutoClose_percentile × 0.40) + (FalsePositive_percentile × 0.25)
- **Percentil de volumen (35%)**: cuántos incidentes genera una regla en relación con otras reglas.
- **Percentil de AutoClose (40%)**: con qué frecuencia los incidentes se cierran automáticamente mediante reglas de automatización (el mayor peso porque el cierre automatizado es la señal más fuerte de alertas de bajo valor).
- **Percentil de falsos positivos (25%)**: con qué frecuencia los analistas clasifican el resultado como falso positivo.
**Umbrales de puntuación**:
| Puntuación | Etiqueta | Significado |
|---|---|---|
| ≥ 70 | Ruidosa | Es probable que la regla necesite ajustes o deshabilitarse |
| ≥ 50 | Vigilar | La regla muestra signos tempranos de ruido |
| < 50 | Saludable | La regla está dentro del rango normal |
| N/D | - | La regla no tiene incidentes correlacionados, o menos de 3 reglas tienen incidentes, por lo que no hay nada contra qué clasificar |
Los incidentes se agrupan por id de regla analítica (con respaldo al nombre de la regla y luego al título), por lo que dos reglas que comparten un nombre visible se puntúan por separado.
Las reglas con una puntuación ≥ 70 y al menos 5 incidentes se muestran automáticamente como **recomendaciones de alta prioridad** en la vista de Recomendaciones.
### 5. Panel interactivo
El menú principal ofrece estas vistas:
- **Panel**: estadísticas generales, las 10 tablas más costosas (las fuentes obsoletas y heredadas llevan una insignia), barra de cobertura, resumen de cumplimiento de retención, aviso de exclusiones de correlación
- **Ver recomendaciones**: acciones priorizadas con ahorros mensuales estimados, expandibles para mostrar la lista completa cuando hay más de 10
- **Ver evaluación de detección**: resumen de la matriz costo-valor, cobertura de reglas y consultas de búsqueda por tabla, desglose primario/secundario, listado de reglas excluidas de correlación
- **Ver analizador de detección**: clasificación de reglas ruidosas basada en percentiles con indicadores de calidad de cierre (cuando usaste `-IncludeDetectionAnalyzer`), navegador de reglas con búsqueda
- **Ver optimización de SOC**: sugerencias de mejora propias de Microsoft con desglose
- **Ver evaluación de retención**: tablas por debajo de los mínimos recomendados con retención actual frente a la recomendada, tipo de plan y déficit, además de filas de asesoramiento XDR
- **Ver transformaciones de datos**: inventario de transformaciones DCR con clasificación de tipo de transformación y KQL completo por tabla
- **Ajuste de registros / transformaciones**: sugerencias de ajuste en vivo, KQL dividido por base de conocimiento y un evaluador por tabla con cambio de retención/tipo de una sola tabla
- **Ver todas las tablas**: la lista completa con clasificación, planes, costo, reglas, retención (codificada por colores) y evaluación; selecciona una tabla para un panel de detalles (fuentes de cobertura, soporte de plan, retención, estado, sus recomendaciones)
- **Gestionar retención y tipo de tabla**: asistente de retención y plan en lote con vista previa y aplicación
- **Diccionario**: cada término que usa la herramienta (clasificación, niveles de costo y detección, evaluaciones, fuentes de cobertura, los 13 tipos de recomendación, métricas y etiquetas de puntuación del analizador de detección, planes de tabla, estado del ciclo de vida, estados XDR, tipos de transformación) con las mismas definiciones que este README, servido desde `Data/dictionary.json`
- **Exportar informe**: elige un formato y luego una ruta (directorio para un archivo con marca de tiempo, o un nombre de archivo; Enter mantiene el directorio actual) y escribe JSON, Markdown o HTML directamente desde el menú
- **Análisis XDR** aparece en el panel cuando usaste `-IncludeDefenderXDR`
---
## La base de datos de clasificaciones
Ubicada en `Data/log-classifications.json`. **481 entradas**, **243 conectores**, **22 categorías**.
### Qué contiene cada entrada
| Campo | Qué contiene |
|---|---|
| `tableName` | Nombre de la tabla de Log Analytics (`SecurityEvent`, `SigninLogs`, etc.) |
| `connector` | Qué conector de datos produce esta tabla |
| `classification` | `primary` (valor de seguridad) o `secondary` (telemetría de soporte) |
| `category` | Categoría de seguridad: Identity & Access, Network Security, etc. |
| `description` | Resumen en lenguaje sencillo de qué contiene la tabla |
| `keywords` | Términos para la coincidencia en el análisis de brechas por palabras clave |
| `mitreSources` | Asignaciones de fuentes de datos MITRE ATT&CK |
| `recommendedTier` | `analytics` (nivel activo) o `datalake` (candidato auxiliar) |
| `recommendedRetentionDays` | Retención total mínima recomendada en días (orientación regulatoria) |
| `isFree` | Si Microsoft ingiere esta tabla de forma gratuita (el tiempo de ejecución usa `Usage.IsBillable` primero) |
| `status` | Opcional. `deprecated` (conector retirado o ingesta detenida) o `legacy` (ruta de recopilación más antigua con un sucesor documentado) |
| `replacedBy` | Opcional. Nombres de tablas a las que migrar; presente siempre que `status` esté definido (puede estar vacío) |
| `xdrStreamable` | Opcional, solo tablas de Defender. `true` para las 21 tablas que transmite el conector Defender XDR; `false` para tablas solo de portal y TVM |
| `platform` | Opcional. `true` para tablas que el propio Sentinel consume (`SecurityIncident`, `Usage`, `Watchlist`, ...) que nunca necesitan reglas analíticas |
Las tablas con un `status` muestran una insignia en la TUI y en los informes, y cualquier tabla que aún ingiera genera una recomendación `DeprecatedSource` que nombra el reemplazo. Las tablas con `xdrStreamable: false` nunca se tratan como candidatas de transmisión XDR por el verificador XDR.
### Datos de seguridad primarios frente a secundarios
**Primarios** (278 entradas): las tablas sobre las que realmente construyes detecciones. Registros de inicio de sesión, alertas de seguridad, inteligencia de amenazas, rastros de auditoría, hallazgos de vulnerabilidades, aciertos de firewall, telemetría EDR.
**Secundarios** (203 entradas): material de soporte. Métricas de rendimiento, diagnósticos de infraestructura, volúmenes de flujo de red, instantáneas de inventario, líneas base de configuración, comprobaciones de salud.
### Categorías de un vistazo
| Categoría | Recuento | Ejemplos |
|---|---|---|
| Identity & Access | 51 | `SigninLogs`, `MicrosoftServicePrincipalSignInLogs`, `OktaSSO` |
| Network Security | 49 | `AZFWNetworkRule`, `NSPAccessLogs`, `DarktraceModelAlerts_CL` |
| Cloud Control Plane | 37 | `AzureActivity`, `AZKVAuditLogs`, `GoogleWorkspaceReports` |
| Network Flow | 36 | `NTANetAnalytics`, `CommonSecurityLog`, `AZFWFatFlow` |
| Endpoint Detection | 33 | `DeviceProcessEvents`, `CrowdStrikeAuditEvents`, `SentinelOneAlertsV2_CL` |
| Application Logs | 32 | `AppServiceHTTPLogs`, `AppServiceAuditLogs`, `DynatraceAttacksV2_CL` |
| Email Security | 29 | `EmailEvents`, `CampaignInfo`, `Ttp_Url_CL` |
| Security Alerts | 29 | `SecurityAlert`, `SentinelBehaviorInfo`, `DisruptionAndResponseEvents` |
| Vulnerability Mgmt | 23 | `DeviceTvmSoftwareVulnerabilities`, `Rapid7InsightVMCloudVulnerabilities` |
| Cloud Security | 20 | `EnrichedMicrosoft365AuditLogs`, `OAuthAppInfo`, `PowerAppsActivity` |
| Endpoint Telemetry | 18 | `DeviceInfo`, `Windows365NetworkLogs`, `SentinelOneAgents_CL` |
| Posture Management | 17 | `ExposureGraphNodes`, `SecurityNestedRecommendation`, `ZTSMetadata` |
| Data Security | 16 | `PurviewDataSensitivityLogs`, `DataSecurityEvents`, `PowerPlatformDlpActivity` |
| Data Platform | 16 | `SQLSecurityAuditEvents`, `CDBControlPlaneRequests`, `SnowflakeLogin_CL` |
| Platform Health | 14 | `SentinelHealth`, `Usage`, `SecurityCaseEvent` |
| Container & K8s | 13 | `AKSAudit`, `CloudProcessEvents`, `GKEAudit` |
| Infrastructure Diag | 13 | `AzureMetrics`, `AGWPerformanceLogs`, `ContainerAppSystemLogs` |
| Threat Intelligence | 10 | `ThreatIntelIndicators`, `ThreatIntelObjects`, `CybleVisionAlerts_CL` |
| Configuration Mgmt | 8 | `ConfigurationData`, `AVNMRuleCollectionChange` |
| SAP Security | 7 | `ABAPAuditLog`, `SAPBTPAuditLog_CL`, `Onapsis_Defend_CL` |
| Storage Access | 6 | `StorageBlobLogs`, `CloudStorageAggregatedEvents`, `AWSS3ServerAccess` |
| IoT/OT Security | 4 | `RadiflowEvent`, `DragosAlerts_CL`, `Phosphorus_CL` |
### Soporte de planes de tabla
`Data/basic-plan-tables.json` y `Data/auxiliary-plan-tables.json` enumeran las tablas integradas que la [matriz de características de tablas de Azure Monitor](https://learn.microsoft.com/en-us/azure/azure-monitor/reference/tables-features) marca como compatibles con los planes Basic y Auxiliary (Data Lake). El asistente de retención usa la lista Basic para validar cambios de plan, y la recomendación `DataLake` solo propone el nivel de lake para tablas que lo admiten, recurriendo a una sugerencia de plan Basic donde ese sea el nivel más bajo compatible. Las tablas personalizadas basadas en DCR admiten ambos planes; las tablas personalizadas Classic no admiten ninguno. Ambos archivos se regeneran a partir de esa matriz en cada versión.
### Clasificaciones personalizadas
Puedes proporcionar tu propio archivo de clasificación para **agregar** entradas de tablas que no estén en la base de datos integrada, o **anular** entradas existentes cuando los valores predeterminados no coincidan con tu entorno. Las entradas personalizadas tienen prioridad sobre las integradas cuando el mismo `tableName` aparece en ambas.```powershell
Invoke-LogHorizon -SubscriptionId '...' -ResourceGroup 'rg' -WorkspaceName 'ws' `
-CustomClassificationPath './my-classifications.json'
El archivo personalizado utiliza el mismo esquema que Data/log-classifications.json, un array de objetos:```json
[
{
"tableName": "MyCustomApp_CL",
"connector": "Custom Logs (DCR)",
"classification": "primary",
"category": "Application Logs",
"description": "Security-relevant audit events from an internal application",
"keywords": ["custom", "internal", "audit"],
"mitreSources": [],
"recommendedTier": "analytics",
"isFree": false
},
{
"tableName": "AzureMetrics",
"connector": "Azure Monitor",
"classification": "primary",
"category": "Infrastructure Diag",
"description": "Override: promoted to primary because we detect on Azure resource metrics in this environment",
"keywords": ["metrics", "azure", "infrastructure", "monitoring"],
"mitreSources": [],
"recommendedTier": "analytics",
"isFree": false
}
]
Consulta `Data/custom-classifications-example.json` para ver una plantilla lista para usar.
### Cómo se construyeron las clasificaciones
La clasificación primaria/secundaria se realizó en parte por el autor y luego alimentando el conector de datos y las definiciones de tablas de Microsoft a una IA con una línea base de clasificación humana, utilizando las mejores prácticas de Microsoft y los estándares de la industria como criterios de clasificación. Si algo parece incorrecto para tu entorno, confía en tu propio contexto por encima de la herramienta: la IA puede cometer errores, y el contexto es el rey.
Los criterios de clasificación se extrajeron de las siguientes fuentes:
**ACSC (Dirección de Señales de Australia, Centro Australiano de Ciberseguridad)**
- [ACSC: Mejores prácticas para el registro de eventos y la detección de amenazas (ago. 2024)](https://www.cyber.gov.au/sites/default/files/2024-08/best-practices-for-event-logging-and-threat-detection.pdf)
- [ACSC: Registros prioritarios para la ingesta en SIEM - Guía para profesionales (may. 2025)](https://www.cyber.gov.au/business-government/detecting-responding-to-threats/event-logging/implementing-siem-soar-platforms/priority-logs-for-siem-ingestion-practitioner-guidance)
**CISA (Agencia de Ciberseguridad e Infraestructura)**
- [CISA: Guía para implementar M-21-31: Mejora de las capacidades de investigación y remediación del Gobierno Federal](https://www.cisa.gov/sites/default/files/2023-02/TLP%20CLEAR%20-%20Guidance%20for%20Implementing%20M-21-31_Improving%20the%20Federal%20Governments%20Investigative%20and%20Remediation%20Capabilities_.pdf)
- [CISA: Libro de jugadas de implementación de registros en la nube ampliados de Microsoft (2025)](https://www.cisa.gov/sites/default/files/2025-01/microsoft-expanded-cloud-logs-implementation-playbook-508c.pdf)
**Microsoft**
- [Referencia de conectores de datos de Microsoft Sentinel](https://learn.microsoft.com/en-us/azure/sentinel/data-connectors-reference)
- [Referencia de tablas y conectores de Microsoft Sentinel](https://learn.microsoft.com/en-us/azure/sentinel/sentinel-tables-connectors-reference)
- [Repositorio de GitHub de Azure-Sentinel](https://github.com/Azure/Azure-Sentinel) (reglas de análisis de la comunidad, definiciones de conectores, plantillas de soluciones)
- [Facturación de Microsoft Sentinel](https://learn.microsoft.com/azure/sentinel/billing)
- [Gestión de niveles de datos de Microsoft Sentinel](https://learn.microsoft.com/azure/sentinel/manage-data-overview)
**MITRE**
- [Fuentes de datos de MITRE ATT&CK](https://attack.mitre.org/datasources/)
**NIST (Instituto Nacional de Estándares y Tecnología)**
- [NIST SP 800-92: Guía para la gestión de registros de seguridad informática](https://csrc.nist.gov/pubs/sp/800/92/final)
**NSA (Agencia de Seguridad Nacional)**
- Guía de reenvío de eventos cibernéticos de la NSA
**NCSC-UK (Centro Nacional de Ciberseguridad - Reino Unido)**
- "¿Qué deberíamos registrar exactamente?" del NCSC-UK
**Google Cloud**
- [Descripción general de los registros de auditoría de Google Cloud](https://docs.cloud.google.com/logging/docs/audit)
- [Mejores prácticas de registros de auditoría de Google Cloud](https://docs.cloud.google.com/logging/docs/audit/best-practices)
También se utilizaron otras fuentes, junto con la "experiencia" de los autores, si se puede categorizar como tal.
---
## Estructura del proyecto```
LogHorizon.psd1 Module manifest (v0.9.0)
LogHorizon.psm1 Module loader
Public/
Invoke-LogHorizon.ps1 Entry point, the main orchestrator
Set-LogHorizonTableRetention.ps1 Scriptable table retention and plan changes
Private/
Connect-Sentinel.ps1 Azure auth + workspace resolution
Get-TableUsage.ps1 KQL query for ingestion volumes
Get-AnalyticsRules.ps1 Analytics rules + table/field extraction + correlation tags
Get-HuntingQueries.ps1 Hunting queries + table extraction
Get-DataConnectors.ps1 Data connector inventory
Get-DataTransforms.ps1 DCR transform discovery, split KQL generation
Get-DefenderXDR.ps1 Defender XDR analysis (optional)
Get-Incidents.ps1 Incident fetch + SentinelHealth auto-close attribution
Get-AutomationRules.ps1 Automation rule inventory + close-logic attribution
Get-SocOptimization.ps1 SOC improvement recommendations
Get-TableRetention.ps1 Per-table retention, archive, and plan type
Get-CollectionCache.ps1 Collection cache (key, path, read, write)
Get-LogHorizonEndpoint.ps1 ARM / Log Analytics / Graph endpoints for the signed-in Azure environment
Get-LogHorizonDictionary.ps1 Loads the term dictionary shown by the Dictionary menu
Invoke-AzRestWithRetry.ps1 REST wrapper: retry on 429/5xx/transport errors, async operation polling
Invoke-Classification.ps1 Static DB + heuristic classification + _SPLT_CL detection + custom file validation
Invoke-Analysis.ps1 Cost-value matrix + recommendations + Detection Analyzer + XDR Checker + split suggestions
Set-TableRetention.ps1 Retention change set, preview, Tables API apply engine, plan support lookups
Write-Report.ps1 Spectre.Console TUI rendering
Export-Report.ps1 JSON / Markdown / static HTML export with shared section renderer
Data/
log-classifications.json 481-entry classification knowledge base
basic-plan-tables.json Built-in tables that support the Basic plan (from the Azure Monitor feature matrix)
auxiliary-plan-tables.json Built-in tables that support the Auxiliary / Data Lake plan
implicit-consumers.json Non-KQL rule kinds to tables, plus platform tables
dictionary.json Term definitions for the Dictionary menu (kept 1:1 with this README, enforced by tests)
high-value-fields.json Split KQL knowledge base: 165 tables with curated fields and split hints
field-frequency-stats.json Community field frequency stats mined from the Azure-Sentinel rule corpus
custom-classifications-example.json Example custom classification override file
ReportTemplate.html Static HTML report template (pure-CSS tabs, zero JS, CSP meta)
Tests/
LogHorizon.Tests.ps1 437 Pester v5 unit tests
Las bases de conocimiento KQL divididas, high-value-fields.json y field-frequency-stats.json, se construyen sin conexión a partir del repositorio público Azure/Azure-Sentinel (Solutions/, Detections/, Hunting Queries/, aproximadamente 3.800 archivos de reglas YAML). Cada consulta se procesa con los mismos Get-TablesFromKql y Get-FieldsFromKql que el módulo utiliza en tiempo de ejecución para generar recuentos de frecuencia de campos por tabla, a partir de los cuales se derivan tres niveles de campos de respaldo:
TimeGenerated)Los campos extraídos se fusionan en el archivo curado high-value-fields.json (las entradas curadas se conservan, y las tablas recién descubiertas con al menos 3 reglas y 3 campos significativos se añaden).
En tiempo de ejecución, Get-SplitKql utiliza una jerarquía de respaldo: entrada curada de la KB -> análisis de campos de reglas/búsquedas en vivo -> estadísticas comunitarias por tabla -> valores predeterminados por categoría -> campos universales. La frecuencia de campos no es un método perfecto, pero es útil conocerlo.
437 pruebas de Pester v5, sin necesidad de conectividad con Azure. Ejecútelas desde una sesión normal de PowerShell en lugar de la terminal integrada de VS Code:```powershell Invoke-Pester ./Tests/LogHorizon.Tests.ps1 -Output Detailed
## Licencia
GPL-3.0. Consulta [LICENSE](https://github.com/lnfernux/log-horizon/blob/main/LICENSE).
## Historial de versiones
| Versión | Fecha | Cambios |
|---|---|---|
| 0.9.0 | 2026-09-06 | Versión de remediación a partir de una revisión completa de código y datos. Corrección: precios según el plan desde `Usage.Plan` y `Usage.IsBillable` con tarifas Basic y Data Lake y GB facturables (1000 MB), atribución de cierre automático de Detection Analyzer restringida a reglas de cierre/playbook habilitadas (`triggeringLogic.isEnabled`), incidentes mediante `2025-09-01` con `$top=1000`, cobertura implícita para tipos de reglas que no son KQL y tablas de plataforma (`implicit-consumers.json`), comprobación de línea base de retención interactiva, ordenación única de recomendaciones. Transformaciones: descubrimiento de DCR en el ámbito de la suscripción filtrado por el espacio de trabajo de destino más el DCR de transformación del espacio de trabajo y sus asociaciones, con estado visible y advertencia cuando falta un permiso; análisis de transformaciones de espacio de trabajo y de múltiples etapas; KQL dividido intersectado con el esquema de tabla en vivo. Robustez: caché de recopilación activada por defecto (`-NoCache`, `-RefreshCache`, `-CacheMaxAgeMinutes`, `-CachePath`), autenticación antes del spinner con advertencias impresas después, salida TUI y Markdown escapada, resolución de rutas de exportación que crea directorios y devuelve la ruta escrita, meta CSP en HTML, reintentos REST en errores de transporte y finalización asíncrona tipo Location, resolución del espacio de trabajo mediante REST (se eliminó `Az.Resources`), validación de clasificación personalizada, heurísticas sensibles a PascalCase con respaldo de Microsoft de primera parte, tiempos de espera de regex. Los puntos finales siguen el entorno de Azure con sesión iniciada (Government, China) y las versiones de API se movieron a SecurityInsights `2025-09-01`, OperationalInsights `2025-07-01`, recomendaciones `2025-10-01-preview`. Datos: base de datos de clasificación 345 -> 481 entradas con claves `status`/`replacedBy`/`xdrStreamable`/`platform`, más de 80 tablas de primera parte y 35 sucesoras, correcciones de etiquetas de conectores, correcciones de `isFree`; `basic-plan-tables.json` regenerado y nuevo `auxiliary-plan-tables.json` a partir de la matriz de características de tablas de Azure Monitor; recomendación `DeprecatedSource`, recomendación de Data Lake según el plan con respaldo Basic, XDR Checker respeta la capacidad de transmisión, insignias de ciclo de vida en TUI y exportaciones. Pase de revisión: la clave de caché cubre precios y versión del módulo, booleanos y niveles de clasificación personalizada analizados en lugar de convertidos, atribución de cierre automático sensible a la gravedad, predicados KQL divididos comprobados contra el esquema en vivo, estado de captura XDR mostrado en lugar de un `$null` silencioso, rutas de salida sin extensión son archivos, identidades de propietarios de incidentes ya no se recopilan. Menú de diccionario en la TUI con cada término que usa la herramienta, respaldado por `Data/dictionary.json` y fijado al código mediante pruebas. Los objetos de reglas de automatización y detección personalizada de Defender se proyectan a los campos consumidos, por lo que las identidades de autores (createdBy, lastModifiedBy, propietarios asignados) nunca llegan a la caché ni a las exportaciones. Licencia GPL-3.0. 437 pruebas |
| 0.8.0 | 2026-05-26 | Se añadió gestión interactiva de retención de tablas con un nuevo flujo TUI masivo y punto de entrada de actualización de tabla única, además del comando público `Set-LogHorizonTableRetention`. Se añadió motor de aplicación PATCH de Tables API con validación, sondeo de operaciones asíncronas de Azure y respaldo de dos pasos (PATCH combinado, luego solo plan más solo retención) para actualizaciones de retención resilientes. Se añadió cobertura Pester enfocada para validación, forma de carga útil, respaldo y mapeo de comandos públicos. También corrige un caso límite/error donde los usuarios recibían recomendaciones para cambiar tablas de data lake al nivel data lake si aún tenían datos de análisis en Sentinel |
| 0.7.1 | 2026-05-15 | Se añadió conocimiento del plan desde `Usage.Plan` sin reemplazar el plan de tabla configurado: el análisis ahora rastrea el historial de planes observado, marca uso de múltiples planes y discrepancias configurado-vs-observado, y muestra datos del plan en el panel, desglose de tablas, Ver Todas las Tablas, evaluación de retención y exportaciones. Se corrigió la atribución de cierre automático de Detection Analyzer para que la heurística de tiempo solo se aplique cuando no existen reglas de automatización habilitadas. 203 pruebas aprobadas |
| 0.7.0 | 2026-04-16 | Evaluación de Detección actualizada con tabla resumen de matriz costo-valor (Primaria/Secundaria x7 categorías de evaluación con codificación de colores), submenú de desglose para tablas primarias/secundarias con columnas de nivel de costo/detección. Detection Analyzer actualizado con barras de cobertura de volumen ponderadas por GB (GB de detección/caza/combinado como porcentaje de la ingesta total junto a las barras existentes de recuento de tablas). Mejoras de visualización adaptativa para Detection Analyzer (ancho de barra dinámico, truncamiento de nombres de reglas, ocultación condicional de columnas según el ancho de consola). 193 pruebas aprobadas |
| 0.6.3 | 2026-04-11 | Actualización menor para PSGallery |
| 0.6.2 | 2026-04-11 | Menú Log Tuning / Transforms: análisis de ajuste de datos en vivo (uso de campos por tabla a partir de reglas/consultas de caza implementadas, generación de KQL de filtro/proyección/combinado, estimaciones de ahorro), extracción de columnas de esquema desde Tables API, jerarquía de respaldo de `Get-SplitKql` (estadísticas de comunidad → valores predeterminados de categoría → campos universales), evaluador integral de tablas con matriz de uso de campos, secciones de exportación unificadas de KB + ajuste en vivo, script de minería `Build-FieldKnowledgeBase.ps1` para el corpus de reglas de Azure-Sentinel en GitHub. Detection Analyzer: atribución de cierre automático basada en SentinelHealth (principal) con respaldo de coincidencia de reglas consciente del operador, análisis de envoltorio de condiciones booleanas, detección de estado Resolved, coincidencia de cola GUID para ID de recursos ARM. La cobertura ahora se basa en recuento de tablas en todas las tablas (incluido el nivel gratuito). Se añadió aviso de puntuación a TUI y exportaciones. 174 pruebas |
| 0.6.1 | 2026-04-10 | Correcciones de errores: el filtrado de `$kqlKeywords` ahora se comparte en el ámbito del archivo (estaba indefinido en `Get-TablesFromKql`), se añadió `[CmdletBinding()]` a todas las funciones auxiliares, comprobación unificada de Defender simplificada, se eliminó el parámetro fantasma de prueba `-RuleCount`. Robustez: paginación de `Get-HuntingQueries`, envoltorio de reintento `Invoke-AzRestWithRetry` con retroceso exponencial para 429/5xx, validación de `PricePerGB`, `Write-Verbose` en funciones clave. Documentación: insignia de versión, recuento de BD, requisitos previos alineados con el manifiesto |
| 0.6.0 | 2026-04-10 | Detección dinámica de transmisión XDR con 21 `KnownXDRTables` (antes 18 codificados), `XDRState` por tabla (`NotStreaming`/`Analytics`/`Basic`/`Auxiliary`), Auxiliary reconocido como nivel data lake, tablas XDR no transmitidas mostradas como recomendaciones de Información/Baja con `NotStreamedCount`, analizador de retención muestra tablas XDR no transmitidas como "XDR only (30d)", desglose de niveles en vista general (analytics/basic/data lake + no transmitido), etiquetas Auxiliary→"data lake" en Export-Report, BD de clasificación actualizada a 345 entradas (+`DeviceNetworkInfo`, `DeviceInfo`→secundaria/data lake, `DeviceImageLoadEvents` e `IdentityQueryEvents`→nivel data lake), 15 nuevas pruebas Pester (121 en total) |
| 0.5.0 | 2026-04-03 | Exportación HTML estática con pestañas CSS puras (cero JS, sin CDN, totalmente autocontenida), renderizador unificado de secciones MD/HTML, captura completa de datos JSON (dataTransforms, correlationExcluded/Included, streamingTables), interruptor `-NonInteractive` para uso en CI/pipelines, alias de formato `md`, nombres de archivo automáticos con marca de fecha y hora, visualización completa de KQL en transformaciones DCR (sin truncamiento), manejo de KQL multilínea en tablas markdown, corrupción de retroreferencia `$` de regex corregida en reemplazo de tokens HTML, helpers internos renombrados para evitar conflictos de alias de PowerShell (`h`→`hEnc`, `md`→`mdEsc`), 33 nuevas pruebas Pester (106 en total) |
| 0.4.1 | 2026-04-03 | Correcciones de seguridad y estabilidad: se añadió saneamiento de memoria de tokens, validación de rutas de salida y protección XSS, límites de paginación de API REST, corrección del enmascaramiento de errores del cargador de módulos y resolución de advertencias de PSScriptAnalyzer |
| 0.4.0 | 2026-04-02 | Descubrimiento de transformaciones (listado de DCR + clasificación de tipos de transformación), detección de tablas divididas (`_SPLT_CL`), helper de KQL dividido con base de conocimiento de 15 tablas (`high-value-fields.json`) + respaldo de análisis de reglas, salida KQL solo de condiciones lista para portal, lista de recomendaciones expandible, menú TUI de sugerencias de KQL dividido |
| 0.3.0 | 2026-04-02 | Análisis de cumplimiento de retención de registros (CISA M-21-31, NIST SP 800-92, NCSC-UK, ASD ACSC, NSA), detección de etiquetas de correlación (`#DONT_CORR#`/`#INC_CORR#`), vista de menú de evaluación de retención, columna de retención en Todas las Tablas, `recommendedRetentionDays` en el esquema de clasificación |
| 0.2.2 | 2026-04-02 | La tabla de optimización SOC oculta la columna Detalle en consolas estrechas |
| 0.2.1 | 2026-04-02 | Soporte de clasificación personalizada (`-CustomClassificationPath`), recomendaciones de optimización SOC enriquecidas con sugerencias de API/desglose, vista predeterminada solo activa, supresión de advertencia de codificación UTF-8 |
| 0.2.0 | - | Versión pública inicial con motor de clasificación, puntuación costo-valor, TUI Spectre.Console, exportación a JSON/Markdown |
| 0.1.0 | - | Versión interna para desarrollo |
## Problemas conocidos
### Advertencia de codificación UTF-8 de PwshSpectreConsole
Para habilitar la salida UTF-8 en tu terminal, añade la siguiente línea al inicio de tu archivo `$PROFILE` de PowerShell y reinicia el terminal:```powershell
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [System.Text.UTF8Encoding]::new()
El módulo establece esto automáticamente al importar, pero dependiendo de tu sesión, la advertencia puede seguir apareciendo. Es cosmético y no afecta la funcionalidad.
Si tienes problemas o quieres contribuir, crea un PR.
| Detection Analyzer | Puntúa reglas analíticas por posible ruido usando resultados de incidentes (proporción de cierre automático, proporción de falsos positivos y percentiles de volumen de incidentes) |
| XDR Checker | Agrega una capa de asesoramiento centrada en XDR: comprobaciones de cobertura de streaming y orientación de retención de Data Lake de un año para telemetría relacionada con XDR |
| Clasificaciones personalizadas | Proporciona tu propio JSON para agregar o sobrescribir la base de datos de clasificación integrada |
| Caché de recopilación | Los datos recopilados del espacio de trabajo se almacenan en caché localmente (60 minutos por defecto) para que las re-ejecuciones y re-exportaciones tomen segundos; se puede desactivar con -NoCache |
| Nubes soberanas | Los puntos finales de ARM, Log Analytics y Graph siguen el entorno de Azure con sesión iniciada (público, Gobierno de EE. UU., China) |
| TUI interactiva | Panel de Spectre.Console con menús, tablas codificadas por colores, desgloses, asistente de retención y arte ASCII |
| Exportación | Informe JSON, Markdown o HTML estático para compartir con el equipo |
| No |
| 5.59 |
Precio de ingesta por GB del nivel Analytics de Sentinel (alias -ppgb) |
-BasicPricePerGB | decimal | No | 1.15 | Precio por GB de Basic Logs |
-LakePricePerGB | decimal | No | 0.20 | Precio por GB del nivel Auxiliary / Data Lake (ingesta + procesamiento) |
-NonInteractive | switch | No | - | Omitir el panel TUI y exportar directamente (o devolver datos a la canalización si se omite -Output) |
-CustomClassificationPath | string | No | - | Ruta a un archivo JSON personalizado para añadir o sobrescribir clasificaciones (alias -clf) |
-NoCache | switch | No | - | No leer ni escribir la caché de recopilación |
-RefreshCache | switch | No | - | Recopilar datos nuevos y sobrescribir la entrada de caché |
-CacheMaxAgeMinutes | int | No | 60 | Antigüedad máxima de una entrada de caché para reutilizar (1-10080) |
-CachePath | string | No | $env:LOCALAPPDATA\LogHorizon\cache | Directorio para los archivos de caché |
| Revisar la transmisión y retención de la telemetría XDR |
| Analizador de detecciones | Puntuaciones de reglas >= 70 con al menos 5 incidentes (con -IncludeDetectionAnalyzer) | Ajustar o deshabilitar la regla ruidosa |