本文永久链接: https://www.xtplayer.cn/rke2/rke2-enable-audit-logs-of-the-downstream-cluster/

自定义 rke2 集群

以下内容以自定义 rke2 集群为例,编辑 rke2 集群的 yaml,在 machineGlobalConfig 层级下添加 audit-policy-file 配置。以下为设置好的 rke2 集群 yaml 的部分内容

# 默认审计日志输出配置
spec:
......
rkeConfig:
......
machineGlobalConfig:
audit-policy-file: |
# 记录所有请求的元数据(如时间戳、用户、资源、动词等),但不记录请求体或响应体。
apiVersion: audit.k8s.io/v1 # 对于 k8s >= v1.16, 更老的版本可能是 v1beta1
kind: Policy
# 忽略 "RequestReceived" 阶段的请求,以减少日志量。
omitStages:
- "RequestReceived"
rules:
# 规则从上到下匹配,第一个匹配的规则生效。
# 记录所有级别的所有请求(Metadata, Request, RequestResponse)
- level: Metadata
# 可以在这里添加更具体的规则来排除某些请求,但为了“记录所有”,我们保留为空。
# 例如,排除健康检查:
# omitStages:
# - "RequestReceived"
# users: [] # 空表示匹配所有用户
# verbs: [] # 空表示匹配所有动词
# resources: [] # 空表示匹配所有资源
......
kube-apiserver-arg:
- audit-log-maxage=30
- audit-log-maxbackup=30
- audit-log-maxsize=100
- audit-log-format=json
kube-scheduler-arg: []
......

以上配置设置好之后,audit-policy-file 中的内容会自动写入到 server 节点的 /var/lib/rancher/rke2/etc/config-files/audit-policy-file 文件中,并且这个文件会自动挂载到 apiserver pod 中。

执行 source <(crictl completion bash); 添加自动补全,方便输入 crictl 命令。(可选)

执行以下命令可以查询到 audit-log-path 的默认路径为 /var/lib/rancher/rke2/server/logs/audit.log

export CRI_CONFIG_FILE=/var/lib/rancher/rke2/agent/etc/crictl.yaml
crictl inspect -o go-template --template='{{range .info.config.args}}{{.}}{{"\n"}}{{end}}' $(crictl ps --name kube-apiserver -q) | grep audit
---
"args": [
"--admission-control-config-file=/etc/rancher/rke2/rke2-pss.yaml",
"--audit-policy-file=/var/lib/rancher/rke2/etc/config-files/audit-policy-file",
"--audit-log-maxage=30",
"--audit-log-maxbackup=10",
"--audit-log-maxsize=100",
"--audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log",
"--allow-privileged=true",
"--anonymous-auth=false",
"--api-audiences=https://kubernetes.default.svc.cluster.local,rke2",
"--audit-log-maxage=30",
"--audit-log-maxbackup=30",
"--audit-log-maxsize=100",
"--authorization-mode=Node,RBAC",
"--bind-address=0.0.0.0",
"--cert-dir=/var/lib/rancher/rke2/server/tls/temporary-certs",
"--client-ca-file=/var/lib/rancher/rke2/server/tls/client-ca.crt",
"--egress-selector-config-file=/var/lib/rancher/rke2/server/etc/egress-selector-config.yaml",
"--enable-admission-plugins=NodeRestriction",
"--enable-aggregator-routing=true",

如果要限制日志大小及数量,可以在配置添加 kube-apiserver-arg,然后指定相关参数,https://kubernetes.io/docs/tasks/debug/debug-cluster/audit/#log-backend

如果要自定义审计日志文件路径,需要在 kube-apiserver-arg 中添加 audit-log-path 参数指定日志输出路径。然后添加 kube-apiserver-extra-mount 参数将主机目录挂载到 apiserver pod 中以持久数据。

# 自定义审计日志输出路径配置
spec:
......
rkeConfig:
......
machineGlobalConfig:
audit-policy-file: |
# 记录所有请求的元数据(如时间戳、用户、资源、动词等),但不记录请求体或响应体。
apiVersion: audit.k8s.io/v1 # 对于 k8s >= v1.16, 更老的版本可能是 v1beta1
kind: Policy
# 忽略 "RequestReceived" 阶段的请求,以减少日志量。
omitStages:
- "RequestReceived"
rules:
# 规则从上到下匹配,第一个匹配的规则生效。
# 记录所有级别的所有请求(Metadata, Request, RequestResponse)
- level: Metadata
# 可以在这里添加更具体的规则来排除某些请求,但为了“记录所有”,我们保留为空。
# 例如,排除健康检查:
# omitStages:
# - "RequestReceived"
# users: [] # 空表示匹配所有用户
# verbs: [] # 空表示匹配所有动词
# resources: [] # 空表示匹配所有资源
......
kube-apiserver-arg:
- audit-log-path=/var/log/kubernetes/audit/audit.json
- audit-log-maxage=30
- audit-log-maxbackup=30
- audit-log-maxsize=100
- audit-log-format=json
kube-scheduler-arg: []
kube-apiserver-extra-mount:
- /var/log/kubernetes/audit/:/var/log/kubernetes/audit/
......

非自定义 rke2 集群

如果下游 rke2 集群不是在 rancher ui 部署的自定义 rke2 集群,需要手动创建策略文件。比如可以把策略文件放在主机的 /etc/kubernetes/audit-policy.yaml 路径下。

# cat /etc/kubernetes/audit-policy.yaml

apiVersion: audit.k8s.io/v1 # 对于 k8s >= v1.16, 更老的版本可能是 v1beta1
kind: Policy
# 忽略 "RequestReceived" 阶段的请求,以减少日志量。
omitStages:
- "RequestReceived"
rules:
# 规则从上到下匹配,第一个匹配的规则生效。
# 记录所有级别的所有请求(Metadata, Request, RequestResponse)
- level: Metadata
# 可以在这里添加更具体的规则来排除某些请求,但为了“记录所有”,我们保留为空。
# 例如,排除健康检查:
# omitStages:
# - "RequestReceived"
# users: [] # 空表示匹配所有用户
# verbs: [] # 空表示匹配所有动词
# resources: [] # 空表示匹配所有资源

策略文件创建好之后,编辑 rke2 的配置文件,添加如下的配置参数。

# cat /etc/rancher/rke2/config.yaml
......
kube-apiserver-arg:
- profiling=true
- audit-policy-file=/etc/kubernetes/audit-policy.yaml
- audit-log-path=/var/log/kubernetes/audit/audit.json
- audit-log-maxage=30 # 定义了保留旧审计日志文件的最长天数
- audit-log-maxbackup=30 # 定义要保留的最大审计日志文件数量。
- audit-log-maxsize=100 # 定义审计日志文件在轮换之前的最大大小(以兆字节为单位)。
- audit-log-format=json

kube-apiserver-extra-mount: # 映射主机目录到 apiserver pod
- /var/log/kubernetes/audit/:/var/log/kubernetes/audit/
- /etc/kubernetes/:/etc/kubernetes/

......