如何获取孤立密钥库列表?

问题描述 投票:0回答:1

我一直在 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
azure certificate azure-keyvault kql secrets
1个回答
0
投票

如果您的目标是识别未使用的 Key Vault,那么您的方法就有很大缺陷。您当前正在查找创建、修改或删除 Key Vault 的事件。这是一个不好的方法,因为:

  1. 这些不会告诉您是否使用了 Key Vault。这些仅告诉您保管库本身是否已被修改,而不是有关内容(秘密、证书等)
  2. 您无法检测在记录周期开始之前创建的保管库。您很可能没有从一开始就记录所有内容。

那么你怎样才能实现你的目标呢?好吧,我将从以下开始:

  1. 使用 Az CLI 或 Az Powershell 获取所有 Key Vault 的列表(我的示例基于 Az CLI)

    az keyvault list

  2. 检查 KeyVault 是否包含任何带有

    az keyvault secret list --vault-name <VAULTNAME>

    az keyvault certificate list --vault-name  <VAULTNAME>

    az keyvault key list --vault-name  <VAULTNAME>

  3. 最后,您可以使用审核日志记录检查保管库是否正在使用(需要启用,最好通过 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
角色即可。然而,具有访问策略的保管库要复杂得多:您需要为每个保管库分配一个针对您身份的读者角色。

© www.soinside.com 2019 - 2024. All rights reserved.