次の方法で共有


エンタープライズ露出グラフを照会する

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
..

動的列とスマート インデックス作成を使用する

NodePropertiesCategories は動的列です。

  • Kusto は、これらの列に json のようなコンテンツが含まれていることを認識し、スマート インデックス作成を適用します。
  • ただし、すべての Kusto 演算子がインデックスを使用するわけではありません。 たとえば、 set_has_elementisemptyisnotnull は、動的列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

露出グラフにクエリを実行する

露出グラフを照会するには:

  1. Microsoft Defender ポータルで、[ハンティング -> 高度なハンティング] を選択します。

  2. [クエリ] 領域にクエリを入力します。 クエリの作成に役立つグラフ スキーマ、関数、演算子テーブル、または次の例を使用します。

  3. [ クエリの実行] を選択します。

グラフ指向のクエリの例

次のグラフ指向のクエリ例を使用して、セキュリティ公開クエリの作成に役立ちます。 この例では、リスクを明らかにできるエンティティ間のリレーションシップを公開するパターンを検索します。 コンテキストとインシデント/アラートシグナルを関連付ける方法について説明します。

エッジを持つすべてのノード ラベルを特定のノード ラベルに一覧表示する

次のクエリは、仮想マシン ノード ラベルへのコネクタを持つすべての受信ノード ラベルの一覧になります。 テーブル内の列データをSourceNodeId、演算子を使用してテーブル内ExposureGraphEdgesExposureGraphNodesTargetNodeId列にマッピングしてグラフ構造をmake-graph構築し、グラフ構造を構築します。

次に、 演算子を graph-match 使用して、ターゲット ノード TargetNodeNodeLabel が一致 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-graphExposureGraphNodesにマッピングしてTargetNodeIdグラフ構造を構築し、グラフ構造を構築SourceNodeIdします。
  • 次に、 演算子を graph-match 使用して、 と が一致するグラフ パターン SourceNodeNodeLabel 一致します 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 の両方NodePropertiesexposedToInternetが true の場合、カテゴリ () が仮想マシン (Categoriesvirtual_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 を超えたデバイスまたは によってフィルター処理されたデータを使用してExposureGraphNodesidentityテーブルを作成します。
  • 次に、演算子を使用してグラフ構造を 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 AsCanRemoteInteractiveLogonToが含まれる接続のみが表示されます。
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

次の手順

攻撃面マップを使用して探索します