Construcción de SIEM en la Nube con Sentinel
Cuándo Usarlo
- Al establecer un centro de operaciones de seguridad centralizado para entornos multi-cloud
- Al migrar desde plataformas SIEM heredadas (Splunk, QRadar) a una arquitectura nativa de la nube
- Al construir flujos de trabajo automatizados de respuesta a incidentes para amenazas específicas de la nube
- Al realizar caza de amenazas a gran escala a través de petabytes de telemetría de seguridad
- Al integrar fuentes de inteligencia de amenazas con el análisis de registros de seguridad en la nube
No usar para entornos solo AWS donde Security Hub y GuardDuty sean suficientes, para detección en endpoints que requieran capacidades EDR (usar Defender for Endpoint), o para monitoreo de postura de cumplimiento (ver construcción-de-gestión-de-postura-de-seguridad-en-la-nube).
Requisitos Previos
- Suscripción de Azure con Microsoft Sentinel habilitado en un espacio de trabajo de Log Analytics
- Permisos de conector de datos para las fuentes de registro objetivo (AWS CloudTrail, Azure Activity, GCP)
- Logic Apps o Azure Functions para los playbooks de respuesta automatizada
- Competencia en KQL (Kusto Query Language) para escribir reglas de detección y consultas de caza
Flujo de Trabajo
Paso 1: Aprovisionar el Espacio de Trabajo de Sentinel y los Conectores de Datos
Cree un espacio de trabajo de Log Analytics optimizado para datos de seguridad y habilite los conectores de datos para la ingesta multi-cloud.
# Crear espacio de trabajo de Log Analytics
az monitor log-analytics workspace create \
--resource-group security-rg \
--workspace-name sentinel-workspace \
--location eastus \
--retention-time 365 \
--sku PerGB2018
# Habilitar Microsoft Sentinel en el espacio de trabajo
az sentinel onboarding-state create \
--resource-group security-rg \
--workspace-name sentinel-workspace
# Habilitar conector de AWS CloudTrail
az sentinel data-connector create \
--resource-group security-rg \
--workspace-name sentinel-workspace \
--data-connector-id aws-cloudtrail \
--kind AmazonWebServicesCloudTrail \
--aws-cloud-trail-data-connector '{
"awsRoleArn": "arn:aws:iam::123456789012:role/SentinelCloudTrailRole",
"dataTypes": {"logs": {"state": "Enabled"}}
}'
# Habilitar registros de inicio de sesión y auditoría de Azure AD
az sentinel data-connector create \
--resource-group security-rg \
--workspace-name sentinel-workspace \
--data-connector-id azure-ad \
--kind AzureActiveDirectory \
--azure-active-directory '{
"dataTypes": {
"alerts": {"state": "Enabled"},
"signinLogs": {"state": "Enabled"},
"auditLogs": {"state": "Enabled"}
}
}'
Paso 2: Escribir Reglas de Detección en KQL
Cree reglas analíticas utilizando Kusto Query Language para detectar amenazas específicas de la nube. Asigne cada regla a técnicas de MITRE ATT&CK.
// Detectar viajes imposibles: inicios de sesión desde ubicaciones geográficamente distantes
let timeframe = 1h;
let distance_threshold = 500; // km
SigninLogs
| where TimeGenerated > ago(timeframe)
| where ResultType == 0 // Solo inicios de sesión exitosos
| project TimeGenerated, UserPrincipalName, IPAddress, Location,
Latitude = toreal(LocationDetails.geoCoordinates.latitude),
Longitude = toreal(LocationDetails.geoCoordinates.longitude)
| sort by UserPrincipalName asc, TimeGenerated asc
| extend PrevLatitude = prev(Latitude, 1), PrevLongitude = prev(Longitude, 1),
PrevTime = prev(TimeGenerated, 1), PrevUser = prev(UserPrincipalName, 1)
| where UserPrincipalName == PrevUser
| extend TimeDiff = datetime_diff('minute', TimeGenerated, PrevTime)
| where TimeDiff < 60
| extend Distance = geo_distance_2points(Longitude, Latitude, PrevLongitude, PrevLatitude) / 1000
| where Distance > distance_threshold
| project TimeGenerated, UserPrincipalName, IPAddress, Location, Distance, TimeDiff
// Detectar abuso de credenciales de IAM de AWS desde CloudTrail
AWSCloudTrail
| where TimeGenerated > ago(24h)
| where EventName in ("ConsoleLogin", "AssumeRole", "GetSessionToken")
| where ErrorCode == ""
| summarize LoginCount = count(), DistinctIPs = dcount(SourceIpAddress),
IPList = make_set(SourceIpAddress, 10)
by UserIdentityArn, bin(TimeGenerated, 1h)
| where DistinctIPs > 3
| project TimeGenerated, UserIdentityArn, LoginCount, DistinctIPs, IPList
// Detectar eliminación masiva de objetos S3 (posible ransomware)
AWSCloudTrail
| where TimeGenerated > ago(1h)
| where EventName == "DeleteObject" or EventName == "DeleteObjects"
| summarize DeleteCount = count(), BucketsAffected = dcount(RequestParameters_bucketName)
by UserIdentityArn, bin(TimeGenerated, 10m)
| where DeleteCount > 100
| project TimeGenerated, UserIdentityArn, DeleteCount, BucketsAffected
Paso 3: Construir Playbooks SOAR con Logic Apps
Cree playbooks de respuesta automatizada que se ejecuten cuando las reglas analíticas activen incidentes. Las acciones comunes incluyen bloquear usuarios, aislar recursos y enriquecer alertas con inteligencia de amenazas.
{
"definition": {
"triggers": {
"Microsoft_Sentinel_incident": {
"type": "ApiConnectionWebhook",
"inputs": {
"body": {"incidentArmId": "subscriptions/@{triggerBody()?['workspaceInfo']?['SubscriptionId']}/resourceGroups/@{triggerBody()?['workspaceInfo']?['ResourceGroupName']}/providers/Microsoft.OperationalInsights/workspaces/@{triggerBody()?['workspaceInfo']?['WorkspaceName']}/providers/Microsoft.SecurityInsights/Incidents/@{triggerBody()?['object']?['properties']?['incidentNumber']]},
"host": {"connection": {"name": "@parameters('$connections')['microsoftsentinel']['connectionId']"}}
}
}
},
"actions": {
"Get_incident_entities": {
"type": "ApiConnection",
"inputs": {"method": "post", "path": "/Incidents/entities"}
},
"For_each_account_entity": {
"type": "Foreach",
"foreach": "@body('Get_incident_entities')?['Accounts']",
"actions": {
"Disable_Azure_AD_user": {
"type": "ApiConnection",
"inputs": {
"method": "PATCH",
"path": "/v1.0/users/@{items('For_each_account_entity')?['AadUserId']}",
"body": {"accountEnabled": false}
}
},
"Add_comment_to_incident": {
"type": "ApiConnection",
"inputs": {
"body": {"message": "Usuario @{items('For_each_account_entity')?['Name']} deshabilitado por playbook automatizado"}
}
}
}
}
}
}
}
Paso 4: Configurar el Lago de Datos de Sentinel para Caza a Largo Plazo
Habilite el lago de datos de Sentinel para la retención de registros a escala de petabytes y la caza avanzada de amenazas utilizando endpoints KQL y SQL.
// Consulta de caza de amenazas: detectar movimiento lateral entre cuentas de AWS
let suspicious_roles = AWSCloudTrail
| where TimeGenerated > ago(7d)
| where EventName == "AssumeRole"
| extend AssumedRoleArn = tostring(parse_json(RequestParameters).roleArn)
| where AssumedRoleArn contains "cross-account" or AssumedRoleArn contains "admin"
| summarize AssumeCount = count(), UniqueSourceAccounts = dcount(RecipientAccountId)
by UserIdentityArn, AssumedRoleArn
| where AssumeCount > 10 and UniqueSourceAccounts > 2;
suspicious_roles
| join kind=inner (
AWSCloudTrail
| where TimeGenerated > ago(7d)
| where EventName in ("RunInstances", "CreateFunction", "PutBucketPolicy")
) on UserIdentityArn
| project TimeGenerated, UserIdentityArn, AssumedRoleArn, EventName, SourceIpAddress
Paso 5: Integrar Inteligencia de Amenazas
Conecte proveedores de inteligencia de amenazas y cree reglas de coincidencia basadas en indicadores para detectar comunicación con infraestructura maliciosa conocida.
# Habilitar conector de Inteligencia de Amenazas de Microsoft
az sentinel data-connector create \
--resource-group security-rg \
--workspace-name sentinel-workspace \
--data-connector-id microsoft-ti \
--kind MicrosoftThreatIntelligence \
--microsoft-threat-intelligence '{
"dataTypes": {"microsoftEmergingThreatFeed": {"lookbackPeriod": "2025-01-01T00:00:00Z", "state": "Enabled"}}
}'
// Hacer coincidir indicadores de red con registros de flujo en la nube
let TI_IPs = ThreatIntelligenceIndicator
| where TimeGenerated > ago(30d)
| where isnotempty(NetworkIP)
| distinct NetworkIP;
AzureNetworkAnalytics_CL
| where TimeGenerated > ago(24h)
| where DestIP_s in (TI_IPs)
| project TimeGenerated, SrcIP_s, DestIP_s, DestPort_d, FlowType_s
Conceptos Clave
| Término | Definición |
|---|---|
| KQL | Kusto Query Language, el lenguaje de consulta principal para Microsoft Sentinel utilizado para buscar, analizar y visualizar datos de seguridad |
| Regla Analítica | Lógica de detección en Sentinel que evalúa datos de registro según un cronograma y crea incidentes cuando se cumplen las condiciones |
| Playbook SOAR | Flujo de trabajo automatizado activado por incidentes que realiza acciones de respuesta como bloquear cuentas, enriquecer alertas o notificar a equipos |
| Conector de Datos | Módulo de integración que ingiere registros de seguridad de servicios en la nube, proveedores de identidad y herramientas de terceros en Sentinel |
| Lago de Datos de Sentinel | Capa de almacenamiento a escala de petabytes que proporciona retención de registros a largo plazo con interfaces de consulta KQL y SQL para caza avanzada |
| Workbook | Panel interactivo en Sentinel que muestra visualizaciones de datos de seguridad, tendencias y métricas operativas |
| Lista de Vigilancia | Tablas de datos de referencia en Sentinel utilizadas para enriquecer alertas con contexto, como listas de usuarios VIP o rangos de IP aprobados |
| Detección Fusion | Motor de correlación impulsado por aprendizaje automático que detecta automáticamente ataques de múltiples etapas a través de fuentes de datos |
Herramientas y Sistemas
- Microsoft Sentinel: Plataforma SIEM/SOAR nativa de la nube construida sobre Azure Log Analytics con detección de amenazas impulsada por IA
- Azure Logic Apps: Plataforma de automatización de bajo código para construir playbooks SOAR activados por incidentes de Sentinel
- Inteligencia de Amenazas de Microsoft: Fuentes de amenazas integradas que proporcionan indicadores de IP, dominio y URL para comparación con registros de seguridad
- Azure Data Explorer: Motor de análisis de alto rendimiento que subyace a las consultas KQL de Sentinel para la exploración de datos a gran escala
- MITRE ATT&CK Navigator: Marco para mapear reglas de detección de Sentinel a tácticas y técnicas de adversarios
Escenarios Comunes
Escenario: Detección de Campaña de Robo de Credenciales Multi-Cloud
Contexto: Un atacante compromete una cuenta de Azure AD mediante phishing, luego usa la cuenta para acceder a recursos de AWS a través de identidad federada. Sentinel necesita correlacionar la anomalía de inicio de sesión de Azure con la actividad inusual de la API de AWS.
Enfoque:
- Cree una regla analítica que detecte viajes imposibles o riesgo de inicio de sesión anómalo en Azure AD
- Escriba una consulta KQL que correlacione la identidad comprometida de Azure AD con eventos AssumeRoleWithSAML de AWS CloudTrail
- Cree una regla de detección Fusion que vincule eventos de riesgo de Azure AD con actividad posterior de escalada de privilegios en AWS
- Implemente un playbook SOAR que deshabilite automáticamente la cuenta de Azure AD y revoque las sesiones STS de AWS
- Cree un workbook que muestre la línea de tiempo desde el compromiso inicial hasta el movimiento lateral hacia AWS
- Ejecute una consulta de caza en el lago de datos para verificar si hay patrones similares que afecten a otras cuentas
Errores comunes: No correlacionar la identidad entre proveedores de nube pierde toda la cadena de ataque. Configurar la frecuencia de la regla analítica demasiado baja (por ejemplo, 24 horas) permite a los atacantes horas de acceso no detectado.
Formato de Salida
Informe de Operaciones del SOC de Microsoft Sentinel
======================================================
Espacio de Trabajo: sentinel-workspace
Fuentes de Datos: 14 conectores activos
Período del Informe: 2025-02-01 a 2025-02-23
INGESTIÓN DE DATOS:
Registros de inicio de sesión de Azure AD: 2.3 TB (23 días)
AWS CloudTrail: 1.8 TB (23 días)
Azure Activity: 0.9 TB (23 días)
Alertas de Defender for Cloud: 45 GB (23 días)
Ingestión Total: 5.1 TB
RESUMEN DE DETECCIÓN:
Reglas Analíticas Activas: 87
Incidentes Creados: 234
Críticos: 8 | Altos: 34 | Medios: 89 | Bajos: 103
Tiempo Medio para Detectar (MTTD): 4.2 minutos
Tiempo Medio para Responder (MTTR): 18 minutos
PRINCIPALES TIPOS DE INCIDENTES:
Viaje Imposible Detectado: 42 incidentes
Patrón de Llamada a API No Autorizada en AWS: 28 incidentes
Eliminación Masiva de Archivos en S3: 3 incidentes
Registro de Aplicación Sospechosa en Azure AD: 12 incidentes
AUTOMATIZACIÓN:
Playbooks Ejecutados: 156
Cuentas Deshabilitadas Automáticamente: 23
Incidentes Enriquecidos Automáticamente: 198
Tasa de Falsos Positivos: 12%