エンタープライズ露出グラフを照会する
Microsoft セキュリティ露出管理のエンタープライズ 露出グラフを使用して、Microsoft Defender ポータルの高度なハンティングで企業の露出の脅威を事前に検出します。
この記事では、エンタープライズ 露出グラフでクエリを作成するための例、ヒント、ヒントについて説明します。
前提条件
- 攻撃面の管理についてお読みください。
- グラフを操作するために必要なアクセス許可を確認します。
高度なハンティング クエリを構築する
グラフ作成演算子を使用する
Kusto の make-graph
演算子は、ノードを読み込み、データをメモリにエッジします。
- Kusto は使用中の列のみを読み込むため、列を明示的に選択する必要はありません。
- ただし、
NodeProperties
列にはすべてのノード情報が含まれているため、大きくなります。 - ほとんどのシナリオでは、
make-graph
演算子にフィードする前に必要な情報のみを抽出すると便利です。
例
let FilteredNodes = ExposureGraphNodes
| extend ContainsSensetiveData = NodeProperties has "containsSensitiveData"
| project Id, ContainsSensetiveData, Label, EntityIds, Categories;
Edges
| make-graph SourceNodeId --> TargetNodeId with FilteredNodes on Id
..
動的列とスマート インデックス作成を使用する
NodeProperties
と Categories
は動的列です。
- Kusto は、これらの列に json のようなコンテンツが含まれていることを認識し、スマート インデックス作成を適用します。
- ただし、すべての Kusto 演算子がインデックスを使用するわけではありません。 たとえば、
set_has_element
、isempty
isnotnull
、動的列に適用されている場合、インデックスを使用せず、インデックスを使用しないisnotnull(Properties["containsSensitiveData"]
。 - 代わりに、常にインデックスを使用する
has()
演算子を使用します。
例
次のクエリでは、has
演算子によってdata
文字列がチェックされ、data
要素がset_has_element
チェックされます。
両方の演算子を使用することは、 has()
演算子がカテゴリ prefix_data
の場合でも true を返すので重要です。
Categories has('data') and set_has_element(Categories, 'data')
文字列の用語について詳しくは、こちらをご覧ください。
公開クエリの例
次の例は、テナント内のセキュリティ公開データを理解するためのクエリを記述するのに役立ちます。
テナント内のすべてのノード ラベルを一覧表示する
次のクエリは、 ExposureGraphNodes
テーブル内のデータをグループ化し、Kusto の summarize
演算子を使用して NodeLabel
で一覧表示します。
ExposureGraphNodes
| summarize by NodeLabel
テナント内のすべてのエッジ ラベルを一覧表示する
次のクエリでは、 ExposureGraphEdges
テーブル内のデータをグループ化し、Kusto の summarize
演算子を使用してエッジ ラベル (EdgeLabel
) で一覧表示します。
ExposureGraphEdges
| summarize by EdgeLabel
指定されたノード ラベルからすべての接続を一覧表示する
次のクエリは、 ExposureGraphEdges
テーブル内のデータをグループ化し、ソース ノード ラベルが microsoft.compute/virtualmachines
されている場合、仮想マシンの概要を EdgeLabel
します。 これは、資産を仮想マシンに接続するエッジをセキュリティ露出グラフにまとめます。
ExposureGraphEdges
| where SourceNodeLabel == "microsoft.compute/virtualmachines"
| summarize by EdgeLabel
特定のノード ラベルへのすべての接続を一覧表示する
次のクエリは、仮想マシンを他のセキュリティ露出グラフ資産に接続するエッジをまとめたものです。
ExposureGraphEdges
テーブル内のデータをグループ化し、ターゲット ノード ラベルがmicrosoft.compute/virtualmachines
されている場合は、Kusto の summarize
演算子を使用してターゲット ノード ラベルをEdgeLabel
で一覧表示します。
ExposureGraphEdges
| where TargetNodeLabel == "microsoft.compute/virtualmachines"
| summarize by EdgeLabel
特定のノード ラベルのプロパティを一覧表示する
次のクエリは、仮想マシン ノード ラベルのプロパティを一覧表示します。
ExposureGraphNodes
テーブル内のデータをグループ化し、ノード ラベル "microsoft.compute/virtualmachines" の結果のみを表示するようにフィルター処理します。
project-keep
演算子を使用すると、クエリはNodeProperties
列を保持します。 返されるデータは 1 行に制限されます。
ExposureGraphNodes
| where NodeLabel == "microsoft.compute/virtualmachines"
| project-keep NodeProperties
| take 1
露出グラフにクエリを実行する
露出グラフを照会するには:
Microsoft Defender ポータルで、[ハンティング] -> [高度なハンティング] を選択します。
[クエリ] 領域にクエリを入力します。 クエリの作成に役立つグラフ スキーマ、関数、演算子テーブル、または次の例を使用します。
[ クエリの実行] を選択します。
グラフ指向のクエリの例
次のグラフ指向のクエリ例を使用して、セキュリティ公開クエリの作成に役立ちます。 この例では、リスクを明らかにできるエンティティ間のリレーションシップを公開するパターンを検索します。 コンテキストとインシデント/アラートシグナルを関連付ける方法について説明します。
エッジを持つすべてのノード ラベルを特定のノード ラベルに一覧表示する
次のクエリは、仮想マシン ノード ラベルへのコネクタを持つすべての受信ノード ラベルの一覧になります。 グラフ構造を構築するには、ExposureGraphEdges
テーブル内のSourceNodeId
列データを、make-graph
演算子を使用してExposureGraphNodes
テーブルのTargetNodeId
列にマッピングすることで、グラフ構造を構築します。
次に、graph-match
演算子を使用して、ターゲット ノードがTargetNode
し、microsoft.compute/virtualmachines
と一致NodeLabel
グラフ パターンを作成します。
project
演算子は、IncomingNodeLabels
のみを保持するために使用されます。
IncomingNodeLabels
によって結果が一覧表示されます。
ExposureGraphEdges
| make-graph SourceNodeId --> TargetNodeId with ExposureGraphNodes
on NodeId
| graph-match (SourceNode)-[edges]->(TargetNode)
where TargetNode.NodeLabel == "microsoft.compute/virtualmachines"
project IncomingNodeLabels = SourceNode.NodeLabel
| summarize by IncomingNodeLabels
特定のノード ラベルを付けるすべてのノード ラベルを一覧表示する
次のクエリは、仮想マシン ノード ラベルへのコネクタを持つすべての発信ノード ラベルの一覧になります。
- グラフ構造を構築するには、
make-graph
演算子を使用して、SourceNodeId
列がExposureGraphEdges
テーブル内のデータをExposureGraphNodes
テーブルのTargetNodeId
列にマッピングしてグラフ構造を構築します。 - 次に、
graph-match
演算子を使用して、SourceNode
とNodeLabel
が一致するグラフ パターンmicrosoft.compute/virtualmachines
一致します。 -
project
演算子は、OutgoingNodeLabels
のみを保持するために使用されます。OutgoingNodeLabels
によって結果が一覧表示されます。
ExposureGraphEdges
| make-graph SourceNodeId --> TargetNodeId with ExposureGraphNodes
on NodeId
| graph-match (SourceNode)-[edges]->(TargetNode)
where SourceNode.NodeLabel == "microsoft.compute/virtualmachines"
project OutgoingNodeLabels = SourceNode.NodeLabel
| summarize by OutgoingNodeLabels
RCE の脆弱性を使用してインターネットに公開されている VM を検出する
次のクエリを使用すると、インターネットとリモート コード実行 (RCE) の脆弱性に公開されている仮想マシンを検出できます。
-
ExposureGraphNodes
スキーマ テーブルを使用します。 -
NodeProperties
exposedToInternet
とvulnerableToRCE
の両方が true の場合、カテゴリ (Categories
) が仮想マシン (virtual_machine
) であることを確認します。
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.exposedToInternet)
| where isnotnull(NodeProperties.rawData.vulnerableToRCE)
| where Categories has "virtual_machine" and set_has_element(Categories, "virtual_machine")
特権エスカレーションの脆弱性を持つインターネットに接続するデバイスを検出する
次のクエリでは、特権エスカレーションの脆弱性にさらされているインターネットに接続しているデバイスを検索します。これにより、システム内のより高いレベルの特権へのアクセスが許可される可能性があります。
-
ExposureGraphNodes
スキーマ テーブルを使用します。 -
NodeProperties
がインターネットに接続 (IsInternetFacing
) とVulnerableToPrivilegeEscalation
の両方である場合、クエリは、Categories
内の項目が実際にデバイス (device
) であることを確認します。
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.IsInternetFacing)
| where isnotnull(NodeProperties.rawData.VulnerableToPrivilegeEscalation)
| where set_has_element(Categories, "device")
複数の重要なデバイスにログインしたすべてのユーザーを表示する
このクエリにより、複数の重要なデバイスにログインしたユーザーの一覧と、ログインしているデバイスの数が表示されます。
- 重要度レベルが 4 を超えたデバイスまたは
identity
によってフィルター処理されたExposureGraphNodes
データを使用して、IdentitiesAndCriticalDevices
テーブルを作成します。 - 次に、
EdgeLabel
がCan Authenticate As
されるmake-graph
演算子を使用してグラフ構造を作成します。 -
graph-match
演算子を使用して、device
がidentity
と一致するインスタンスを照合します。 - 次に、
project
演算子を使用して、ID とデバイス ID を保持します。 -
mv-apply
オペレーターは、デバイス ID と ID ID を種類別にフィルター処理します。 これらを要約し、ヘッダー、Number Of devices user is logged-in to
、User Id
を含むテーブルに結果を表示します。
let IdentitiesAndCriticalDevices = ExposureGraphNodes
| where
// Critical Device
(set_has_element(Categories, "device") and isnotnull(NodeProperties.rawData.criticalityLevel) and NodeProperties.rawData.criticalityLevel.criticalityLevel < 4)
// or identity
or set_has_element(Categories, "identity");
ExposureGraphEdges
| where EdgeLabel == "Can Authenticate As"
| make-graph SourceNodeId --> TargetNodeId with IdentitiesAndCriticalDevices on NodeId
| graph-match (Device)-[canConnectAs]->(Identity)
where set_has_element(Identity.Categories, "identity") and set_has_element(Device.Categories, "device")
project IdentityIds=Identity.EntityIds, DeviceIds=Device.EntityIds
| mv-apply DeviceIds on (
where DeviceIds.type == "DeviceInventoryId")
| mv-apply IdentityIds on (
where IdentityIds.type == "SecurityIdentifier")
| summarize NumberOfDevicesUserLoggedinTo=count() by tostring(IdentityIds.id)
| where NumberOfDevicesUserLoggedinTo > 1
| project ["Number Of devices user is logged-in to"]=NumberOfDevicesUserLoggedinTo, ["User Id"]=IdentityIds_id
重要な脆弱性を持つクライアント デバイスを表示する/価値の高いサーバーにアクセスできるユーザー
次のクエリでは、RCE の脆弱性を持つデバイスとそのデバイス ID、および重大な脆弱性が高いデバイスとそのデバイス ID の一覧が表示されます。
- これにより、重要度が 4 未満の RCE 脆弱性を持つデバイス (
device
) と、フィルター処理とパターン マッチングを通じて重大な脆弱性を持つデバイスを表示する ID (identity
) を含むIdentitiesAndCriticalDevices
テーブルが作成されます。 - 一覧がフィルター処理され、エッジ ラベルが
Can Authenticate As
され、CanRemoteInteractiveLogonTo
されている接続のみが表示されます。
let IdentitiesAndCriticalDevices = ExposureGraphNodes // Reduce the number of nodes to match
| where
// Critical devices & devices with RCE vulnerabilities
(set_has_element(Categories, "device") and
(
// Critical devices
(isnotnull(NodeProperties.rawData.criticalityLevel) and NodeProperties.rawData.criticalityLevel.criticalityLevel < 4)
or
// Devices with RCE vulnerability
isnotnull(NodeProperties.rawData.vulnerableToRCE)
)
)
or
// identity
set_has_element(Categories, "identity");
ExposureGraphEdges
| where EdgeLabel in~ ("Can Authenticate As", "CanRemoteInteractiveLogonTo") // Reduce the number of edges to match
| make-graph SourceNodeId --> TargetNodeId with IdentitiesAndCriticalDevices on NodeId
| graph-match (DeviceWithRCE)-[CanConnectAs]->(Identity)-[CanRemoteLogin]->(CriticalDevice)
where
CanConnectAs.EdgeLabel =~ "Can Authenticate As" and
CanRemoteLogin.EdgeLabel =~ "CanRemoteInteractiveLogonTo" and
set_has_element(Identity.Categories, "identity") and
set_has_element(DeviceWithRCE.Categories, "device") and isnotnull(DeviceWithRCE.NodeProperties.rawData.vulnerableToRCE) and
set_has_element(CriticalDevice.Categories, "device") and isnotnull(CriticalDevice.NodeProperties.rawData.criticalityLevel)
project DeviceWithRCEIds=DeviceWithRCE.EntityIds, DeviceWithRCEName=DeviceWithRCE.NodeName, CriticalDeviceIds=CriticalDevice.EntityIds, CriticalDeviceName=CriticalDevice.NodeName
特定のノード ID から特定のラベルを持つノードへのすべてのパスを指定する
このクエリでは、特定の IP ノードからのパスが表示され、仮想マシン ノード ラベルに接続する最大 3 つの資産が渡されます。
-
ExposureGraphNodes
およびExposureGraphEdges
スキーマ テーブルとmake-graph
演算子とgraph-match
演算子を使用してグラフ構造を作成します。 -
project
演算子を使用すると、IP ID、IP プロパティ、仮想マシン ID、および仮想マシンのプロパティの一覧が表示されます。
let IPsAndVMs = ExposureGraphNodes
| where (set_has_element(Categories, "ip_address") or set_has_element(Categories, "virtual_machine"));
ExposureGraphEdges
| make-graph SourceNodeId --> TargetNodeId with IPsAndVMs on NodeId
| graph-match (IP)-[anyEdge*1..3]->(VM)
where set_has_element(IP.Categories, "ip_address") and set_has_element(VM.Categories, "virtual_machine")
project IpIds=IP.EntityIds, IpProperties=IP.NodeProperties.rawData, VmIds=VM.EntityIds, VmProperties=VM.NodeProperties.rawData