3. KMS 审计日志的数据源:四大云平台与自建方案
做密钥审计,第一件事就是搞清楚日志从哪来。不同平台的数据格式、采集方式、延迟都不一样。我刚开始做跨云审计项目时,就被这些差异坑过——同一把密钥在 AWS 和 GCP 上的日志字段差得挺远,写查询语句时才发现。
这一章,咱们就逐个拆解四大数据源:AWS CloudTrail、GCP Cloud Audit Logs、Azure Monitor,还有自建 KMS(以 HashiCorp Vault 为例)。
3.1 AWS CloudTrail:最成熟但也最烧钱
AWS 的审计日志主要靠 CloudTrail。它会记录所有 KMS 相关的 API 调用,包括管理事件(CreateKey、DisableKey)和数据事件(Encrypt、Decrypt、GenerateDataKey)。
我个人习惯把 CloudTrail 分为两部分:管理事件默认开启且免费;数据事件需要额外开启并付费。你想想看,一天几百万次 Encrypt 调用,如果全记下来,日志量和费用都很可观。
| 事件类型 | 默认状态 | 费用 | 适用场景 |
|---|---|---|---|
| 管理事件(Management) | 已开启 | 免费 | 密钥创建、删除、权限变更 |
| 数据事件(Data) | 需手动开启 | 按日志量计费 | Encrypt/Decrypt 等实际使用 |
| Insights 事件 | 可选 | 额外费用 | 异常行为检测 |
我的经验: 生产环境中我只开启关键主密钥(CMK)的数据事件,避免对所有密钥无差别开启。可以在 CloudTrail 的“数据事件”配置中按资源 ARN 筛选,粒度到单把密钥。
CloudTrail 日志最终存放在 S3 桶里,结构大概是:
s3://my-bucket/AWSLogs/123456789012/CloudTrail/us-east-1/2025/03/31/
123456789012_CloudTrail_us-east-1_20250331T0000Z_abc123.json.gz
每条记录是一个 JSON 对象,关键字段包括:
- eventSource:kms.amazonaws.com
- eventName:Decrypt、Encrypt 等
- userIdentity:调用者身份(IAM 用户、角色或服务)
- resources:涉及的密钥 ARN
- requestParameters:加密上下文(EncryptionContext)
注意:CloudTrail 数据事件的延迟通常在 5~15 分钟。如果在异常事件后实时查询,这个间隔可能会让你错过紧急响应窗口。
3.2 GCP Cloud Audit Logs:细粒度但字段名古怪
GCP 的审计日志叫 Cloud Audit Logs,它分为三类:Admin Activity、Data Access、Policy Denied。其中 Data Access 日志记录密钥的加密和解密操作。
我记得第一次在 GCP 上查 KMS 审计时,被 protoPayload.authenticationInfo.principalEmail 这种长字段名搞得头晕。GCP 和 AWS 的字段命名风格完全不同,需要单独适配。
| 日志类型 | 默认开启 | 存储位置 | KMS 相关操作 |
|---|---|---|---|
| Admin Activity | 是 | Cloud Logging 永久存储 | 创建/删除/更新密钥 |
| Data Access | 否(需手动开启) | Cloud Logging 可配置保留 | Encrypt/Decrypt/GenerateDataKey |
| Policy Denied | 是 | Cloud Logging | 授权失败 |
核心字段解析:
- protoPayload.methodName:
google.cloud.kms.v1.KeyManagementService.Decrypt - protoPayload.authenticationInfo.principalEmail:调用者邮箱
- protoPayload.resourceName:密钥资源路径
- protoPayload.request:请求参数(如加密上下文)
我曾经踩过坑:GCP 的 Data Access 日志默认只保留 30 天,而且不自动导出到 BigQuery。如果要做长期审计,必须配置日志路由(sink)将日志同步到 BigQuery 或 Cloud Storage。
3.3 Azure Monitor:Key Vault 审计的入口
Azure 的 Key Vault 审计日志通过 Azure Monitor 的“诊断设置”收集。你需要先创建一个 Log Analytics 工作区,然后在 Key Vault 的资源页面开启诊断设置,选择要发送的日志类别。
亮点是:Azure Key Vault 的审计日志默认记录所有操作,不需要像 AWS 那样单独开启数据事件。它会自动捕获 vault-access-policy-change、key-operation 等类别。
- 打开 Key Vault 资源 → 监控 → 诊断设置
- 点击“添加诊断设置”
- 选择“发送到 Log Analytics 工作区”
- 勾选“AuditEvent”类别
- 保存后 5 分钟内生效
日志字段示例(Kusto 查询语言):
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.KEYVAULT"
| where OperationName == "VaultGet" or OperationName == "KeySign"
| project TimeGenerated, CallerIPAddress, Identity_claim_upn, OperationName, ResultType
| take 10
小技巧:Azure Monitor 的日志延迟通常 < 5 分钟,比 CloudTrail 快。适合对实时性要求较高的告警场景。
3.4 HashiCorp Vault:自建 KMS 的审计日志
自建 KMS 就要靠自己了。以 HashiCorp Vault 为例,它的审计日志可以输出到文件、syslog 或者 socket。配置很简单,但坑不少。
Vault 的审计日志记录所有请求和响应,包括密钥的读取、写入、解密等。每条日志是一个 JSON 对象,包含请求路径、客户端 IP、令牌类型等。
配置示例(audit file):
# vault audit enable file file_path=/var/log/vault_audit.log
常用的审计后端:
| 后端类型 | 配置方式 | 适用场景 |
|---|---|---|
| file | vault audit enable file | 本地开发、单机测试 |
| syslog | vault audit enable syslog | 集中式日志收集 |
| socket | vault audit enable socket | 自定义流式处理 |
核心注意事项:
- Vault 的审计日志默认不包含请求体(response 数据),需要额外开启
raw模式,但会放大性能开销。 - 日志轮转必须自己处理。我曾经见过生产环境审计日志把磁盘写满导致 Vault 挂掉。
- Syslog 格式下,JSON 字段会被展平,解析时要注意。
3.5 四类数据源的对比总结
每次做跨平台项目,我都会把这张表摆在手边。说白了,选哪个数据源取决于你用什么云、要查什么粒度、预算多少。
| 特性 | AWS CloudTrail | GCP Cloud Audit Logs | Azure Monitor | HashiCorp Vault |
|---|---|---|---|---|
| 数据事件开启方式 | 手动(按资源 ARN) | 手动(按项目/资源) | 自动 | 自动(audit enable) |
| 默认延迟 | 5-15 分钟 | 秒级~分钟级 | < 5 分钟 | 近实时(取决于 syslog) |
| 日志格式 | JSON | JSON + proto | JSON | JSON / syslog |
| 长期存储 | S3 + Glue/Athena | Cloud Storage / BigQuery | Log Analytics + 导出 | 自建(ELK / Splunk) |
| 加密上下文可见性 | ✅ 有 | ✅ 有 | ❌ 默认无 | ✅ 需开启 raw |
| 费用 | 高(按量计费) | 中(日志存储费) | 低(包含在 Log Analytics) | 自建硬件+运维 |
关键点:如果你需要跨云统一审计,建议把所有日志集中到一个日志平台(如 ELK 或 Splunk),然后做字段映射。这一步是最耗时的,但做一次后收益很大。