必须使用 level: RequestResponse 且 group: ""、resources: ["secrets"]、verbs: ["get"],并配置 omitStages: [RequestReceived, ResponseStarted],仅 ResponseComplete 阶段日志含解码后 data 字段。

要审计 Kubernetes 中对敏感 Secret 的读取操作,关键在于让审计日志真正捕获到响应体中解码后的 data 字段(即原始明文内容),而不仅仅是资源名或用户信息。这不能靠 Metadata 或 Request 级别实现,必须用 RequestResponse 级别,并配以精确的规则和阶段过滤。
必须使用 level: RequestResponse
Secret 的 get 操作,只有在响应完成时(ResponseComplete 阶段)才会在日志中包含解码后的 data 字段。其他级别完全缺失该信息:
- Metadata:只记录用户、时间、动词、资源名,看不到任何 secret 内容
- Request:对 get 请求而言请求体为空,且不记录响应,无法得知返回了什么
- RequestResponse:唯一能同时拿到请求上下文和响应体(含明文 data)的级别
规则需精准匹配核心 API 组和资源复数形式
Secret 属于核心 API 组,group 为空字符串 "",不是 v1、core 或 apiextensions.k8s.io。写错就等于规则失效:
- ✅ 正确:
group: ""+resources: ["secrets"]+verbs: ["get"] - ❌ 常见错误:
group: "v1"、resources: ["secret"](少 s)、verbs: ["list"](漏掉 get)
完整示例片段:
- level: RequestResponse
resources:
- group: ""
resources: ["secrets"]
verbs: ["get"]
omitStages:
- RequestReceived
- ResponseStarted
务必添加 omitStages 减少日志冗余
RequestResponse 级别默认为单个请求生成多条日志(RequestReceived、ResponseStarted、ResponseComplete)。但只有 ResponseComplete 那条含完整 responseObject 和 data 字段。不加过滤会导致:
- 日志量膨胀约 2–3 倍
- 关键内容被淹没在无关条目中
- 排查时需逐条比对 stage 字段
推荐始终配置 omitStages: [RequestReceived, ResponseStarted],保留干净、可定位的审计线索。
快速验证是否生效
执行一次读取后,直接查日志确认是否出现带 data 的响应体:
grep -A8 -B2 '"resourceName":"my-secret".*"verb":"get"' /var/log/kubernetes/audit.log
若输出中可见 "data": {"password": "cGFzc3dvcmQxMjM="} 或类似 Base64 解码前的原始键值,则说明配置成功。


















