k8s收集审计日志
工作中经常遇到不知道谁修改资源导致服务出现故障,配合 k8s 自带的 RBAC 实现用户级别的审计日志
RBAC 配置参考: Kubernetes自定义权限
审计日志记录功能会增加 API server 的内存消耗,因为需要为每个请求存储审计所需的某些上下文。
原理
Kube-apiserver 执行审计。每个执行阶段的每个请求都会生成一个事件,然后根据特定策略对事件进行预处理并写入后端。
每个请求都可以用相关的 “stage” 记录。已知的 stage 有:
RequestReceived - 事件的 stage 将在审计处理器接收到请求后,并且在委托给其余处理器之前生成。
ResponseStarted - 在响应消息的头部发送后,但是响应消息体发送前。这个 stage 仅为长时间运行的请求生成(例如 watch)。
ResponseComplete - 当响应消息体完成并且没有更多数据需要传输的时候。
Panic - 当 panic 发生时生成。
策略
审计政策定义了关于应记录哪些事件以及应包含哪些数据的规则。处理事件时,将按顺序与规则列表进行比较。第一个匹配规则设置事件的审计级别。已知的审计级别有:
None - 符合这条规则的日志将不会记录。
Metadata - 记录请求的 metadata(请求的用户、timestamp、resource、verb 等等),但是不记录请求或者响应的消息体。
Request - 记录事件的 metadata 和请求的消息体,但是不记录响应的消息体。这不适用于非资源类型的请求。
RequestResponse - 记录事件的 metadata,请求和响应的消息体。这不适用于非资源类型的请求。
后端
k8s 目前提供两种日志后端
Log 后端和 webhook 后端,Log 后端可以将日志输出到文件
webhook 后端将日志发送到远端日志服务器
以下实践组件版本 docker ce20,k8s 1.24.4
1 kube-apiserver 配置 Log 审计后端
–audit-log-path指定用来写入审计事件的日志文件路径。不指定此标志会禁用日志后端。- 意味着标准化
–audit-log-maxage定义了保留旧审计日志文件的最大天数
–audit-log-maxbackup定义了要保留的审计日志文件的最大数量
–audit-log-maxsize定义审计日志文件的最大大小(兆字节)
1 | --audit-log-maxage=30 |
2 audit-policy.yaml
2.1 比较详细配置参考
1 | apiVersion: audit.k8s.io/v1 # 这是必填项。 |
2.2 最低限度配置参考
1 | apiVersion: audit.k8s.io/v1 |
查看
auditID: 审计 id
verb: 操作类型
requestURI: 请求 api 路径
user: 账户角色详情
1 | {"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Metadata","auditID":"9a686e23-ab0c-4d7e-a386-29220ede0c9a","stage":"RequestReceived","requestURI":"/api/v1/namespaces/kube-system/pods/coredns-59499769fb-8gr8t","verb":"delete","user":{"username":"system:node","groups":["system:nodes","system:authenticated"]},"sourceIPs":["10.122.148.142"],"userAgent":"kubelet/v1.24.4 (linux/amd64) kubernetes/95ee5ab","objectRef":{"resource":"pods","namespace":"kube-system","name":"coredns-59499769fb-8gr8t","apiVersion":"v1"},"requestReceivedTimestamp":"2022-12-07T02:10:31.324896Z","stageTimestamp":"2022-12-07T02:10:31.324896Z"} |