企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] Kubernetes 审计(Auditing) 功能提供了与安全相关的、按时间顺序排列的记录集, 记录每个用户、使用 Kubernetes API 的应用以及控制面自身引发的活动。 它能帮助集群管理员处理以下问题: - 发生了什么? - 什么时候发生的? - 谁触发的? - 活动发生在哪个(些)对象上? - 在哪观察到的? - 它从哪触发的? - 活动的后续处理行为是什么? 审计记录最初产生于 kube-apiserver 内部。每个请求在不同执行阶段都会生成审计事件;这些审计事件会根据特定策略 被预处理并写入后端。策略确定要记录的内容和用来存储记录的后端。 当前的后端支持 `日志文件` 和 `webhook`。 每个请求都可被记录其相关的 阶段(stage)。已定义的阶段有: - `RequestReceived` - 此阶段对应审计处理器接收到请求后,并且在委托给 其余处理器之前生成的事件。 - `ResponseStarted` - 在响应消息的头部发送后,响应消息体发送前生成的事件。 只有长时间运行的请求(例如 watch)才会生成这个阶段。 - `ResponseComplete` - 当响应消息体完成并且没有更多数据需要传输的时候。 - `Panic` - 当 panic 发生时生成。 审计日志记录功能会增加 API server 的内存消耗,因为需要为每个请求存储审计所需的某些上下文。 此外,内存消耗取决于审计日志记录的配置。 ## 审计策略 审计政策定义了关于应记录哪些事件以及应包含哪些数据的规则。 审计策略对象结构定义在 audit.k8s.io API 组 处理事件时,将按顺序与规则列表进行比较。第一个匹配规则设置事件的 审计级别(Audit Level)。已定义的审计级别有: - `None` - 符合这条规则的日志将不会记录。 - `Metadata` - 记录请求的元数据(请求的用户、时间戳、资源、动词等等), 但是不记录请求或者响应的消息体。 - `Request` - 记录事件的元数据和请求的消息体,但是不记录响应的消息体。 这不适用于非资源类型的请求。 - `RequestResponse` - 记录事件的元数据,请求和响应的消息体。这不适用于非资源类型的请求。 你可以使用 --audit-policy-file 标志将包含策略的文件传递给 kube-apiserver。 如果不设置该标志,则不记录事件。 注意 rules 字段 必须 在审计策略文件中提供。没有(0)规则的策略将被视为非法配置。 ## 审计后端 审计后端实现将审计事件导出到外部存储。Kube-apiserver 默认提供两个后端: - Log 后端,将事件写入到文件系统 - Webhook 后端,将事件发送到外部 HTTP API > 这里分析log后端 Log 后端将审计事件写入 JSONlines 格式的文件。 你可以使用以下 kube-apiserver 标志配置 Log 审计后端: - `--audit-log-path` 指定用来写入审计事件的日志文件路径。不指定此标志会禁用日志后端。- 意味着标准化 - `--audit-log-maxage` 定义保留旧审计日志文件的最大天数 - `--audit-log-maxbackup` 定义要保留的审计日志文件的最大数量 - `--audit-log-maxsize` 定义审计日志文件的最大大小(兆字节) ## 审计策略示例 1. 创建审计策略 ```yaml apiVersion: audit.k8s.io/v1beta1 kind: Policy rules: # 所有资源都记录请求的元数据(请求的用户、时间戳、资源、动词等等), 但是不记录请求或者响应的消息体。 - level: Metadata # 只有pods资源记录事件的元数据和请求的消息体,但是不记录响应的消息体。 - level: Request resources: - group: "" resources: ["pods"] ``` 2. 创建log后端审计 在 `kube-apiserver` 服务配置文件中添加以下几行: ```shell # 审计策略文件位置 --audit-policy-file=/data/k8s/conf/kube-apiserver-audit.yml \ # 根据文件名中编码的时间戳保留旧审计日志文件的最大天数。 --audit-log-maxage=3 \ # 轮换之前,审计日志文件的最大大小(以兆字节为单位) --audit-log-maxsize=100 \ # 审计日志路径 --audit-log-path=/data/k8s/logs/kubernetes.audit \ ``` 3. 重启kube-apiserver服务 ```shell systemctl restart kube-apiserver.service ``` ## 参考文章 https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-apiserver/ https://kubernetes.io/zh/docs/reference/config-api/apiserver-audit.v1/#audit-k8s-io-v1-Policy https://kubernetes.io/zh/docs/reference/config-api/apiserver-audit.v1/#audit-k8s-io-v1-PolicyRule