查询企业曝光图
使用 Microsoft 安全风险管理 中的企业曝光图在 Microsoft Defender 门户中的高级搜寻中主动搜寻企业曝光威胁。
本文提供了一些有关在企业曝光图中构造查询的示例、提示和提示。
先决条件
生成高级搜寻查询
使用 make-graph 运算符
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
。 返回的数据限制为一行。
ExposureGraphNodes
| where NodeLabel == "microsoft.compute/virtualmachines"
| project-keep NodeProperties
| take 1
查询曝光图
查询曝光图:
在Microsoft Defender门户中,选择“搜寻 -> 高级搜寻”。
在“查询”区域中,键入查询。 使用图形架构、函数和运算符表或以下示例来帮助生成查询。
选择 “运行查询”。
面向图形的查询示例
使用这些面向图形的查询示例来帮助你编写更好的安全暴露查询。 这些示例搜索模式以公开可以发现风险的实体之间的关系。 它们演示如何将上下文与事件/警报信号相关联。
列出具有特定节点标签边缘的所有节点标签
以下查询将生成所有传入节点标签的列表,其中包含虚拟机节点标签的连接器。 它通过使用 运算符将表中的SourceNodeId
列数据映射到表中的ExposureGraphEdges
TargetNodeId
列ExposureGraphNodes
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
列出具有特定节点标签的所有节点标签
以下查询将生成所有传出节点标签的列表,其中包含虚拟机节点标签的连接器。
- 它通过使用 运算符将列中的数据映射到
SourceNodeId
表中TargetNodeId
的列ExposureGraphNodes
make-graph
来生成图形结构,从而ExposureGraphEdges
生成图形结构。 - 然后,
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 漏洞的 Internet 公开的 VM
通过以下查询,可以发现向 Internet 和远程代码执行公开的虚拟机, (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")
发现具有特权提升漏洞的面向 Internet 的设备
以下查询查找暴露在特权提升漏洞中的面向 Internet 的设备,该漏洞可能允许访问系统中的更高级别特权。
- 它使用
ExposureGraphNodes
架构表。 - 当 同时面向 Internet (
IsInternetFacing
) 和VulnerableToPrivilegeEscalation
时NodeProperties
,查询会检查中的Categories
项是否实际上是 (device
) 设备。
ExposureGraphNodes
| where isnotnull(NodeProperties.rawData.IsInternetFacing)
| where isnotnull(NodeProperties.rawData.VulnerableToPrivilegeEscalation)
| where set_has_element(Categories, "device")
显示登录到多个关键设备的所有用户
此查询将生成登录多个关键设备的用户列表,以及他们登录的设备数。
- 它使用
ExposureGraphNodes
按严重性级别高于 4 的设备或 按identity
筛选的数据创建IdentitiesAndCriticalDevices
表。 - 然后,它使用
make-graph
运算符创建图形结构,其中 为EdgeLabel
Can Authenticate As
。 - 它使用
graph-match
运算符来匹配 与 匹配的device
identity
实例。 - 然后,
project
它使用 运算符来保留标识 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
表,其中包括device
具有严重性低于 4 的 RCE 漏洞 () 的设备,以及标识 (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 节点的路径,并传递最多三个资产,导致连接到虚拟机节点标签。
- 它使用
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