エンタープライズ露出グラフを照会する
Microsoft Security Exposure Management のエンタープライズ 露出グラフを使用して、Microsoft Defender ポータルで高度なハンティングで企業の露出の脅威を事前に検出します。
この記事では、エンタープライズ 露出グラフでクエリを作成するための例、ヒント、ヒントについて説明します。
セキュリティ公開管理は現在パブリック プレビュー段階です。
重要
この記事の一部の情報は、市販される前に大幅に変更される可能性があるプレリリース製品に関するものです。 Microsoft は、ここで提供されるいかなる情報に関して、明示または黙示を問わず、いかなる保証も行いません。
前提条件
- 攻撃面の管理についてお読みください。
- グラフを操作するために必要なアクセス許可を確認します。
高度なハンティング クエリを構築する
グラフ作成演算子を使用する
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
チェックされ set_has_element
、要素がチェックされます data
。
両方の演算子を使用することが重要です。これは、演算子が 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 ポータルで、[ハンティング -> 高度なハンティング] を選択します。
[クエリ] 領域にクエリを入力します。 クエリの作成に役立つグラフ スキーマ、関数、演算子テーブル、または次の例を使用します。
[ クエリの実行] を選択します。
グラフ指向のクエリの例
次のグラフ指向のクエリ例を使用して、セキュリティ公開クエリの作成に役立ちます。 この例では、リスクを明らかにできるエンティティ間のリレーションシップを公開するパターンを検索します。 コンテキストとインシデント/アラートシグナルを関連付ける方法について説明します。
エッジを持つすべてのノード ラベルを特定のノード ラベルに一覧表示する
次のクエリは、仮想マシン ノード ラベルへのコネクタを持つすべての受信ノード ラベルの一覧になります。 テーブル内の列データをSourceNodeId
、演算子を使用してテーブル内ExposureGraphEdges
ExposureGraphNodes
のTargetNodeId
列にマッピングしてグラフ構造をmake-graph
構築し、グラフ構造を構築します。
次に、 演算子を graph-match
使用して、ターゲット ノード TargetNode
と NodeLabel
が一致 microsoft.compute/virtualmachines
するグラフ パターンを作成します。 演算子は 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
特定のノード ラベルを付けるすべてのノード ラベルを一覧表示する
次のクエリは、仮想マシン ノード ラベルへのコネクタを持つすべての発信ノード ラベルの一覧になります。
- 演算子を使用して、テーブル内のデータをテーブル内
ExposureGraphEdges
の列make-graph
ExposureGraphNodes
にマッピングしてTargetNodeId
グラフ構造を構築し、グラフ構造を構築SourceNodeId
します。 - 次に、 演算子を
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
使用します。 - と
vulnerableToRCE
の両方NodeProperties
exposedToInternet
が 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
使用します。 - がインターネットに接続している (
IsInternetFacing
) とVulnerableToPrivilegeEscalation
の両方である場合NodeProperties
、クエリでは、 内のCategories
項目が実際にデバイス (device
) であることを確認します。
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.IsInternetFacing)
| where isnotnull(NodeProperties.rawData.VulnerableToPrivilegeEscalation)
| where set_has_element(Categories, "device")
複数の重要なデバイスにログインしたすべてのユーザーを表示する
このクエリにより、複数の重要なデバイスにログインしたユーザーの一覧と、ログインしているデバイスの数が表示されます。
- 重要度レベルが
IdentitiesAndCriticalDevices
4 を超えたデバイスまたは によってフィルター処理されたデータを使用してExposureGraphNodes
identity
テーブルを作成します。 - 次に、演算子を使用してグラフ構造を
make-graph
作成します。ここで、EdgeLabel
は ですCan Authenticate As
。 - 演算子を
graph-match
使用して、 がdevice
と一致するインスタンスとidentity
一致します。 - その後、オペレーターを
project
使用して ID ID とデバイス ID を保持します。 - オペレーターは
mv-apply
、デバイス 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 の一覧が表示されます。
- これは、
IdentitiesAndCriticalDevices
重要度が 4 未満の RCE 脆弱性を持つデバイス (device
) と、フィルター処理とパターン マッチングを通じて重大な脆弱性を持つデバイスを表示する ID (identity
) を含むテーブルを作成します。 - 一覧がフィルター処理され、エッジ ラベル
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 つの資産が渡されます。
- と スキーマ テーブルと
ExposureGraphEdges
演算子とgraph-match
演算子をmake-graph
使用ExposureGraphNodes
して、グラフ構造を作成します。 - オペレーターを
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
次の手順
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示