一、Auditing 基本概念
在 Kubernetes 集群中,API Server 的审计日志可以帮助集群管理人员记录和追溯不同用户的日常操作,是集群安全运维中重要的环节。
1.1 审计阶段
审计阶段:记录事件的时机。每个请求都可被记录其相关的阶段(stage),已定义的阶段有:
- RequestReceived:一点接收到请求后立刻记录审计事件;
- ResponseStarted: 在响应消息的头部发送后,响应消息体发送前生成的事件,仅对长期运行的请求有效,例如 watch。
- ResponseComplete: 当响应消息体完成;
- Panic:当严重错误发生时。
审计日志记录功能会增加 API Server 的内存消耗,因为需要为每个请求存储审计所需要的某些上下文,此外,内存消耗取决于审计日志记录的配置。
1.2 审计级别
审计级别:代表记录审计日志的完整程度。
- None:符合这条规则的日志将不记录;
- Metadata:记录请求的元数据信息(如:请求用户、时间戳、动作、资源类型等),但不记录请求或响应的消息体;
- Request:记录请求的元数据信息、请求体,但不记录响应体;
- RequestResponse:记录事件的元数据信息、请求体、响应体。
1.3 审计后端
None 以上的级别会生成相应的审计日志并将审计日志输出到后端,当前 api-server 默认提供了两种后端:
- Log backend:以 JSON 日志格式保存为本地日志文件,我们需要对 API Server 的设置下列参数:
- –audit-log-maxbackup 审计日志最大分片存储日志文件数
- –audit-log-maxsize 单个审计日志轮转之前的最大大小(MB),默认为 100MB
- –audit-log-path 审计日志保存路径,不指定此标志会禁用日志后端,意味着标准化
- –audit-log-maxage 保留旧审计日志文件的最大天数 --audit-policy-file 审计日志策略文件的路径。
审计日志文件以 audit-log-maxsize 设置的大小为单位,写满后,kube-apiserver 将以时间戳重新命名原文件,然后继续写入 audit-log-path 指定的日志文件,audit-log-maxbackup 和 audit-log-maxage 参数则用于 kube-apiserver 自动删除旧的审计日志文件。
- Webhook backend:将审计事件发送到远程 Web API,我们需要对 API Server 的设置下列参数:
- –audit-webhook-config-file 设置 Webhook 配置文件的路径。Webhook 配置文件实际上是一个 kubeconfig 文件;
- –audit-webhook-mode 指定哪种模式回调通知;
- –audit-webhook-initial-backoff 指定在第一次失败后重发请求等待的时间。后续重试等待时间则呈指数级递增。
1.4 审计策略
下面是一个相关的审计策略的示例:
apiVersion: audit.k8s.io/v1
kind: Policy
omitStages:
# 不要在 RequestReceived 阶段为任何请求生成审计事件。
- "RequestReceived"
rules:
# 在日志中用 RequestResponse 级别记录 Pod 变化。
- level: RequestResponse
resources:
- group: ""
# 资源 "pods" 不匹配对任何 Pod 子资源的请求,
# 这与 RBAC 策略一致。
resources: ["pods"]
# 在日志中按 Metadata 级别记录 "pods/log"、"pods/status" 请求
- level: Metadata
resources:
- group: ""
resources: ["pods/log", "pods/status"]
二、Log backend 的配置过程
#### 日志策略文件
# cat /etc/kubernetes/audit-policy.yaml
apiversion: audit.k8s.io/v1
kind: Policy
omitStages: # 对于 RequestReceived 阶段的所有请求,不生成审计事件
- "RequestReceived"
rules: # 指定审计策略的规则
- level: None # 对于 system:kube-proxy 用户对 endpoints 和 services 资源的 watch 操作,不会生成审计事件
users: ["system:kube-proxy"]
verbs: ["watch"]
resources:
- group: ""
resources: ["endpoints", "services"]
- level: None
users: ["system: system:kube-controller-manager", "system: kube-scheduler"]
verbs: ["get", "update"]
namespace: ["kube-system"]
resources:
- group: ""
resources: ["endpoints"]
- level: None
userGroups: ["system:authenticated"]
nonResourceURLs:
- /healthz*
- /version
- level: None
resources:
- group: ""
resources: ["events"]
- level: Metadata
- group: ""
resources: ["secrets", "configmaps"]
- group: authentication.k8s.io
resources: ["tokenreviews"]
- level: Request
verbs: ["get", "list", "watch"]
resources:
- group: ""
- group: "admissionregistration.k8s.io"
- group: "apps"
- group: "authentication.k8s.io"
- group: "authorization.k8s.io"
- group: "autoscaling"
- group: "batch"
- group: "certificates.k8s.io"
- group: "networking.k8s.io"
- group: "policy"
- group: "rbac.authorization.k8s.io"
- group: "storage.k8s.io"
- level: RequestResponse
resources:
- group: ""
- group: "admissionregistration.k8s.io"
- group: "apps"
- group: "authentication.k8s.io"
- group: "authorization.k8s.io"
- group: "autoscaling"
- group: "batch"
- group: "certificates.k8s.io"
- group: "networking.k8s.io"
- group: "policy"
- group: "rbac.authorization.k8s.io"
- group: "storage.k8s.io"
- level: Metadata # Default level for all other requests.
omitStages: # 符合这条规则的 watch 等长时间运行的请求将不会在 RequestReceived 阶段生成审计事件
- "RequestReceived"
#### 备份 kube-apiserver.yaml 文件
# cp /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/
#### 修改 kube-apiserver.yaml 文件
# vim /etc/kubernetes/manifests/kube-apiserver.yaml
...省略...
spec:
containers:
- command:
- kube-apiserver
- --audit-policy-file=/etc/kubernetes/audit-policy.yaml
- --audit-log-path=/var/log/kubernetes/audit/audit.log
- --audit-log-maxage=30
- --audit-log-maxbackup=7
...省略...
volumeMounts:
- mountPath: /etc/kubernetes/audit-policy.yaml
name: audit
readOnly: true
- mountPath: /var/log/kubernetes/audit/
name: audit-log
readOnly: false
...省略...
volumes:
- name: audit
hostPath:
path: /etc/kubernetes/audit-policy.yaml
type: File
- name: audit-log
hostPath:
path: /var/log/kubernetes/audit/
type: DirectoryOrCreate
...省略...
检查 pod kube-apiserver 是否运行正常(等待1~2分钟)
# kubectl get pod -n kube-system
检查日志是否正常收集
# tail -f /var/logs/kubernetes/audit.log