2025 年 4 月 3 日、STIX (Structured Threat Information 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 日ごとに再発行されるようになりました。
ThreatIntelIndicatorsがThreatIntelObjects等しいかどうかを確認することで、LastUpdateMethodテーブルとLogARepublisherテーブル内のこのデータを識別できます。 - 新しいテーブルは、高度なハンティング シナリオで使用される完全なデータ オブジェクト (他の列に既に存在する属性を除く) を含む
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 脅威インテリジェンス フィードに接続します。
- Microsoft Sentinel と簡単に統合できる TIP、TAXII フィード、エンリッチメント を確認します。
KQL の詳細については、「Kusto 照会言語 (KQL) の概要」を参照してください。
その他のリソース: