Kubernetes 审计日志
Kubernetes 审计日志按时间顺序记录集群内发生的一切。这包括审计用户活动,以及控制平面、节点守护进程、集群服务等组件向 Kubernetes API 发出的每个调用以及 Kubernetes API 调用本身。
Kubernetes 审计日志是由 API 服务器提供的结构化 JSON 输出,包含丰富的元数据信息。使用 Site24x7 AppLogs 监控 Kubernetes 审计日志,可以更好地了解您的 Kubernetes 集群环境。
启用和监控审计日志可以帮助您:
- 获取谁在何时何地做了什么的详细信息。
- 调试集群中的问题。
- 排查与权限和特权相关的 RBAC 策略问题。
审计策略和审计后端
审计策略和后端是您必须在 API 服务器中设置的两种基本配置,用于输出审计日志。
审计策略:审计策略定义了应记录哪些事件以及应包含哪些数据。audit-policy.yaml 文件定义了包含您要记录的 API 请求类型的规则。审计日志根据审计策略配置进行捕获。
审计后端:审计事件根据策略规则进行处理,后端将审计事件推送到以下外部存储:
- 日志后端,将事件写入日志文件(在本地部署和云端环境中均可使用)。
- Webhook 后端,将事件发送到外部 HTTP API,而非本地文件。
请参阅此 Kubernetes 审计文档以了解更多信息。
日志后端配置
Kubernetes 审计日志默认情况下处于禁用状态。您可以在以下环境中启用或禁用审计日志:
本地部署
按照以下三个步骤在本地部署环境中启用和配置审计日志:
步骤 1:创建审计策略
在 /etc/kubernetes/audit-policy.yaml 文件路径创建策略文件 audit-policy.yaml。由于 API 服务器会处理策略文件中定义的第一条匹配规则,请将特定规则放在顶部,后跟通用规则。
以下是官方 Kubernetes 文档中的示例策略文件。
apiVersion: audit.k8s.io/v1 # This is required.
kind: Policy
# Don't generate audit events for all requests in RequestReceived stage.
omitStages:
- "RequestReceived"
rules:
# Log pod changes at RequestResponse level
- level: RequestResponse
resources:
- group: ""
# Resource "pods" doesn't match requests to any subresource of pods,
# which is consistent with the RBAC policy.
resources: ["pods"]
# Log "pods/log", "pods/status" at Metadata level
- level: Metadata
resources:
- group: ""
resources: ["pods/log", "pods/status"]
# Don't log requests to a configmap called "controller-leader"
- level: None
resources:
- group: ""
resources: ["configmaps"]
resourceNames: ["controller-leader"]
# Don't log watch requests by the "system:kube-proxy" on endpoints or services
- level: None
users: ["system:kube-proxy"]
verbs: ["watch"]
resources:
- group: "" # core API group
resources: ["endpoints", "services"]
# Don't log authenticated requests to certain non-resource URL paths.
- level: None
userGroups: ["system:authenticated"]
nonResourceURLs:
- "/api*" # Wildcard matching.
- "/version"
# Log the request body of configmap changes in kube-system.
- level: Request
resources:
- group: "" # core API group
resources: ["configmaps"]
# This rule only applies to resources in the "kube-system" namespace.
# The empty string "" can be used to select non-namespaced resources.
namespaces: ["kube-system"]
# Log configmap and secret changes in all other namespaces at the Metadata level.
- level: Metadata
resources:
- group: "" # core API group
resources: ["secrets", "configmaps"]
# Log all other resources in core and extensions at the Request level.
- level: Request
resources:
- group: "" # core API group
- group: "extensions" # Version of group should NOT be included.
# A catch-all rule to log all other requests at the Metadata level.
- level: Metadata
# Long-running requests like watches that fall under this rule will not
# generate an audit event in RequestReceived.
omitStages:
- "RequestReceived"
步骤 2:定义审计策略和日志文件路径
您只需在主节点上启用审计日志,因为 kube-apiserver 是托管在主节点上的集群控制平面的一部分。在 /etc/kubernetes/manifests/kube-apiserver.yaml 文件中配置以下标志。
--audit-policy-file=/etc/kubernetes/audit-policy.yaml
--audit-log-path=/var/log/kubernetes/audit/audit.log
按如下方式更新配置文件中的 volumeMounts 和 volumes 部分:
volumeMounts:
- mountPath: /etc/kubernetes/audit-policy.yaml
name: audit
readOnly: true
- mountPath: /var/log/kubernetes/audit/
name: audit-log
readOnly: false
volumes:
- hostPath:
path: /etc/kubernetes/audit-policy.yaml
type: File
name: audit
- hostPath:
path: /var/log/kubernetes/audit/
type: DirectoryOrCreate
name: audit-log
步骤 3:在 Site24x7 AppLogs 中创建日志配置文件
- 登录您的 Site24x7 账户。
- 下载并在 Kubernetes 集群主节点上安装 Site24x7 服务器监控 agent(Linux)。
- 转到管理 > AppLogs > 日志配置文件 > 添加日志配置文件。
- 从选择日志类型下拉列表中选择 Kubernetes 审计日志。
- 将 /var/log/kubernetes/audit/audit.log 添加到要搜索日志的文件列表中。

就是这样。您已准备好在本地部署环境中使用 Site24x7 AppLogs 监控审计日志。
云端
查看以下内容以启用或禁用以下服务的审计日志:
- Azure Kubernetes Service(AKS)
- Amazon Elastic Kubernetes Service(EKS)
Azure Kubernetes Service 日志记录
按照以下说明在 Azure Kubernetes Service(AKS)上启用或禁用日志记录:
步骤 1:创建日志配置文件
在 Site24x7 Web 控制台中,导航到管理 > AppLogs > 日志配置文件 > 添加日志配置文件,并输入以下内容:
- 在配置文件名称字段中输入日志配置文件的名称。
- 从选择日志类型下拉列表中选择 Kubernetes 审计日志。
- 从日志来源下拉列表中选择 Azure Functions。
- 为日志时区选择 UTC。
- 单击保存。

步骤 2:使用 Azure 资源管理器(ARM)模板配置 Azure 资源
按照 Azure 诊断日志文档中的说明,使用 ARM 模板配置 Azure 资源。在上述文档中填写自定义部署页面中的详情(步骤 7 和 8)时,请确保针对 Kubernetes 审计日志编辑以下特定内容:
- 资源组:创建一个名称类似于 Site24x7-AKS-Audit-Logs 的新资源组。
- LogTypeConfig:从您已在 Site24x7 中创建的日志配置文件页面(管理 > AppLogs > 日志配置文件 > <Kubernetes 审计日志配置文件名称>)复制值。


步骤 3:启用审计日志并转发到 Site24x7
- 登录您的 Azure 门户。
- 转到 Kubernetes 服务,选择您的 Kubernetes 集群,然后单击诊断设置。

- 在日志下选择 Kubernetes 审计,在目标详情下选择流式传输到事件中心,然后选择事件中心命名空间。

现在,您已准备好使用 Site24x7 AppLogs 监控 Azure Kubernetes Service 环境中的审计日志。
Amazon Elastic Kubernetes Service 日志记录
按照以下步骤在 Amazon Elastic Kubernetes Service(EKS)上启用或禁用日志记录:
步骤 1:启用 Amazon EKS 审计日志
请参阅此官方文档中的指南以启用或禁用 Amazon EKS 审计日志。
步骤 2:采集 CloudWatch 日志
- 在 Site24x7 Web 控制台中,导航到管理 > AppLogs > 日志配置文件 > 添加日志配置文件,然后:
- 在配置文件名称字段中输入日志配置文件的名称。
- 从选择日志类型下拉列表中选择 Kubernetes 审计日志。
- 从日志来源下拉列表中选择 Amazon Lambda。
- 单击保存。
- 按照此文档的 AWS 设置部分中的说明采集 CloudWatch 日志并在 Site24x7 中查看。但是,请确保选择 Kubernetes 审计日志、其 logtypeconfig,以及将日志组选择为 /aws/eks/<my-cluster>/cluster/,然后继续按文档中定义的说明操作。
现在,您已准备好使用 Site24x7 AppLogs 监控 Amazon Elastic Kubernetes Service 环境中的审计日志。
Webhook 后端配置
按照以下步骤配置 Webhook 后端:
配置步骤
- 按照本文档中日志后端配置部分所述,创建并定义审计策略。
- 按照此文档中的说明创建日志类型。
- 对于日志类型,输入 Kubernetes 审计日志。这将自动填充其余字段。
- 确保已启用 API 上传。
- 复制 HTTPS 端点 URL 以配置 Webhook 后端。
- 单击保存。
- 在路径 /etc/kubernetes/pki/audit-webhook.yaml 中创建一个新文件,并复制以下内容。确保在 YAML 文件的 server 键中提供您在上述步骤中复制的 HTTPS 端点 URL。
apiVersion: v1
kind: Config
preferences: {}
clusters:
- name: kubernetes
cluster:
server: "https://logc.site24x7.com/event/receiver/M3NjE4ODc234242342wfwew3zMDhmMTZkYTVmM2I2N2MxOGZiZC9rdWJlY="
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
preferences: {}
users: [] - 要配置后端 Webhook 审计,请在 /etc/kubernetes/manifests/kube-apiserver.yaml 文件中设置以下标志:
--audit-webhook-config-file=/etc/kubernetes/pki/audit-webhook.yaml flag
您无需为 Webhook 后端配置创建日志配置文件。此外,您也无需定义审计日志路径,因为它将审计事件发送到 HTTPS 端点,而不是本地文件。
现在,您已准备好使用 Site24x7 AppLogs 监控 Amazon Elastic Kubernetes Service 环境中的审计日志。
审计日志使用场景
以下是一个示例审计事件:

