首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KQL/Search-AzGraph算子

KQL/Search-AzGraph算子
EN

Stack Overflow用户
提问于 2022-08-30 17:47:09
回答 1查看 137关注 0票数 0

我刚刚开始使用AzGraph,我正在学习如何使用它的查询,当我试图将密钥库中的IP地址白化时,我遇到了一个问题,下面是我目前正在运行的查询:

代码语言:javascript
复制
Search-AzGraph -Query "resources
|where type == 'microsoft.keyvault/vaults'
|where properties.publicNetworkAccess == 'Enabled'
|mv-expand properties.networkAcls.ipRules
|project kvName = name, kvRule = properties.networkAcls.ipRules"

输出不提供每个保险库的地址列表,而是返回同一金库的一串重复行,这只发生在一定数量的白名单地址之后,我不确定数字:

代码语言:javascript
复制
kvName              kvRule                                                                                                           
------              ------                                                                                                           
Vault1                                                                                                                          
Vault2                                                                                                                  
Vault3              {@{value=1.1.1.1/32}}                                                                                     
Vault4              {@{value=1.1.1.1/32}, @{value=2.2.2.2/32}}                                                             
Vault5              {@{value=1.1.1.1/32}, @{value=2.2.2.2/32}}                                                             
Vault6              {@{value=1.1.1.1/32}}                                                                                      
Vault7                                                                                                                               
Vault8                                                                                                                               
Vault9  <--         {@{value=1.1.1.1/32}, @{value=2.2.2.2/32}, @{value=3.3.3.3/32}, @{value=4.4.4.4/32}...}
Vault9  <--         {@{value=1.1.1.1/32}, @{value=2.2.2.2/32}, @{value=3.3.3.3/32}, @{value=4.4.4.4/32}...}
Vault9  <--         {@{value=1.1.1.1/32}, @{value=2.2.2.2/32}, @{value=3.3.3.3/32}, @{value=4.4.4.4/32}...}
Vault9  <--         {@{value=1.1.1.1/32}, @{value=2.2.2.2/32}, @{value=3.3.3.3/32}, @{value=4.4.4.4/32}...}
Vault9  <--         {@{value=1.1.1.1/32}, @{value=2.2.2.2/32}, @{value=3.3.3.3/32}, @{value=4.4.4.4/32}...}   

我也尝试过扩展属性值,以查看这是否有帮助,但相反,格式更改为下面。

代码:

代码语言:javascript
复制
Search-AzGraph -Query "resources
|where type == 'microsoft.keyvault/vaults'
|where properties.publicNetworkAccess == 'Enabled'
|extend kvRule=parsejson(tostring(properties.networkAcls.ipRules))
|mv-expand kvRule 
|project kvName = name, kvRule.value"

输出:

代码语言:javascript
复制
kvName              kvRule            
------              ------                                     
Vault1                           
Vault2             1.1.1.1/32
Vault3             1.2.3.4/32   
Vault4             5.6.7.8/32   
Vault5             1.2.3.3/32 
Vault6                      
Vault7
Vault8                 
Vault9   <--       1.1.1.1/32   
Vault9   <--       2.2.2.2/32  
Vault9   <--       3.3.3.3/32 
Vault9   <--       4.4.4.4/32   

我遇到了连接运算符,并试图对我的查询使用这些示例,但是失败了,输出总是类似于上面的输出,或者我收到了一个错误:

此查询的输出类似于第二个示例:

代码语言:javascript
复制
Search-AzGraph -Query "Resources 
| join kind=leftouter (resources | where type=='microsoft.keyvault/vaults' | where properties.publicNetworkAccess == 'Enabled' | extend kvRule=parsejson(tostring(properties.networkAcls.ipRules)) | mv-expand kvRule | project id, kvName = name, kvURI = properties.vaultUri, kvRule) on id
| where type == 'microsoft.keyvault/vaults' 
| project id, name, kvType = type, kvLoc = location, kvSub = subscriptionId, kvURI, kvRule= properties.networkAcls.ipRules"

我还尝试了以下查询,该查询错误地指出ipRules是动态的:

代码语言:javascript
复制
Search-AzGraph -Query "Resources
|where type == 'microsoft.keyvault/vaults'
|where properties.publicNetworkAccess == 'Enabled'
|extend kvRule=parsejson(tostring(properties.networkAcls.ipRules))
|project kvID = id, name, kvLoc = location, kvSub = subscriptionId, kvURI = properties.vaultUri, kvRule
| join kind=leftouter (
    Resources
    |where type == 'microsoft.keyvault/vaults'
    |where properties.publicNetworkAccess == 'Enabled'
    |project name, kvRule = tolower(id))
on kvRule
| summarize by name" 

错误:

代码语言:javascript
复制
"code": "InvalidQuery",
"message": "Query is invalid. Please refer to the documentation for the Azure Resource Graph service and fix the error before retrying."

"code": "Default",
"message": "join key 'kvRule' is of a 'dynamic' type. Please use an explicit cast using extend operator in the join legs (for example, '... | extend kvRule = tostring(kvRule) | join (... | extend kvRule = tostring(kvRule)) on kvRule') as join on a 'dynamic' type is not supported."

我很难理解如何使这个查询工作,我真的认为我需要使用join操作符来正确地执行这个查询,但是我对KQL/DB查询没有足够的理解,我希望了解如何正确地执行这个查询。

我的目标是使输出成为一个单一的保险库名称,如果在一行中有所有地址,则kvRule在其白名单中包含一个完整的地址列表:

代码语言:javascript
复制
kvName              kvRule                                                                                                           
------              ------                                                                                                           
Vault1                                                                                                                          
Vault2               1.1.1.1/32, 2.2.2.2/32, 3.3.3.3/32                                                                                                    
Vault3               1.1.1.1/32, 2.2.2.2/32, 3.3.3.3/32, 1.1.1.3/32, 2.2.2.4/32, 3.3.3.1/32 
EN

回答 1

Stack Overflow用户

发布于 2022-10-04 04:32:49

若要修复查询,而不是

|extend kvRule=parsejson(tostring(properties.networkAcls.ipRules))

搞定

|extend kvRule=tostring(parsejson(properties.networkAcls.ipRules))

为了更好地过滤,您可以考虑使用

| where isnotempty(kvRule)

为了取得明确的结果

kind=inner

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73546582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档