Partilhar via


Trabalhar com objetos e indicadores STIX para melhorar a inteligência de ameaças e a caça a ameaças no Microsoft Sentinel (Visualização)

Apresentámos publicamente, a 3 de abril de 2025, duas novas tabelas para dar suporte a esquemas de indicadores e objetos STIX (Structured Threat Information eXpression): ThreatIntelIndicators e ThreatIntelObjects. Este artigo fornece exemplos de como incorporar objetos STIX em consultas para aprimorar a caça a ameaças e como migrar para o novo esquema de indicador de ameaça.

Para obter mais informações sobre inteligência de ameaças no Microsoft Sentinel, consulte Inteligência de ameaças no Microsoft Sentinel.

Importante

O Microsoft Sentinel irá ingerir todas as informações sobre ameaças nas novas tabelas ThreatIntelIndicators e ThreatIntelObjects, enquanto continua a ingerir os mesmos dados na tabela antiga ThreatIntelligenceIndicator até ao dia 31 de julho de 2025. Certifique-se de atualizar suas consultas personalizadas, regras de análise e deteção, pastas de trabalho e automação para usar as novas tabelas até 31 de julho de 2025. Após essa data, o Microsoft Sentinel deixará de ingerir dados na tabela herdada ThreatIntelligenceIndicator . Estamos a atualizar todas as soluções de inteligência de ameaças prontas para uso no Content Hub para tirar partido das novas tabelas. Introduzimos atualizações importantes nos processos de republicação de dados.

  1. Anteriormente, os dados eram divididos e republicados no Log Analytics durante um período de 12 dias. Agora, todos os dados são republicados a cada 7-10 dias. Você pode identificar esses dados nas tabelas ThreatIntelIndicators e ThreatIntelObjects verificando se LastUpdateMethod é igual a LogARepublisher.
  2. As novas tabelas agora oferecem suporte a mais colunas, incluindo a Data coluna, que contém o objeto de dados completo (exceto para atributos que já existem em outras colunas) usado em cenários de caça avançada. Se essas colunas não estiverem alinhadas com seu cenário, saiba mais sobre como filtrar colunas e linhas antes de serem ingeridas no Log Analytics.
  3. Para otimizar a ingestão ao Log Analytics, os pares chave-valor sem dados são excluídos. Além disso, alguns campos dentro da Data coluna, como description e pattern—, são truncados se excederem 1.000 caracteres. Para obter mais informações sobre o esquema atualizado e como ele pode afetar seu uso, consulte ThreatIntelIndicators e ThreatIntelObjects.

Identificar agentes de ameaça associados a indicadores de ameaça específicos

Esta consulta é um exemplo de como correlacionar indicadores de ameaça, como endereços IP, com agentes de ameaça:

 let IndicatorsWithThatIP = (ThreatIntelIndicators
| extend tlId = tostring(Data.id)
| summarize arg_max(TimeGenerated,*) by Id
|  where IsDeleted == false);
let ThreatActors = (ThreatIntelObjects
| where StixType == 'threat-actor'
| extend tlId = tostring(Data.id)
| extend ThreatActorName = Data.name
| extend ThreatActorSource = base64_decode_tostring(tostring(split(Id, '---')[0]))
| summarize arg_max(TimeGenerated,*) by Id
|  where IsDeleted == false);
let AllRelationships = (ThreatIntelObjects
| where StixType == 'relationship'
| extend tlSourceRef = tostring(Data.source_ref)
| extend tlTargetRef = tostring(Data.target_ref)
| extend tlId = tostring(Data.id)
| summarize arg_max(TimeGenerated,*) by Id
|  where IsDeleted == false);
let IndicatorAsSource = (IndicatorsWithThatIP
| join AllRelationships on $left.tlId == $right.tlSourceRef
| join ThreatActors on $left.tlTargetRef == $right.tlId);
let IndicatorAsTarget = (IndicatorsWithThatIP
| join AllRelationships on $left.tlId == $right.tlTargetRef
| join ThreatActors on $left.tlSourceRef == $right.tlId);
IndicatorAsSource
| union IndicatorAsTarget
| project ObservableValue, ThreatActorName

Esta consulta fornece informações sobre as táticas, técnicas e procedimentos (TTPs) do agente de ameaça (substitua Sangria Tempest pelo nome do agente de ameaça que você deseja investigar):

let THREAT_ACTOR_NAME = 'Sangria Tempest';
let ThreatIntelObjectsPlus = (ThreatIntelObjects
| union (ThreatIntelIndicators
| extend StixType = 'indicator')
| extend tlId = tostring(Data.id)
| extend PlusStixTypes = StixType
| extend importantfield = case(StixType == "indicator", Data.pattern,
                            StixType == "attack-pattern", Data.name,
                            "Unkown")
| extend feedSource = base64_decode_tostring(tostring(split(Id, '---')[0]))
| summarize arg_max(TimeGenerated,*) by Id
|  where IsDeleted == false);
let ThreatActorsWithThatName = (ThreatIntelObjects
| where StixType == 'threat-actor'
| where Data.name == THREAT_ACTOR_NAME
| extend tlId = tostring(Data.id)
| extend ActorName = tostring(Data.name)
| summarize arg_max(TimeGenerated,*) by Id
|  where IsDeleted == false);
let AllRelationships = (ThreatIntelObjects
| where StixType == 'relationship'
| extend tlSourceRef = tostring(Data.source_ref)
| extend tlTargetRef = tostring(Data.target_ref)
| extend tlId = tostring(Data.id)
| summarize arg_max(TimeGenerated,*) by Id
|  where IsDeleted == false);
let SourceRelationships = (ThreatActorsWithThatName
| join AllRelationships on $left.tlId == $right.tlSourceRef
| join ThreatIntelObjectsPlus on $left.tlTargetRef == $right.tlId);
let TargetRelationships = (ThreatActorsWithThatName
| join AllRelationships on $left.tlId == $right.tlTargetRef
| join ThreatIntelObjectsPlus on $left.tlSourceRef == $right.tlId);
SourceRelationships
| union TargetRelationships
| project ActorName, PlusStixTypes, ObservableValue, importantfield, Tags, feedSource

