16.7.6 审计日志与安全审计

审计日志与安全审计用于记录对 Kubernetes API 的访问与变更行为,是定位安全事件、追溯操作链路与合规检查的关键手段。本节覆盖审计机制原理、策略配置、落地与分析、排错与演练。

原理草图(请求流转与审计落地)

文章图片

审计级别与字段要点
- 级别:None / Metadata / Request / RequestResponse
- 关键字段:user.usernameverbobjectRefsourceIPsresponseStatus.code
- 高敏感字段:requestObjectresponseObject(需谨慎)

审计策略示例(含完整文件与解释)
- 文件路径:/etc/kubernetes/audit-policy.yaml

apiVersion: audit.k8s.io/v1
kind: Policy
rules:
  # 丢弃健康检查与高频无风险请求
  - level: None
    verbs: ["get"]
    nonResourceURLs: ["/healthz", "/readyz", "/livez", "/metrics"]

  # 核心资源记录请求体(但避免响应体)
  - level: Request
    resources:
      - group: ""
        resources: ["pods", "services", "endpoints", "configmaps"]
      - group: "rbac.authorization.k8s.io"
        resources: ["roles", "rolebindings", "clusterroles", "clusterrolebindings"]

  # Secrets 仅记录元数据,避免敏感泄露
  - level: Metadata
    resources:
      - group: ""
        resources: ["secrets"]

  # 对高权限行为或危险操作记录请求与响应
  - level: RequestResponse
    verbs: ["create", "update", "patch", "delete"]
    resources:
      - group: ""
        resources: ["nodes"]
      - group: "authentication.k8s.io"
        resources: ["tokenreviews"]

  # 兜底规则
  - level: Metadata
  • 预期效果:高价值资源有可追溯操作链路;敏感数据不被落日志。

kube-apiserver 启用审计(kubeadm 场景)
- 编辑静态 Pod 清单:/etc/kubernetes/manifests/kube-apiserver.yaml

spec:
  containers:
  - name: kube-apiserver
    command:
      - kube-apiserver
      - --audit-policy-file=/etc/kubernetes/audit-policy.yaml
      - --audit-log-path=/var/log/kubernetes/audit/audit.log
      - --audit-log-maxsize=100
      - --audit-log-maxbackup=10
      - --audit-log-maxage=30
    volumeMounts:
      - mountPath: /etc/kubernetes/audit-policy.yaml
        name: audit-policy
        readOnly: true
      - mountPath: /var/log/kubernetes/audit
        name: audit-log
  volumes:
    - name: audit-policy
      hostPath:
        path: /etc/kubernetes/audit-policy.yaml
        type: File
    - name: audit-log
      hostPath:
        path: /var/log/kubernetes/audit
        type: DirectoryOrCreate
  • 应用后 kubelet 将自动重建 apiserver;日志路径将生成 audit.log

日志查看与检索示例(含命令解释)

# 查看审计日志最新 5 条
tail -n 5 /var/log/kubernetes/audit/audit.log

# 过滤指定用户名的操作
grep '"username":"admin"' /var/log/kubernetes/audit/audit.log | head -n 3

# 过滤对 secrets 的操作
grep '"resource":"secrets"' /var/log/kubernetes/audit/audit.log | head -n 3

# 统计 24 小时内 delete 操作数量(需 jq)
jq -r 'select(.verb=="delete") | .objectRef.resource' /var/log/kubernetes/audit/audit.log | wc -l
  • 预期效果:快速定位高风险操作与主体。

集中日志落地示例(以 Loki/Promtail 思路)
- Promtail 采集配置片段:/etc/promtail/config.yml

scrape_configs:
  - job_name: k8s-audit
    static_configs:
      - targets: [localhost]
        labels:
          job: k8s-audit
          __path__: /var/log/kubernetes/audit/audit.log
  • 预期效果:审计日志可在 Grafana/Loki 查询与告警。

常见故障与排错
1. 无审计日志生成
- 检查参数是否生效:
bash ps -ef | grep kube-apiserver | grep audit
- 检查策略文件路径与权限:
bash ls -l /etc/kubernetes/audit-policy.yaml
2. 日志写入失败
- 目录权限或磁盘满:
bash df -h /var/log/kubernetes/audit ls -ld /var/log/kubernetes/audit
3. 性能压力过大
- 降级高频资源策略到 Metadata
- 设置日志滚动参数 --audit-log-maxsize

安全审计最小闭环(可执行步骤)
1. 配置策略与保留周期(30 天)
2. 敏感资源降级记录(Secrets)
3. 接入日志平台,建立索引字段(user/verb/resource/namespace/code)
4. 设置告警规则(频繁删除、跨命名空间操作、RBAC 变更)
5. 周期性生成审计报告并复盘

练习题(动手演练)
1. 编写审计策略:对 deployments 记录 Request,对 pods/log 记录 None,验证日志变化。
2. 模拟高风险操作:创建一个 ClusterRoleBinding,在审计日志中定位并解释字段含义。
3. 将审计日志导入 Loki 或 ELK,并编写一个查询:过去 1 小时内 delete 操作的用户名排名。