90·安全高级

审计日志

kubernetessecurityauditlogging

审计日志

学习目标

  1. 理解审计日志的重要性
  2. 掌握审计策略的配置方法
  3. 了解审计日志的最佳实践

核心概念

一句话解释

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...

继续学习

完成本课后,建议继续学习下一课「监控简介」 以巩固所学知识。