Migrar consultas existentes para o novo esquema ThreatIntelIndicators

Este exemplo mostra como migrar consultas existentes da tabela herdada ThreatIntelligenceIndicator para o novo ThreatIntelIndicators esquema. A consulta usa o operador extend para recriar colunas antigas baseando-se nas colunas ObservableKey e ObservableValue da nova tabela.

ThreatIntelIndicators
| extend NetworkIP = iff(ObservableKey == 'ipv4-addr:value', ObservableValue, ''),
        NetworkSourceIP = iff(ObservableKey == 'network-traffic:src_ref.value', ObservableValue, ''),
        NetworkDestinationIP = iff(ObservableKey == 'network-traffic:dst_ref.value', ObservableValue, ''),
        DomainName = iff(ObservableKey == 'domain-name:value', ObservableValue, ''),
        EmailAddress = iff(ObservableKey == 'email-addr:value', ObservableValue, ''),
        FileHashType = case(ObservableKey has 'MD5', 'MD5',
                                ObservableKey has 'SHA-1', 'SHA-1',
                                ObservableKey has 'SHA-256', 'SHA-256',
                                ''),
        FileHashValue = iff(ObservableKey has 'file:hashes', ObservableValue, ''),
        Url = iff(ObservableKey == 'url:value', ObservableValue, ''),
        x509Certificate = iff(ObservableKey has 'x509-certificate:hashes.', ObservableValue, ''),
        x509Issuer = iff(ObservableKey has 'x509-certificate:issuer', ObservableValue, ''),
        x509CertificateNumber = iff(ObservableKey == 'x509-certificate:serial_number', ObservableValue, ''),        
        Description = tostring(Data.description),
        CreatedByRef = Data.created_by_ref,
        Extensions = Data.extensions,
        ExternalReferences = Data.references,
        GranularMarkings = Data.granular_markings,
        IndicatorId = tostring(Data.id),
        ThreatType = tostring(Data.indicator_types[0]),
        KillChainPhases = Data.kill_chain_phases,
        Labels = Data.labels,
        Lang = Data.lang,
        Name = Data.name,
        ObjectMarkingRefs = Data.object_marking_refs,
        PatternType = Data.pattern_type,
        PatternVersion = Data.pattern_version,
        Revoked = Data.revoked,
        SpecVersion = Data.spec_version
| project-reorder TimeGenerated, WorkspaceId, AzureTenantId, ThreatType, ObservableKey, ObservableValue, Confidence, Name, Description, LastUpdateMethod, SourceSystem, Created, Modified, ValidFrom, ValidUntil, IsDeleted, Tags, AdditionalFields, CreatedByRef, Extensions, ExternalReferences, GranularMarkings, IndicatorId, KillChainPhases, Labels, Lang, ObjectMarkingRefs, Pattern, PatternType, PatternVersion, Revoked, SpecVersion, NetworkIP, NetworkDestinationIP, NetworkSourceIP, DomainName, EmailAddress, FileHashType, FileHashValue, Url, x509Certificate, x509Issuer, x509CertificateNumber, Data

Transforme os dados enviados para o Log Analytics

As transformações no Azure Monitor permitem filtrar ou modificar dados de entrada antes que eles sejam armazenados em um espaço de trabalho do Log Analytics. Eles são implementados como uma instrução KQL (Kusto Query Language) em uma regra de coleta de dados (DCR). Saiba mais sobre como criar transformações de espaço de trabalho e o custo das transformações.

Transformar colunas enviadas para o Log Analytics

As ThreatIntelIndicator tabelas e ThreatIntelObjects incluem uma Data coluna que contém o objeto STIX original completo. Se esta coluna não for relevante para o seu caso de uso, você pode filtrá-la antes da ingestão usando a seguinte instrução KQL:

source
| project-away Data

Transformar e remover linhas enviadas para o Log Analytics

A ThreatIntelIndicators tabela sempre recebe pelo menos uma linha para cada indicador não expirado. Em alguns casos, o padrão STIX não pode ser analisado em pares chave/valor. Quando isso acontece, o indicador ainda é enviado para o Log Analytics, mas apenas o padrão bruto e não analisado é incluído, permitindo que os usuários criem análises personalizadas, se necessário. Se essas linhas não forem úteis para o seu cenário, você poderá filtrá-las antes da ingestão usando a seguinte instrução KQL:

source
| where (ObservableKey != "" and isnotempty(ObservableKey)) 
    or (ObservableValue != "" and isnotempty(ObservableValue))

Para obter mais informações, consulte os seguintes artigos:

Para obter mais informações sobre o KQL, consulte Visão geral da Kusto Query Language (KQL).

Outros recursos: