查詢企業曝光圖表
使用 Microsoft 安全性暴露管理 中的企業曝光圖表,在 Microsoft Defender 入口網站的 進階搜捕 中主動搜捕企業暴露威脅。
本文提供在企業曝光圖表中建構查詢的一些範例、秘訣和提示。
安全性公開管理目前處於公開預覽狀態。
重要事項
本文中的部分資訊與發行前版本產品有關,在產品正式發行前可能會大幅度修改。 Microsoft 對此處提供的資訊,不提供任何明確或隱含的瑕疵擔保。
先決條件
建置進階搜捕查詢
- 檢閱 建置進階搜捕查詢的最佳做法
- 開始使用 Kusto 查詢語言 (KQL)
使用 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()
因為運算符會傳回 true,即使是類別也一樣 prefix_data
。
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
數據表make-graph
中ExposureGraphNodes
的數據行,以建立圖形結構。
然後,它會使用 運算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
列出對特定節點標籤進行排序的所有節點標籤
下列查詢會產生具有虛擬機節點標籤連接器的所有傳出節點標籤清單。
- 它會使用
make-graph
運算符將數據表中的數據對應至TargetNodeId
數據表中ExposureGraphEdges
ExposureGraphNodes
的數據行,以建置圖形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
構數據表。 - 當
NodeProperties
是 ()IsInternetFacing
和VulnerableToPrivilegeEscalation
的因特網對應時,查詢會檢查 中的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
符來保留身分識別標識碼和裝置標識符。 - 操作
mv-apply
員會依類型篩選裝置標識碼和身分識別標識碼。 它會摘要說明它們,並在具有標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 弱點的裝置及其裝置識別碼,以及具有高嚴重弱點的裝置及其裝置標識碼的清單。
- 它會建立一個
IdentitiesAndCriticalDevices
數據表,其中包含具有 RCE 弱點且device
嚴重性低於 4 的裝置 () ,而身分識別 (identity
) 透過篩選和模式比對顯示具有重大弱點的裝置。 - 清單會經過篩選,只顯示具有邊緣卷標和
CanRemoteInteractiveLogonTo
的連線Can Authenticate As
。
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
提供從特定節點標識碼到具有特定標籤節點的所有路徑
此查詢會顯示特定IP節點的路徑,最多傳遞三個資產,以聯機到虛擬機節點標籤。
- 它會使用和
ExposureGraphNodes
ExposureGraphEdges
架構數據表以及make-graph
和graph-match
運算子來建立圖形結構。 - 使用運算
project
子時,它會顯示IP標識碼、IP 屬性、虛擬機標識碼和虛擬機屬性的清單。
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