16.7.6 审计日志与安全审计
审计日志与安全审计用于记录对 Kubernetes API 的访问与变更行为,是定位安全事件、追溯操作链路与合规检查的关键手段。本节覆盖审计机制原理、策略配置、落地与分析、排错与演练。
原理草图(请求流转与审计落地)
审计级别与字段要点
- 级别:None / Metadata / Request / RequestResponse
- 关键字段:user.username、verb、objectRef、sourceIPs、responseStatus.code
- 高敏感字段:requestObject、responseObject(需谨慎)
审计策略示例(含完整文件与解释)
- 文件路径:/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 操作的用户名排名。