我一直在 KQL 中努力提出一个查询来检测在特定时间范围(例如 30 天)内未访问的 keyvaults 以及空 keyvaults 没有秘密、没有证书等。这里对 KQL 还很陌生,有什么建议吗?
在kql语句下方但没有得到所需的输出(空)
let OneDayAgo = ago(30d);
AzureActivity
| where TimeGenerated <= ago(30d)
| where ResourceProvider == "Microsoft.KeyVault"
| where OperationName in ("Microsoft.KeyVault/vaults/write", "Microsoft.KeyVault/vaults/delete")
| extend KeyVaultName = tostring(split(Resource, '/')[8])
| summarize LatestActivityTime = max(TimeGenerated) by KeyVaultName
| where isnull(LatestActivityTime) or LatestActivityTime <= ago(30d)
| project KeyVaultName, LatestActivityTime
如果您的目标是识别未使用的 Key Vault,那么您的方法就有很大缺陷。您当前正在查找创建、修改或删除 Key Vault 的事件。这是一个不好的方法,因为:
那么你怎样才能实现你的目标呢?好吧,我将从以下开始:
使用 Az CLI 或 Az Powershell 获取所有 Key Vault 的列表(我的示例基于 Az CLI)
az keyvault list
检查 KeyVault 是否包含任何带有
az keyvault secret list --vault-name <VAULTNAME>
az keyvault certificate list --vault-name <VAULTNAME>
az keyvault key list --vault-name <VAULTNAME>
最后,您可以使用审核日志记录检查保管库是否正在使用(需要启用此,最好通过 Azure 策略启用)。查询应该类似于
AzureDiagnostics
| where Resource in ("<VAULTNAME>")
| where OperationName !in
("VaultGet", "VaultList",
"SecretList", "SecretListVersions", "KeyList",
"CertificateList", "CertificateListVersions")
请注意,您需要确定哪些操作意味着保管库“正在使用”。在我的示例中,我忽略了可能由其他监视脚本或类似脚本创建的列表操作。
最后,请注意 Key Vault 可以使用两种不同的访问控制方法:RBAC 或访问策略。在 RBAC 模型中,获得足够的权限来运行这样的脚本非常容易:您只需要对要监视的所有 Key Vault 具有
Key Vault Reader
角色即可。然而,具有访问策略的保管库要复杂得多:您需要为每个保管库分配一个针对您身份的读者角色。