Compartilhar via


Trabalhar com objetos STIX e indicadores para aprimorar a inteligência contra ameaças e a busca de ameaças no Microsoft Sentinel (versão prévia)

Em 3 de abril de 2025, demonstramos publicamente duas novas tabelas para dar suporte aos esquemas de indicador e objeto STIX (Structured Threat Information eXpression): 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 esquema de indicador de ameaça.

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

Importante

O Microsoft Sentinel irá ingerir toda a inteligência contra ameaças nas novas tabelas ThreatIntelIndicators e ThreatIntelObjects, enquanto continua a ingerir os mesmos dados na tabela herdada ThreatIntelligenceIndicator até 31 de julho de 2025. Atualize suas consultas personalizadas, regras de análise e detecçã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 interromperá a ingestão de dados na tabela herdada ThreatIntelligenceIndicator . 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 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 a 10 dias. Você pode identificar esses dados nas tabelas ThreatIntelIndicators e ThreatIntelObjects verificando se LastUpdateMethod é igual a LogARepublisher.
  2. As novas tabelas agora dão suporte a mais colunas, incluindo a coluna Data, que contém o objeto de dados completo (exceto as características que já existem em outras colunas) usado em cenários avançados de busca. Se essas colunas não se alinharem ao 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, pares chave-valor sem dados são excluídos. Além disso, alguns campos dentro da coluna Data, como description e pattern, serã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 atores de ameaça associados a indicadores de ameaça específicos

Essa consulta é um exemplo de como correlacionar indicadores de ameaça, como endereços IP, com atores 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

Essa consulta fornece insights sobre as táticas, técnicas e procedimentos (TTPs) do ator de ameaça (substitua Sangria Tempest pelo nome do ator 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 herdadas com base nas colunas ObservableKey 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 Azure Monitor permitem filtrar ou modificar dados de entrada antes de serem armazenados em um espaço de trabalho do Log Analytics. Eles são implementados como uma instrução da Kusto Query Language (KQL) na regra de coleta de dados (DCR). Saiba mais sobre como criar transformações de workspace e o custo de transformações.

Transformar colunas enviadas para o Log Analytics

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

source
| project-away Data

Transformar linhas enviadas para o 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 isso acontece, o indicador ainda é enviado para o Log Analytics, mas somente o padrão bruto 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á filtre-as 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 mais informações sobre o KQL, confira a visão geral da Linguagem de Consulta Kusto (KQL).

Outros recursos: