2. 审计日志概述:CloudTrail / Azure Monitor 等云审计服务介绍、审计日志的格式与关键字段

说到 BYOK 场景的异常识别,你首先得知道「日志从哪来、长什么样」。这一章我就把几大主流云的审计服务拉出来遛一遛,再把日志格式拆开揉碎。嗯,都是基本功,但翻车往往就翻在这些基础字段上。

2.1 主流云审计服务一览

我自己经手的项目中,95% 的 BYOK 异常都是靠审计日志发现的。你想想看,密钥操作都被记下来了,谁在什么时候碰了哪个密钥,跑不掉。下面是几家主流的审计服务,我挑重点说。

云厂商审计服务名称主要用途密钥相关事件示例
AWSCloudTrail记录 AWS API 调用CreateKey, Decrypt, GenerateDataKey
AzureAzure Monitor (Activity Log + Diagnostic Settings)订阅级活动日志 + 资源级诊断Microsoft.KeyVault/vaults/keys/action
GCPCloud Audit Logs管理活动、数据访问、系统事件google.cloud.kms.v1.KeyManagementService.Decrypt
阿里云ActionTrail记录云资源操作KMS Decrypt, Encrypt

说白了,各家都有类似的「黑匣子」。不过字段命名、时间格式、敏感信息处理方式差别挺大。如果你刚接触 BYOK,我建议先从 CloudTrail 入手 —— 文档最全,社区踩坑案例也多,容易学。

2.2 AWS CloudTrail 深度解析

CloudTrail 是我用得最多的。基本每条记录都是一个 JSON,里面关键字段就那几个,但很多人栽在 eventSource 和 recipientAccountId 上。我见过有人把跨账户请求的 recipientAccountId 当成自家账户查半天……

必须牢记的 CloudTrail 核心字段:

  • eventTime — 时间戳,UTC,精确到毫秒。注意时区,我一般统一转成 ISO 8601。
  • eventSource — 如 kms.amazonaws.com,表示服务。BYOK 场景下常见 kms、secretsmanager。
  • eventName — 操作名,比如 Decrypt、GenerateDataKey。这是最直接的异常信号。
  • awsRegion — 区域。偶尔有跨区域调用,要警惕。
  • sourceIPAddress — 来源 IP。如果你看到来自非白名单 IP 的 Decrypt 请求,赶紧查。
  • userIdentity — 谁做的。包含 type、arn、accountId。我曾经发现一个临时凭证使用异常,就是靠这里抓到的。
  • requestParameters — 请求参数。比如密钥 ID、加密上下文。明文打印,小心敏感信息。
  • responseElements — 响应内容。可能包含密钥明文(比如 GetSecretValue 的响应,但 KMS 一般只返回密文)。

举个例子,一个典型的 CloudTrail 事件(精简后):

{
  "eventVersion": "1.08",
  "eventTime": "2023-11-15T14:30:22Z",
  "eventSource": "kms.amazonaws.com",
  "eventName": "Decrypt",
  "awsRegion": "us-east-1",
  "sourceIPAddress": "203.0.113.42",
  "userIdentity": {
    "type": "AssumedRole",
    "arn": "arn:aws:sts::123456789012:assumed-role/AdminRole/user1"
  },
  "requestParameters": {
    "keyId": "arn:aws:kms:us-east-1:123456789012:key/mrk-abc123def456",
    "encryptionAlgorithm": "SYMMETRIC_DEFAULT"
  },
  "resources": [
    { "ARN": "arn:aws:kms:us-east-1:123456789012:key/mrk-abc123def456" }
  ]
}

你注意看 keyId 和 userIdentity.arn。如果这个角色平时从不调 Decrypt,突然在凌晨两点跑了一大堆,那基本可以确定是异常。我建议你建立基准基线,否则日志量太大根本看不过来。

2.3 Azure Monitor 与 Activity Log

Azure 这边稍微绕一点。它有 Activity Log(订阅级操作)和 Diagnostic Settings(资源级操作)。BYOK 场景常用的是 Key Vault 的诊断日志,通过 Diagnostic Settings 发送到 Log Analytics 或 Storage。

关键字段有:

  • time — 事件时间 (UTC)
  • resourceId — 资源 ID,比如 /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.KeyVault/vaults/{vault}
  • operationName — 如 Microsoft.KeyVault/vaults/keys/action
  • resultType — Success 或 Fail
  • callerIpAddress — 调用者 IP
  • identity — 用户或服务主体
  • properties — 包含详细操作(如 encrypt、decrypt、wrap、unwrap),以及密钥 ID

个人经验:Azure 的 Diagnostic Settings 需要手动开启,而且按量收费。我遇到过客户开了 Activity Log 但没开 Key Vault 的诊断,结果查异常时发现日志不全。千万记得检查诊断配置。

2.4 其他云审计服务简要对比

特性CloudTrailAzure Monitor (Activity + Diagnostic)GCP Cloud Audit Logs
默认保留时间90 天(可延长到 S3/Glacier)90 天(支持导出)30 天(支持导出到 BigQuery)
敏感字段脱敏KMS Decrypt 响应不回传明文Key Vault 可配置是否记录明文数据访问日志可记录明文(需谨慎)
跨账户审计通过组织追踪或 S3 跨账户写入跨租户需发送到外部组织日志汇聚
实时流CloudWatch Events / EventBridgeEvent Hubs / Logic AppsPub/Sub

需要注意的是,GCP 的 Cloud Audit Logs 分为三种类型:Admin Activity(免费)、Data Access(收费)、System Event。如果你要监控 KMS 的 Decrypt 操作,必须开启 Data Access 审计,否则根本拿不到。我曾经有一次就是因为没开这个,导致客户说「日志里怎么没有 Decrypt 记录」,然后发现是审计级别没配对。

2.5 审计日志的通用结构模型

虽然各家字段不同,但本质上都遵循一个模式。我画了一张图,你可以把它当作通用框架来理解。

审计日志通用结构模型 单条审计日志 谁 + 在哪 (身份 & 环境) 干了什么 (操作 & 资源) 结果 & 详情 (状态 & 数据) 用户 / 角色 / 服务主体 源IP / 区域 / 账号 操作名 (Decrypt 等) 资源ID / 密钥ARN 成功 / 失败 / 错误码 响应内容 / 敏感字段 无论哪种云服务,审计日志都包含这三要素:谁、做了什么、结果如何 BYOK 场景重点关注操作名 + 密钥 ID + 来源 IP + 用户身份

你看,审计日志最终都可以归纳成这个模型。不同云只是字段命名有差异,但结构一致。这样一来,你写跨云检测规则时,只要把字段名做个映射就行。

2.6 关键字段的异常识别切入点

最后我总结几个高优先级的字段,你在做日志分析时可以重点盯:

  • eventName / operationName — 出现 Decrypt、GenerateDataKey、GetSecretValue 等敏感操作,尤其是在非业务时间。
  • sourceIPAddress / callerIpAddress — 来自异常 IP、外部 IP、公共 VPN 出口。
  • userIdentity / identity — 使用了不该有此权限的临时凭证、服务主体或跨账户角色。
  • requestParameters — 密钥 ID 请求频率激增、重复使用过期密钥。
  • responseElements — 返回了大量明文或密钥,必须马上报警(通常 KMS 不返回,但 Secrets Manager 会)。

避坑指南:我曾经在项目中遇到 CloudTrail 日志里没有记录 Decrypt 操作,查了半天才发现是因为客户只开启了管理事件(Management Events),没有开启数据事件(Data Events)。KMS 的 Decrypt 属于数据事件,默认不记录。千万检查你的 Trail 配置。