k8s收集审计日志

1089 字
5 分钟
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定义审计日志文件的最大大小(兆字节)

--audit-log-maxage=30
--audit-log-maxbackup=10
--audit-log-maxsize=100
--audit-log-path=/var/log/kube-audit/audit-log.json
--audit-log-format=json
--audit-policy-file=/etc/kubernetes/audit-policy.yaml

2 audit-policy.yaml#

2.1 比较详细配置参考#

apiVersion: audit.k8s.io/v1 # 这是必填项。
kind: Policy
# 不要在 RequestReceived 阶段为任何请求生成审计事件。
omitStages:
- "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"]
# 不要在日志中记录对名为 "controller-leader" 的 configmap 的请求。
- level: None
resources:
- group: ""
resources: ["configmaps"]
resourceNames: ["controller-leader"]
# 不要在日志中记录由 "system:kube-proxy" 发出的对端点或服务的监测请求。
- level: None
users: ["system:kube-proxy"]
verbs: ["watch"]
resources:
- group: "" # core API 组
resources: ["endpoints", "services"]
# 不要在日志中记录对某些非资源 URL 路径的已认证请求。
- level: None
userGroups: ["system:authenticated"]
nonResourceURLs:
- "/api*" # 通配符匹配。
- "/version"
# 在日志中记录 kube-system 中 configmap 变更的请求消息体。
- level: Request
resources:
- group: "" # core API 组
resources: ["configmaps"]
# 这个规则仅适用于 "kube-system" 名字空间中的资源。
# 空字符串 "" 可用于选择非名字空间作用域的资源。
namespaces: ["kube-system"]
# 在日志中用 Metadata 级别记录所有其他名字空间中的 configmap 和 secret 变更。
- level: Metadata
resources:
- group: "" # core API 组
resources: ["secrets", "configmaps"]
# 在日志中以 Request 级别记录所有其他 core 和 extensions 组中的资源操作。
- level: Request
resources:
- group: "" # core API 组
- group: "extensions" # 不应包括在内的组版本。
# 一个抓取所有的规则,将在日志中以 Metadata 级别记录所有其他请求。
- level: Metadata
# 符合此规则的 watch 等长时间运行的请求将不会
# 在 RequestReceived 阶段生成审计事件。
omitStages:
- "RequestReceived"

2.2 最低限度配置参考#

apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata

查看#

auditID: 审计 id

verb: 操作类型

requestURI: 请求 api 路径

user: 账户角色详情

{"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.1.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"}

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

k8s收集审计日志
https://ccops.cc/posts/e6bb7cea/
作者
蹦蹦站长
发布于
2022-12-07
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
蹦蹦站长
一个养兔子的运维
公告
感谢你的来访!希望在这里能找到对你有用的内容!
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
81
分类
6
标签
45
总字数
88,456
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.12.1
文章许可
CC BY-NC-SA 4.0

文章目录