Azure存储账户访问密钥转储日志识别及KQL优化问询
检测Azure存储账户密钥导出的日志优化方案
问题背景
根据Azure威胁研究矩阵相关内容,查看存储账户访问密钥的操作应生成可识别的日志,但实际复现中发现:仅进入Access Keys页面和点击「显示密钥」按钮的操作,在AzureActivity日志中的记录完全一致,无法区分是否真的触发了密钥查看行为。当前使用的KQL查询仅筛选了LISTKEYS操作,无法精准识别密钥被导出/查看的动作。
日志源与KQL优化方案
1. 通过HttpMethod区分操作类型
Azure门户中,仅进入Access Keys页面的操作为GET请求,不会实际获取密钥;而点击「显示密钥」的操作会触发POST请求,才是真正的密钥获取动作。可以在KQL中添加该字段筛选:
AzureActivity | where TimeGenerated > ago(90d) | where OperationNameValue contains 'MICROSOFT.STORAGE/STORAGEACCOUNTS/LISTKEYS' | where HttpMethod == "POST" // 仅保留实际触发密钥获取的请求 | summarize make_set(ActivityStatusValue) by Caller, Resource, HttpMethod
2. 启用存储账户级诊断日志
除了AzureActivity,开启存储账户的诊断日志能获取更细粒度的操作细节:
- 进入目标存储账户的「诊断设置」,添加诊断日志并勾选
StorageAccountLogs类别 - 日志会同步到Log Analytics工作区,可通过
StorageLogs表查询:
StorageLogs | where TimeGenerated > ago(90d) | where OperationName == "ListKeys" | project TimeGenerated, CallerIpAddress, OperationName, StatusCode, AccountName
3. 区分门户与PowerShell操作
使用Get-AzStorageAccountKey执行密钥查询时,AzureActivity日志的Caller字段会标记为AzurePowerShell,可通过以下查询区分操作来源:
AzureActivity | where TimeGenerated > ago(90d) | where OperationNameValue contains 'MICROSOFT.STORAGE/STORAGEACCOUNTS/LISTKEYS' | where HttpMethod == "POST" | extend OperationSource = iff(Caller contains "AzurePowerShell", "PowerShell", "Azure Portal") | summarize make_set(ActivityStatusValue) by Caller, Resource, OperationSource
关键说明
- GET请求仅加载页面框架,不会获取密钥明文;只有POST请求才会触发密钥的查询与返回
- 存储账户诊断日志可提供调用者IP、请求状态码等信息,更适合检测异常访问行为
内容的提问来源于stack exchange,提问作者HarriS
相关产品推荐
相关产品推荐