以下是上述示例审计日志中存在的几个重要键。请参阅此文档以查看审计事件中所有可用字段。
| 键 | 描述 |
| user | 谁(用户或服务账户)发起了请求 |
| sourceIP | 请求从哪里发起 |
| verb | 执行了什么操作(get、post、list、watch、patch、delete) |
| requestURI | 标识客户端发送给服务器的请求 |
| objectRef | 提供与请求关联的 Kubernetes 对象的详细信息 |
| responseStatus | 对发起请求的响应 |
| requestReceivedTimestamp | API 服务器首次收到请求的时间 |
| responseObject | 提供对用户或服务账户发起的请求的响应的洞察 |
| annotations | 提供授权决定及其原因的详细信息 |
- user、sourceIP、verb、requestURI、objectRef 和 requestReceivedTimestamp 等键提供了谁在何时何地做了什么的详细信息。
- responseStatus、responseObject 和 annotations 等键提供了授权和收到的响应信息,帮助您排查权限和特权相关问题。
解读仪表板
查看仪表板中的状态码统计小组件时,会看到 400 以上的状态码。

要进一步调查,请单击 4XX 错误码,这将引导您查看导致此错误的事件。您可以使用下面的查询语言过滤器来确定根本原因。
logtype="Kubernetes Audit Logs" and responsestatus_code=403 and verb="list" groupby username
logtype="Kubernetes Audit Logs" and responsestatus_code=403 and verb="list" and username="system:serviceaccount:default:demo"

demo 用户没有访问 pod 的权限,导致了该错误。您可以据此采取相应的补救措施。
通过 Site24x7 的 Kubernetes 事件日志,您可以查看并管理集群、Pod 和节点的所有事件日志。
故障排除
以下是一些技巧和方法,可帮助您缓解配置期间可能遇到的问题:
如何确认审计日志条目已创建?
日志后端配置
- 按照本文档中"日志后端配置"部分定义的说明操作,并等待几秒钟以使对 Kube-apiserver 配置文件的更改生效。
- 运行以下命令检查 API 服务器是否正在运行:
kubectl get pods -n kube-system -w
- 现在运行以下命令打开日志文件,并检查审计条目是否已创建:
sudo cat /var/log/kubernetes/audit/audit.log
- 如果您看到类似于上述示例日志的日志,则确认审计条目正在被创建。
Webhook 后端配置
- 按照本文档中"Webhook 后端配置"部分定义的说明操作,并等待几秒钟以使对 Kube-apiserver 配置文件的更改生效。
- 运行以下命令检查 API 服务器是否正在运行:
kubectl get pods -n kube-system -w
- 由于 Webhook 后端将事件发送到外部 HTTP API,请等待几秒钟(最多一分钟),登录我们的 Web 客户端,并确认审计条目。
审计策略的通用指南
每个 Kubernetes API 调用包含 RequestReceived、ResponseStarted、ResponseComplete 和 Panic 等阶段。日志根据策略中定义的规则和审计级别(None、Metadata、Request 和 RequestResponse)进行记录。
- Request 和 RequestResponse 级别可深入了解您的 API 调用,但会增加内存消耗,从而增加审计日志存储空间。
- 使用 Metadata 排除敏感信息(如身份验证令牌)。
