Trabalhar com objetos e indicadores STIX para melhorar a investigação de ameaças e informações sobre ameaças no Microsoft Sentinel (Pré-visualização)

A 3 de abril de 2025, pré-visualizamos publicamente duas novas tabelas para suportar o indicador STIX (Structured Threat Information eXpression) e esquemas de objetos: ThreatIntelIndicators e ThreatIntelObjects. Este artigo fornece exemplos de como incorporar objetos STIX em consultas para melhorar a investigação de ameaças e como migrar para o novo esquema de indicador de ameaça.

Para obter mais informações sobre informações sobre ameaças no Microsoft Sentinel, veja Informações sobre ameaças no Microsoft Sentinel.

Importante

Microsoft Sentinel irão ingerir todas as informações sobre ameaças nas novas ThreatIntelIndicators tabelas eThreatIntelObjects, ao mesmo tempo, continuarão a ingerir os mesmos dados na tabela legada ThreatIntelligenceIndicator até 31 de julho de 2025. Certifique-se de que atualiza as suas consultas personalizadas, regras de análise e deteção, livros e automatização para utilizar as novas tabelas até 31 de julho de 2025. Após esta data, Microsoft Sentinel deixarão de ingerir dados para a tabela legadaThreatIntelligenceIndicator. Estamos a atualizar todas as soluções de informações sobre ameaças no Hub de conteúdos para tirar partido das novas tabelas. Introduzimos atualizações importantes aos 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 a 10 dias. Pode identificar estes dados nas ThreatIntelIndicators tabelas e ThreatIntelObjects ao verificar se LastUpdateMethod são LogARepublisheriguais a .
  2. As novas tabelas suportam agora mais colunas, incluindo a Data coluna, que contém o objeto de dados completo (exceto os atributos que já existem noutras colunas) utilizados em cenários de investigação avançados. Se estas colunas não estiverem alinhadas com o seu cenário, saiba mais sobre como filtrar colunas e linhas antes da ingestão para o Log Analytics.
  3. Para otimizar a ingestão para o Log Analytics, os pares chave-valor sem dados são excluídos. Além disso, alguns campos na Data coluna , como description e pattern, são truncados se excederem 1000 carateres. Para obter mais informações sobre o esquema atualizado e como pode afetar a sua utilização, veja ThreatIntelIndicators e ThreatIntelObjects.

Identificar atores de ameaças associados a indicadores de ameaças específicos

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

 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 ator de ameaças (substitua Sangria Tempest pelo nome do ator de ameaças que pretende 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 legada ThreatIntelligenceIndicator para o novo ThreatIntelIndicators esquema. A consulta utiliza o extend operador para recriar colunas legadas com base nas ObservableKey colunas e ObservableValue na 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

Transformar dados enviados para o Log Analytics

As transformações no Monitor do Azure permitem-lhe filtrar ou modificar os dados recebidos antes de serem armazenados numa área de trabalho do Log Analytics. São implementados como uma instrução Linguagem de Pesquisa Kusto (KQL) numa regra de recolha de dados (DCR). Saiba mais sobre como criar transformações de áreas 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 utilização, pode filtrá-la antes da ingestão com a seguinte instrução KQL:

source
| project-away Data

Transformar as linhas enviadas para o Log Analytics

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

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

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

Para obter mais informações sobre o KQL, veja Descrição geral do Linguagem de Pesquisa Kusto (KQL).

Outros recursos: