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 dias no início de cada semana. 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 Data coluna, que contém o objeto de dados completo 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 ao Log Analytics, excluem-se pares de chave-valor que não contenham dados. Além disso, alguns campos dentro da Data coluna, 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 ThreatIntelObjects

Este exemplo mostra como migrar consultas existentes da tabela herdada ThreatIntelligenceIndicator para o novo ThreatIntelObjects 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 antes de serem 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 das transformações.

Transformar colunas para não serem visíveis ao enviar 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á filtre-a antes da ingestão usando a seguinte instrução KQL:

source
| project-away Data

Transformar 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 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: