Arbeiten mit STIX-Objekten und -Indikatoren zur Verbesserung von Threat Intelligence und Bedrohungssuche in Microsoft Sentinel (Vorschau)

Am 3. April 2025 haben wir zwei neue Tabellen zur Unterstützung von STIX-Indikator- und Objektschemas (Structured Threat Information eXpression) öffentlich in der Vorschau angezeigt: ThreatIntelIndicators und ThreatIntelObjects. Dieser Artikel enthält Beispiele für die Integration von STIX-Objekten in Abfragen, um die Bedrohungssuche zu verbessern, und wie Sie zum neuen Bedrohungsindikatorschema migrieren.

Weitere Informationen zu Threat Intelligence in Microsoft Sentinel finden Sie unter Threat Intelligence in Microsoft Sentinel.

Wichtig

Microsoft Sentinel erfasst alle Bedrohungsinformationen in den neuen ThreatIntelIndicators Tabellen und ThreatIntelObjects und erfasst die gleichen Daten bis zum 31. Juli 2025 in der LegacytabelleThreatIntelligenceIndicator. Aktualisieren Sie Ihre benutzerdefinierten Abfragen, Analyse- und Erkennungsregeln, Arbeitsmappen und Automatisierungen bis zum 31. Juli 2025, um die neuen Tabellen zu verwenden. Nach diesem Datum wird Microsoft Sentinel die Erfassung von Daten in der Legacytabelle ThreatIntelligenceIndicator beenden. Wir aktualisieren alle sofort einsatzbereiten Threat Intelligence-Lösungen im Content Hub, um die neuen Tabellen zu nutzen. Wir haben wichtige Updates für die Prozesse zum erneuten Veröffentlichen von Daten eingeführt.

  1. Zuvor wurden Daten über einen Zeitraum von 12 Tagen aufgeteilt und erneut in Log Analytics veröffentlicht. Jetzt werden alle Daten alle 7 bis 10 Tage erneut veröffentlicht. Sie können diese Daten in den ThreatIntelIndicators Tabellen und ThreatIntelObjects identifizieren, indem Sie überprüfen, ob LastUpdateMethod gleich LogARepublisherist.
  2. Die neuen Tabellen unterstützen jetzt mehr Spalten, einschließlich der Data Spalte, die das vollständige Datenobjekt (mit Ausnahme von Attributen, die bereits in anderen Spalten vorhanden sind) enthält, die in szenarien mit erweiterter Suche verwendet werden. Wenn diese Spalten nicht ihrem Szenario entsprechen, erfahren Sie mehr über das Filtern von Spalten und Zeilen vor der Erfassung in Log Analytics.
  3. Um die Erfassung in Log Analytics zu optimieren, werden Schlüssel-Wert-Paare ohne Daten ausgeschlossen. Darüber hinaus werden einige Felder innerhalb der Data Spalte , z description . B. und pattern, abgeschnitten, wenn sie 1.000 Zeichen überschreiten. Weitere Informationen zum aktualisierten Schema und zu dessen Auswirkungen auf Ihre Nutzung finden Sie unter ThreatIntelIndicators und ThreatIntelObjects.

Identifizieren von Bedrohungsakteuren, die bestimmten Bedrohungsindikatoren zugeordnet sind

Diese Abfrage ist ein Beispiel dafür, wie Bedrohungsindikatoren wie IP-Adressen mit Bedrohungsakteuren korreliert werden:

 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

Diese Abfrage bietet Einblicke in die Taktiken, Techniken und Prozeduren (TTPs) des Bedrohungsakteurs (ersetzen Sie durch Sangria Tempest den Namen des Bedrohungsakteurs, den Sie untersuchen möchten):

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

Migrieren vorhandener Abfragen zum neuen ThreatIntelIndicators-Schema

In diesem Beispiel wird gezeigt, wie sie vorhandene Abfragen aus der Legacytabelle ThreatIntelligenceIndicator in das neue ThreatIntelIndicators Schema migrieren. Die Abfrage verwendet den extend -Operator, um Legacyspalten basierend auf den ObservableKey Spalten und ObservableValue in der neuen Tabelle neu zu erstellen.

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

An Log Analytics gesendete Daten transformieren

Mit Transformationen in Azure Monitor können Sie eingehende Daten filtern oder ändern, bevor sie in einem Log Analytics-Arbeitsbereich gespeichert werden. Sie werden als Kusto-Abfragesprache-Anweisung (KQL) in einer Datensammlungsregel (Data Collection Rule, DCR) implementiert. Erfahren Sie mehr über das Erstellen von Arbeitsbereichstransformationen und die Kosten für Transformationen.

An Log Analytics gesendete Spalten transformieren

Die ThreatIntelIndicator Tabellen und ThreatIntelObjects enthalten eine Data Spalte, die das vollständige ursprüngliche STIX-Objekt enthält. Wenn diese Spalte für Ihren Anwendungsfall nicht relevant ist, können Sie sie vor der Erfassung mithilfe der folgenden KQL-Anweisung herausfiltern:

source
| project-away Data

An Log Analytics gesendete Zeilen transformieren

Die ThreatIntelIndicators Tabelle erhält immer mindestens eine Zeile für jeden nicht abgelaufenen Indikator. In einigen Fällen kann das STIX-Muster nicht in Schlüssel-Wert-Paare analysiert werden. In diesem Fall wird der Indikator weiterhin an Log Analytics gesendet, aber nur das unformatierte, nicht analysierte Muster ist enthalten, sodass Benutzer bei Bedarf benutzerdefinierte Analysen erstellen können. Wenn diese Zeilen für Ihr Szenario nicht nützlich sind, können Sie sie vor der Erfassung mithilfe der folgenden KQL-Anweisung herausfiltern:

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

Weitere Informationen finden Sie in den folgenden Artikeln:

Weitere Informationen zu KQL finden Sie unter übersicht über Kusto-Abfragesprache (KQL).

Weitere Ressourcen: