Udostępnij przez


Praca z obiektami i wskaźnikami STIX w celu ulepszenia analizy zagrożeń i wyszukiwania zagrożeń w usłudze Microsoft Sentinel (wersja zapoznawcza)

3 kwietnia 2025 r. publicznie wyświetliliśmy podgląd dwóch nowych tabel w celu obsługi wskaźników STIX (Structured Threat Information eXpression) i schematów obiektów: ThreatIntelIndicators i ThreatIntelObjects. W tym artykule przedstawiono przykłady sposobu dołączania obiektów STIX do zapytań w celu ulepszenia wyszukiwania zagrożeń oraz sposobu migracji do nowego schematu wskaźnika zagrożeń.

Aby uzyskać więcej informacji na temat analizy zagrożeń w usłudze Microsoft Sentinel, zobacz Analiza zagrożeń w usłudze Microsoft Sentinel.

Ważne

Usługa Microsoft Sentinel pozyska wszystkie analizy zagrożeń w nowych ThreatIntelIndicators tabelach i ThreatIntelObjects , jednocześnie pozyskując te same dane do starszej ThreatIntelligenceIndicator tabeli do 31 lipca 2025 r. Pamiętaj, aby zaktualizować niestandardowe zapytania, reguły analizy i wykrywania, skoroszyty i automatyzację, aby używać nowych tabel do 31 lipca 2025 r. Po tej dacie usługa Microsoft Sentinel przestanie pozyskiwać dane do starszej ThreatIntelligenceIndicator tabeli. Aktualizujemy wszystkie gotowe rozwiązania do analizy zagrożeń w centrum zawartości w celu wykorzystania nowych tabel. Wprowadziliśmy ważne aktualizacje procesów ponownego publikowania danych.

  1. Wcześniej dane zostały podzielone i ponownie przekazane do usługi Log Analytics w ciągu 12 dni. Teraz wszystkie dane są ponownie publikowane co 7–10 dni. Te dane można zidentyfikować w tabelach ThreatIntelIndicators i ThreatIntelObjects, sprawdzając, czy LastUpdateMethod jest równe LogARepublisher.
  2. Nowe tabele obsługują teraz więcej kolumn, w tym Data kolumnę, która zawiera pełny obiekt danych (z wyjątkiem atrybutów, które już istnieją w innych kolumnach) używanych w zaawansowanych scenariuszach wyszukiwania zagrożeń. Jeśli te kolumny nie są zgodne ze scenariuszem, dowiedz się więcej na temat filtrowania kolumn i wierszy przed pozyskiwaniem do usługi Log Analytics.
  3. Aby zoptymalizować pozyskiwanie do usługi Log Analytics, pary klucz-wartość bez danych są wykluczone. Ponadto niektóre pola w Data kolumnie , takie jak description i pattern, są obcinane, jeśli przekraczają 1000 znaków. Aby uzyskać więcej informacji na temat zaktualizowanego schematu i jego wpływu na użycie, zobacz ThreatIntelIndicators i ThreatIntelObjects.

Identyfikowanie podmiotów zagrożeń skojarzonych z określonymi wskaźnikami zagrożeń

To zapytanie jest przykładem korelowania wskaźników zagrożeń, takich jak adresy IP, z aktorami zagrożeń:

 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

To zapytanie zapewnia wgląd w taktykę, techniki i procedury (TTPs) aktora zagrożenia (zastąp Sangria Tempest ciąg nazwą aktora zagrożeń, który chcesz zbadać):

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

Migrować istniejące zapytania do nowego schematu ThreatIntelIndicators

W tym przykładzie pokazano, jak migrować istniejące zapytania ze starszej ThreatIntelligenceIndicator tabeli do nowego ThreatIntelIndicators schematu. Zapytanie używa extend operatora do ponownego tworzenia starszych kolumn na ObservableKey podstawie kolumn i ObservableValue w nowej tabeli.

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

Przekształcanie i eliminowanie danych wysyłanych do usługi Log Analytics

Przekształcenia w usłudze Azure Monitor umożliwiają filtrowanie lub modyfikowanie danych przychodzących przed ich zapisaniem w obszarze roboczym usługi Log Analytics. Są one implementowane jako instrukcja języka zapytań Kusto (KQL) w regule zbierania danych (DCR). Dowiedz się więcej na temat tworzenia przekształceń obszaru roboczego i kosztów przekształceń.

Przekształcanie kolumn przed ich wysłaniem do usługi Log Analytics

Tabele ThreatIntelIndicator i ThreatIntelObjects zawierają kolumnę zawierającą Data pełny oryginalny obiekt STIX. Jeśli ta kolumna nie jest odpowiednia dla twojego zastosowania, możesz ją odfiltrować przed zaimportowaniem/przetworzeniem, używając następującej instrukcji KQL:

source
| project-away Data

Przekształć wiersze wysyłane do Log Analytics

Tabela ThreatIntelIndicators zawsze otrzymuje co najmniej jeden wiersz dla każdego niewyekspirowanego wskaźnika. W niektórych przypadkach wzorzec STIX nie może być analizowany w parach klucz/wartość. W takim przypadku wskaźnik jest nadal wysyłany do usługi Log Analytics, ale uwzględniany jest tylko nieprzetworzony, nieparzyszony wzorzec — co umożliwia użytkownikom tworzenie niestandardowych analiz w razie potrzeby. Jeśli te wiersze nie są przydatne w danym scenariuszu, możesz je odfiltrować przed pobieraniem przy użyciu następującej instrukcji KQL.

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

Aby uzyskać więcej informacji, zobacz następujące artykuły:

  • Analiza zagrożeń w usłudze Microsoft Sentinel.
  • Połącz Microsoft Sentinel z źródłami wywiadu o zagrożeniach STIX/TAXII.
  • Zobacz, które elementy TIPs, TAXII feeds i wzbogacenia można łatwo zintegrować z usługą Microsoft Sentinel.

Aby uzyskać więcej informacji na temat języka KQL, zobacz Omówienie języka Kusto Query Language (KQL).

Inne zasoby: