审计日志
学习目标
- 理解审计日志的重要性
- 掌握审计策略的配置方法
- 了解审计日志的最佳实践
核心概念
一句话解释
Kubernetes 审计日志记录 API Server 的所有请求,用于安全监控、合规审计和故障排查。
审计日志的作用
┌─────────────────────────────────────────────────────────────┐
│ 审计日志的作用 │
├─────────────────────────────────────────────────────────────┤
│ 安全监控 │
│ ├── 检测异常访问 │
│ ├── 发现未授权操作 │
│ └── 识别攻击行为 │
├─────────────────────────────────────────────────────────────┤
│ 合规审计 │
│ ├── 满足法规要求 │
│ ├── 提供审计证据 │
│ └── 证明安全控制有效 │
├─────────────────────────────────────────────────────────────┤
│ 故障排查 │
│ ├── 追踪操作历史 │
│ ├── 定位问题原因 │
│ └── 复现问题场景 │
└─────────────────────────────────────────────────────────────┘
审计事件结构
{
"kind": "Event",
"apiVersion": "audit.k8s.io/v1",
"level": "Metadata",
"auditID": "abc123",
"stage": "ResponseComplete",
"requestURI": "/api/v1/namespaces/default/pods",
"verb": "create",
"user": {
"username": "admin",
"groups": ["system:masters"]
},
"sourceIPs": ["10.0.0.1"],
"userAgent": "kubectl/v1.28.0",
"objectRef": {
"resource": "pods",
"namespace": "default",
"name": "my-pod"
},
"responseStatus": {
"code": 201
},
"requestReceivedTimestamp": "2024-01-01T00:00:00Z",
"stageTimestamp": "2024-01-01T00:00:01Z"
}
审计级别
| 级别 | 说明 | 记录内容 |
|---|---|---|
| None | 不记录 | 无 |
| Metadata | 元数据 | 请求元数据,不记录请求体和响应体 |
| Request | 请求 | 请求元数据和请求体 |
| RequestResponse | 请求响应 | 请求元数据、请求体和响应体 |
审计阶段
| 阶段 | 说明 |
|---|---|
| RequestReceived | 请求接收时 |
| ResponseStarted | 响应开始时 (长时间请求) |
| ResponseComplete | 响应完成时 |
| Panic | 发生 panic 时 |
审计策略配置
# /etc/kubernetes/audit-policy.yaml
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
# 不记录某些请求
- level: None
users: ["system:kube-proxy"]
verbs: ["watch"]
resources:
- group: ""
resources: ["endpoints", "services"]
# 不记录某些请求
- level: None
users: ["system:anonymous"]
verbs: ["get"]
resources:
- group: ""
resources: ["healthz"]
# 记录 Secret 的元数据
- level: Metadata
resources:
- group: ""
resources: ["secrets", "configmaps"]
# 记录其他所有请求
- level: RequestResponse
resources:
- group: ""
resources: ["pods", "services"]
- group: "apps"
resources: ["deployments", "statefulsets"]
# 默认级别
- level: Metadata
启用审计日志
# /etc/kubernetes/manifests/kube-apiserver.yaml
apiVersion: v1
kind: Pod
metadata:
name: kube-apiserver
namespace: kube-system
spec:
containers:
- name: kube-apiserver
command:
- kube-apiserver
- --audit-policy-file=/etc/kubernetes/audit-policy.yaml
- --audit-log-path=/var/log/kubernetes/audit.log
- --audit-log-maxage=30
- --audit-log-maxbackup=10
- --audit-log-maxsize=100
volumeMounts:
- name: audit-policy
mountPath: /etc/kubernetes
readOnly: true
- name: audit-log
mountPath: /var/log/kubernetes
volumes:
- name: audit-policy
hostPath:
path: /etc/kubernetes
- name: audit-log
hostPath:
path: /var/log/kubernetes
审计日志后端
# Webhook 后端配置
apiVersion: v1
kind: Config
clusters:
- name: audit-webhook
cluster:
server: https://audit-server:8443
contexts:
- context:
cluster: audit-webhook
user: audit-webhook
users:
- name: audit-webhook
user:
client-certificate: /path/to/cert
client-key: /path/to/key
日志收集和分析
# Fluentd DaemonSet 收集审计日志
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
namespace: kube-system
spec:
selector:
matchLabels:
app: fluentd
template:
metadata:
labels:
app: fluentd
spec:
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1
volumeMounts:
- name: audit-log
mountPath: /var/log/kubernetes
readOnly: true
volumes:
- name: audit-log
hostPath:
path: /var/log/kubernetes
审计日志查询
# 查看审计日志
tail -f /var/log/kubernetes/audit.log
# 使用 jq 查询
cat /var/log/kubernetes/audit.log | jq 'select(.verb=="create")'
# 查询特定用户的操作
cat /var/log/kubernetes/audit.log | jq 'select(.user.username=="admin")'
# 查询特定资源的操作
cat /var/log/kubernetes/audit.log | jq 'select(.objectRef.resource=="secrets")'
# 查询失败的操作
cat /var/log/kubernetes/audit.log | jq 'select(.responseStatus.code>=400)'
安全监控规则
# Prometheus 告警规则
groups:
- name: kubernetes-audit
rules:
- alert: UnauthorizedAccess
expr: |
rate(kubernetes_audit_events_total{verb="create",response_code=~"4.."}[5m]) > 0
for: 1m
labels:
severity: critical
annotations:
summary: "Unauthorized access detected"
description: "Unauthorized create request detected"
- alert: SecretAccess
expr: |
rate(kubernetes_audit_events_total{resource="secrets"}[5m]) > 10
for: 5m
labels:
severity: warning
annotations:
summary: "High Secret access rate"
description: "Unusual Secret access pattern detected"
审计日志最佳实践
1. 启用审计日志
- 配置审计策略
- 设置合适的日志级别
- 配置日志轮转
2. 集中收集日志
- 使用日志收集系统 (EFK, Loki)
- 长期存储日志
- 设置告警规则
3. 定期审查日志
- 检查异常访问
- 分析操作模式
- 识别安全威胁
4. 保护审计日志
- 限制访问权限
- 防止日志篡改
- 备份日志数据
5. 满足合规要求
- 保留足够长时间
- 提供审计证据
- 定期审计报告
实践练习
练习 1:配置审计策略
# 创建审计策略文件
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: None
users: ["system:kube-proxy"]
verbs: ["watch"]
resources:
- group: ""
resources: ["endpoints", "services"]
- level: Metadata
resources:
- group: ""
resources: ["secrets", "configmaps"]
- level: RequestResponse
resources:
- group: ""
resources: ["pods"]
# 验证审计策略
kube-apiserver --audit-policy-file=audit-policy.yaml --dry-run
练习 2:分析审计日志
# 查询创建 Pod 的操作
cat /var/log/kubernetes/audit.log | jq 'select(.verb=="create" and .objectRef.resource=="pods")'
# 查询失败的操作
cat /var/log/kubernetes/audit.log | jq 'select(.responseStatus.code>=400)'
# 查询特定命名空间的操作
cat /var/log/kubernetes/audit.log | jq 'select(.objectRef.namespace=="default")'
常见误解
1. 审计日志默认启用
事实:审计日志需要手动配置启用
误解:Kubernetes 默认记录所有操作
解决:配置审计策略和日志路径
2. 审计日志影响性能
事实:合理配置对性能影响很小
误解:审计日志会显著降低性能
解决:使用合适的审计级别,避免记录请求体
小结
| 要点 | 说明 |
|---|---|
| 审计日志 | 记录 API Server 请求 |
| 审计级别 | None、Metadata、Request、RequestResponse |
| 审计策略 | 定义记录哪些请求 |
| 日志后端 | 文件、Webhook |
| 最佳实践 | 启用审计、集中收集、定期审查、保护日志 |
练习编辑器
bash
Loading...