Construindo SIEM na Nuvem com Sentinel
Quando Usar
- Ao estabelecer um centro de operações de segurança centralizado para ambientes multinuvem
- Ao migrar de plataformas SIEM legadas (Splunk, QRadar) para uma arquitetura nativa da nuvem
- Ao construir fluxos de trabalho automatizados de resposta a incidentes para ameaças específicas da nuvem
- Ao realizar caça a ameaças em larga escala em petabytes de telemetria de segurança
- Ao integrar feeds de inteligência contra ameaças com análise de logs de segurança na nuvem
Não use para ambientes apenas AWS onde Security Hub e GuardDuty são suficientes, para detecção em endpoints que exijam recursos de EDR (use Defender para Endpoint) ou para monitoramento de postura de conformidade (veja construindo-gerenciamento-de-postura-de-segurança-na-nuvem).
Pré-requisitos
- Assinatura do Azure com Microsoft Sentinel habilitado em um workspace do Log Analytics
- Permissões do conector de dados para as fontes de log de destino (AWS CloudTrail, Azure Activity, GCP)
- Logic Apps ou Azure Functions para playbooks de resposta automatizados
- Proficiência em KQL (Kusto Query Language) para escrever regras de detecção e consultas de caça
Fluxo de Trabalho
Etapa 1: Provisionar o Workspace do Sentinel e Conectores de Dados
Crie um workspace do Log Analytics otimizado para dados de segurança e habilite conectores de dados para ingestão multinuvem.
# Criar workspace do 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 no workspace
az sentinel onboarding-state create \
--resource-group security-rg \
--workspace-name sentinel-workspace
# Habilitar conector do 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 logs de entrada e auditoria do 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"}
}
}'
Etapa 2: Escrever Regras de Detecção em KQL
Crie regras de análise usando a Kusto Query Language para detectar ameaças específicas da nuvem. Mapeie cada regra para técnicas MITRE ATT&CK.
// Detectar viagem impossível - entradas de locais geograficamente distantes
let timeframe = 1h;
let distance_threshold = 500; // km
SigninLogs
| where TimeGenerated > ago(timeframe)
| where ResultType == 0 // Apenas entradas bem-sucedidas
| 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 credenciais IAM da AWS via 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 exclusão em massa de objetos S3 (possível 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
Etapa 3: Construir Playbooks SOAR com Logic Apps
Crie playbooks de resposta automatizados que são executados quando regras de análise disparam incidentes. Ações comuns incluem bloquear usuários, isolar recursos e enriquecer alertas com inteligência contra ameaças.
{
"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": "Usuário @{items('For_each_account_entity')?['Name']} desabilitado pelo playbook automatizado"}
}
}
}
}
}
}
}
Etapa 4: Configurar o Data Lake do Sentinel para Caça de Longo Prazo
Habilite o data lake do Sentinel para retenção de logs em escala de petabytes e caça avançada a ameaças usando endpoints KQL e SQL.
// Consulta de caça a ameaças: detectar movimento lateral entre contas 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
Etapa 5: Integrar Inteligência contra Ameaças
Conecte provedores de inteligência contra ameaças e crie regras de correspondência baseadas em indicadores para detectar comunicação com infraestrutura maliciosa conhecida.
# Habilitar conector de Inteligência contra Ameaças da 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"}}
}'
// Corresponder indicadores de rede contra logs de fluxo da nuvem
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
Conceitos-Chave
| Termo | Definição |
|---|---|
| KQL | Kusto Query Language, a linguagem de consulta principal do Microsoft Sentinel usada para pesquisar, analisar e visualizar dados de segurança |
| Regra de Análise | Lógica de detecção no Sentinel que avalia dados de log em um agendamento e cria incidentes quando as condições são atendidas |
| Playbook SOAR | Fluxo de trabalho automatizado disparado por incidentes que executa ações de resposta, como bloquear contas, enriquecer alertas ou notificar equipes |
| Conector de Dados | Módulo de integração que ingere logs de segurança de serviços em nuvem, provedores de identidade e ferramentas de terceiros no Sentinel |
| Data Lake do Sentinel | Camada de armazenamento em escala de petabytes que fornece retenção de longo prazo com interfaces de consulta KQL e SQL para caça avançada |
| Workbook | Painel interativo no Sentinel que exibe visualizações de dados de segurança, tendências e métricas operacionais |
| Watchlist | Tabelas de dados de referência no Sentinel usadas para enriquecer alertas com contexto, como listas de usuários VIP ou intervalos de IP aprovados |
| Detecção Fusão | Mecanismo de correlação alimentado por aprendizado de máquina que detecta automaticamente ataques em vários estágios entre fontes de dados |
Ferramentas e Sistemas
- Microsoft Sentinel: Plataforma SIEM/SOAR nativa da nuvem construída no Azure Log Analytics com detecção de ameaças alimentada por IA
- Azure Logic Apps: Plataforma de automação low-code para construir playbooks SOAR acionados por incidentes do Sentinel
- Inteligência contra Ameaças da Microsoft: Feeds de ameaças integrados que fornecem indicadores de IP, domínio e URL para correspondência com logs de segurança
- Azure Data Explorer: Mecanismo de análise de alto desempenho que sustenta consultas KQL do Sentinel para exploração de dados em larga escala
- MITRE ATT&CK Navigator: Estrutura para mapear regras de detecção do Sentinel para táticas e técnicas do adversário
Cenários Comuns
Cenário: Detectando Campanha de Roubo de Credenciais entre Nuvens
Contexto: Um invasor compromete uma conta do Azure AD por meio de phishing e, em seguida, usa a conta para acessar recursos da AWS por identidade federada. O Sentinel precisa correlacionar a anomalia de entrada do Azure AD com a atividade incomum da API da AWS.
Abordagem:
- Crie uma regra de análise detectando viagem impossível do Azure AD ou risco de entrada anômalo
- Escreva uma consulta KQL correlacionando a identidade comprometida do Azure AD com eventos do AWS CloudTrail AssumeRoleWithSAML
- Crie uma regra de detecção Fusão que vincule eventos de risco do Azure AD com atividade subsequente de escalonamento de privilégio na AWS
- Implante um playbook SOAR que desabilite automaticamente a conta do Azure AD e revogue sessões STS da AWS
- Crie um workbook mostrando a linha do tempo desde o comprometimento inicial até o movimento lateral para a AWS
- Execute uma consulta de caça no data lake para verificar padrões semelhantes que afetam outras contas
Armadilhas: Não correlacionar identidades entre provedores de nuvem perde toda a cadeia de ataque. Definir a frequência da regra de análise muito baixa (por exemplo, 24 horas) permite que invasores tenham horas de acesso não detectado.
Formato de Saída
Relatório de Operações do SOC do Microsoft Sentinel
=====================================================
Workspace: sentinel-workspace
Fontes de Dados: 14 conectores ativos
Período do Relatório: 2025-02-01 a 2025-02-23
INGESTÃO DE DADOS:
Logs de Entrada do Azure AD: 2,3 TB (23 dias)
AWS CloudTrail: 1,8 TB (23 dias)
Atividade do Azure: 0,9 TB (23 dias)
Alertas do Defender para Nuvem: 45 GB (23 dias)
Ingestão Total: 5,1 TB
RESUMO DE DETECÇÃO:
Regras de Análise Ativas: 87
Incidentes Criados: 234
Críticos: 8 | Altos: 34 | Médios: 89 | Baixos: 103
Tempo Médio para Detectar (MTTD): 4,2 minutos
Tempo Médio para Responder (MTTR): 18 minutos
PRINCIPAIS TIPOS DE INCIDENTE:
Viagem Impossível Detectada: 42 incidentes
Padrão de Chamada de API AWS Não Autorizada: 28 incidentes
Exclusão em Massa de Arquivos no S3: 3 incidentes
Registro Suspeito de Aplicativo do Azure AD: 12 incidentes
AUTOMAÇÃO:
Playbooks Executados: 156
Contas Desabilitadas Automaticamente: 23
Incidentes Enriqueceu Automaticamente: 198
Taxa de Falsos Positivos: 12%