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 aprimorar a busca de ameaças e como migrar para o novo ThreatIntelIndicators esquema de tabela.

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 ingerirá toda a inteligência sobre ameaças nas novas tabelas ThreatIntelIndicators e ThreatIntelObjects, enquanto continuará 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 31 de julho de 2025, o Microsoft Sentinel parará de ingerir dados para a tabela legadaThreatIntelligenceIndicator. Estamos atualizando todas as soluções de inteligência contra ameaças prontas para uso no Hub de Conteúdo para aproveitar as 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. Você pode identificar esses dados nas tabelas ThreatIntelIndicators e ThreatIntelObjects verificando se LastUpdateMethod é igual a LogARepublisher.
  2. As novas tabelas agora suportam mais colunas, incluindo a coluna Data, que contém o objeto de dados completo (exceto os atributos que já existem em outras colunas), usado em cenários de investigação avançada. Se a Data coluna ou outras colunas adicionadas não se alinharem ao seu cenário, saiba mais sobre como filtrar colunas e filtrar linhas antes da ingestão para 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 operador extend para recriar colunas legadas com base 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

Filtrar dados antes de enviá-los para 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 em Linguagem de Consulta Kusto (KQL) em uma regra de coleta de dados (DCR). Saiba mais sobre como criar transformações de áreas de trabalho e o custo das transformações.

Excluir colunas antes de enviar dados para Log Analytics

As ThreatIntelIndicators 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

Excluir linhas antes de enviar dados para Log Analytics

A tabela ThreatIntelIndicators 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 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 essas linhas não forem úteis para o seu cenário, você poderá filtre-as antes da ingestão usando a seguinte instrução KQL:

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

Para saber mais, confira os seguintes artigos:

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

Outros recursos: