2025 年 4 月 3 日、STIX (構造化脅威情報 eXpression) インジケーターとオブジェクト スキーマ ( ThreatIntelIndicators と ThreatIntelObjects) をサポートする 2 つの新しいテーブルをパブリックにプレビューしました。 この記事では、STIX オブジェクトをクエリに組み込んで脅威ハンティングを強化する方法と、新しい脅威インジケーター スキーマに移行する方法の例を示します。
Microsoft Sentinelの脅威インテリジェンスの詳細については、「Microsoft Sentinelの脅威インテリジェンス」を参照してください。
重要
Microsoft Sentinelは、すべての脅威インテリジェンスを新しいThreatIntelIndicatorsテーブルとThreatIntelObjects テーブルに取り込み、2025 年 7 月 31 日まで同じデータをレガシ ThreatIntelligenceIndicator テーブルに取り込み続けます。
2025 年 7 月 31 日までに新しいテーブルを使用するように、カスタム クエリ、分析と検出ルール、ブック、自動化を更新してください。 この日付以降、Microsoft Sentinelはレガシ ThreatIntelligenceIndicator テーブルへのデータの取り込みを停止します。 新しいテーブルを活用するために、Content Hub のすべてのすぐに使用できる脅威インテリジェンス ソリューションを更新しています。
データ再発行プロセスに重要な更新プログラムが導入されました。
- 以前は、 12 日間にわたってデータが分割され、Log Analytics に再発行されていました。 これで、 すべてのデータ が 7 日から 10 日ごとに再発行されます。
LastUpdateMethodがLogARepublisherと等しいかどうかを確認することで、ThreatIntelIndicatorsテーブルとThreatIntelObjectsテーブル内のこのデータを識別できます。 - 新しいテーブルでは、高度なハンティング シナリオで使用される完全なデータ オブジェクト (他の列に既に存在する属性を除く) を含む
Data列など、より多くの列がサポートされるようになりました。 これらの列がシナリオと一致しない場合は、Log Analytics へのインジェストの前に 列 と 行 を除外する方法の詳細を確認してください。 - Log Analytics へのインジェストを最適化するために、データのないキーと値のペアは除外されます。 さらに、
Data列内の一部のフィールド (descriptionやpatternなど) は、1,000 文字を超えると切り捨てられます。 更新されたスキーマとその使用方法の詳細については、「 ThreatIntelIndicators および ThreatIntelObjects」を参照してください。
特定の脅威インジケーターに関連付けられている脅威アクターを特定する
このクエリは、IP アドレスなどの脅威インジケーターを脅威アクターと関連付ける方法の例です。
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
特定の脅威アクターに関連する脅威インテリジェンス データを一覧表示する
このクエリは、脅威アクターの戦術、手法、手順 (TCP) に関する分析情報を提供します ( Sangria Tempest を調査する脅威アクターの名前に置き換えます)。
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
既存のクエリを新しい ThreatIntelIndicators スキーマに移行する
この例では、既存のクエリをレガシ ThreatIntelligenceIndicator テーブルから新しい ThreatIntelIndicators スキーマに移行する方法を示します。 クエリでは、 extend 演算子を使用して、新しいテーブルの ObservableKey 列と ObservableValue 列に基づいてレガシ列を再作成します。
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
Log Analytics に送信されたデータを変換する
Azure Monitor の変換を使用すると、Log Analytics ワークスペースに格納される前に受信データをフィルター処理または変更できます。 これらは、データ収集規則 (DCR) のKusto 照会言語 (KQL) ステートメントとして実装されます。 ワークスペース変換を作成する方法と、変換のコストについて詳しく説明します。
Log Analytics に送信された列を変換する
ThreatIntelIndicatorテーブルとThreatIntelObjects テーブルには、元の STIX オブジェクト全体を含むData列が含まれています。 この列がユース ケースに関連しない場合は、次の KQL ステートメントを使用してインジェストの前に除外できます。
source
| project-away Data
Log Analytics に送信された行を変換する
ThreatIntelIndicators テーブルは、期限切れインジケーターごとに常に少なくとも 1 つの行を受け取ります。 場合によっては、STIX パターンをキーと値のペアに解析できません。 この場合、インジケーターは引き続き Log Analytics に送信されますが、未加工の解析されていないパターンのみが含まれ、ユーザーは必要に応じてカスタム分析を構築できます。 これらの行がシナリオに役立たない場合は、次の KQL ステートメントを使用してインジェストの前に除外できます。
source
| where (ObservableKey != "" and isnotempty(ObservableKey))
or (ObservableValue != "" and isnotempty(ObservableValue))
関連コンテンツ
詳細については、次の記事を参照してください。
- Microsoft Sentinelの脅威インテリジェンス。
- Microsoft Sentinelを STIX/TAXII 脅威インテリジェンス フィードに接続します。
- どの TIP、TAXII フィード、エンリッチメントをMicrosoft Sentinelと簡単に統合できるかを確認します。
KQL の詳細については、「Kusto 照会言語 (KQL) の概要」を参照してください。
その他のリソース: