本文档介绍了 Google Kubernetes Engine (GKE) 中的审核日志记录政策。本文档假定您了解以下内容:
GKE 会捕获并记录集群中的事件,而多种因素会影响记录的信息、信息的存储位置以及影响您在审核日志中查看的内容的政策。
本文档面向安全专家,旨在帮助他们深入了解集群中发生的活动,以便监控安全威胁、跟踪更改和排查问题。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务。
如需了解如何启用和查看不同类型的审核日志,以及了解所需的 IAM 权限,请参阅 GKE 审核日志记录信息。
审核政策概览
在 GKE 集群中,Kubernetes API 服务器将审核日志条目写入由 GKE 管理的后端。当 GKE 从 Kubernetes API 服务器接收日志条目时,它会将其写入项目的管理员活动日志和数据访问日志。
有两项政策会影响您在项目审核日志中看到的内容:
Kubernetes 审核政策定义将哪些事件应记录为日志条目的规则,还指定了日志条目应包含的数据。
GKE 审核政策确定将哪些条目写入管理员活动日志,以及哪些条目写入数据访问日志。
写入数据访问日志的审核日志取决于您的审核日志配置。数据访问日志使用 Google Cloud Observability 价格。管理员活动日志可免费使用。GKE 支持以下类型的数据访问日志。
ADMIN_READ:读取 Kubernetes 资源元数据的操作,例如列出 Pod。DATA_READ:读取 Kubernetes 资源中数据的操作,例如读取 Pod 的日志。DATA_WRITE:将数据写入 Kubernetes 资源的操作,例如更新 Pod 状态。
如需了解详情,请参阅配置数据访问审核日志。
Kubernetes 审核政策
Kubernetes API 服务器遵循 kube-apiserver 命令的 --audit-policy-file 标志中指定的政策。
当 GKE 启动 Kubernetes API 服务器时,它会通过设置 --audit-policy-file 标志的值来提供审核政策文件。在开源 Kubernetes 代码库中,您可以找到生成审核政策文件的 configure-helper.sh 脚本。您可以通过直接查看该脚本来查看审核政策文件的大部分内容。
事件和阶段
当某个人或组件向 Kubernetes API 服务器发出请求时,该请求将经历一个或多个阶段:
| 阶段 | 说明 |
|---|---|
| RequestReceived | 审核处理程序已收到请求。 |
| ResponseStarted | 已发送响应标头,但尚未发送响应正文。 |
| ResponseComplete | 响应正文已完成,不再发送任何字节。 |
| Panic | 内部服务器错误,请求未完成。 |
请求的每个阶段都会生成一个事件,该事件根据政策进行处理。政策指定是否应将事件记录为日志条目,如果需要记录,应将哪些数据包含在日志条目中。
审核级别
Kubernetes 审核政策文件包含一个规则列表。在政策文件中,与事件匹配的第一项规则设置事件的审核级别。
规则可以指定以下审核级别之一:
| 级别 | 说明 |
|---|---|
| 无 | 不为事件创建日志条目。 |
| 元数据 | 创建日志条目。包括元数据,但不包括请求正文或响应正文。 |
| 请求 | 创建日志条目。包括元数据和请求正文,但不包括响应正文。 |
| RequestResponse | 创建日志条目。包括元数据、请求正文和响应正文。 |
下面是一个示例规则。如果事件与规则匹配,Kubernetes API 服务器将在 Request 级别创建一个日志条目。
- level: Request
userGroups: ["system:nodes"]
verbs: ["update","patch"]
resources:
- group: "" # core
resources: ["nodes/status", "pods/status"]
omitStages:
- "RequestReceived"
如果满足以下所有条件,则事件与规则匹配:
- 事件与政策文件中前面的任何规则都不匹配。
- 进行调用的身份属于
system:nodes用户组。 - 该调用是
update请求或patch请求。 - 请求针对
nodes/status资源或pods/status资源。 - 事件不是针对调用的
RequestReceived阶段。
GKE 审核政策
当 GKE 从 Kubernetes API 服务器接收日志条目时,它会应用自己的政策来确定将哪些条目写入项目的管理员活动日志,将哪些条目写入项目的数据访问日志。
在大多数情况下,GKE 应用以下规则来记录来自 Kubernetes API 服务器的条目:
表示
create、delete和update请求的条目将写入管理员活动日志。表示
get、list和updateStatus请求的条目将写入数据访问日志。
如需了解价格以及默认启用的日志类型,请参阅 Logging 详情。
GKE 集群的 Kubernetes 审核政策文件
对于 GKE 集群,Kubernetes 审核政策文件开头的规则将指定不记录哪些事件。例如,此规则指定不应记录 kubelet 发出的针对 nodes 资源或 nodes/status 资源的任何 get 请求。前文中提到过,None 级别意味着不应记录任何匹配事件:
- level: None
users: ["kubelet"] # legacy kubelet identity
verbs: ["get"]
resources:
- group: "" # core
resources: ["nodes", "nodes/status"]
在 level: None 规则列表之后,政策文件包含一列针对特殊情况的规则。例如,下面是一个特殊情况规则,指定在 Metadata 级别记录某些请求:
- level: Metadata
resources:
- group: "" # core
resources: ["secrets", "configmaps"]
- group: authentication.k8s.io
resources: ["tokenreviews"]
omitStages:
- "RequestReceived"
如果满足以下所有条件,则事件与规则匹配:
- 事件与政策文件中前面的任何规则都不匹配。
- 请求针对
secrets、configmaps或tokenreviews类型的资源。 - 事件不是针对调用的
RequestReceived阶段。
在特殊情况规则列表之后,政策文件列出一些通用规则。
如需查看脚本中的通用规则,您必须用 known_apis 的值替换 ${known_apis}。替换后,您会得到如下规则:
- level: Request
verbs: ["get", "list", "watch"]
resources:
- group: "" # core
- group: "admissionregistration.k8s.io"
- group: "apiextensions.k8s.io"
- group: "apiregistration.k8s.io"
- group: "apps"
- group: "authentication.k8s.io"
- group: "authorization.k8s.io"
- group: "autoscaling"
- group: "batch"
- group: "certificates.k8s.io"
- group: "extensions"
- group: "metrics.k8s.io"
- group: "networking.k8s.io"
- group: "policy"
- group: "rbac.authorization.k8s.io"
- group: "settings.k8s.io"
- group: "storage.k8s.io"
omitStages:
- "RequestReceived"
该规则适用于与政策文件中前面的任何规则均不匹配且不在 RequestReceived 阶段的事件。该规则指定,针对属于所列群组之一的任何资源发出的 get、list 和 watch 请求应该在 Request 级别记录。
政策文件中的下一项规则如下所示:
- level: RequestResponse
resources:
- group: "" # core
- group: "admissionregistration.k8s.io"
- group: "apiextensions.k8s.io"
- group: "apiregistration.k8s.io"
- group: "apps"
- group: "authentication.k8s.io"
- group: "authorization.k8s.io"
- group: "autoscaling"
- group: "batch"
- group: "certificates.k8s.io"
- group: "extensions"
- group: "metrics.k8s.io"
- group: "networking.k8s.io"
- group: "policy"
- group: "rbac.authorization.k8s.io"
- group: "settings.k8s.io"
- group: "storage.k8s.io"
omitStages:
- "RequestReceived"
该规则适用于与政策文件中前面的任何规则均不匹配且不在 RequestReceived 阶段的事件。具体来说,此规则不适用于读取请求:get、list 和 watch。但此规则适用于写入请求,如 create、update 和 delete。该规则指定应该在 RequestResponse 级别记录写入请求。
GKE 集群的 Kubernetes 审核政策摘要
以下列表总结了 GKE 集群的 Kubernetes 审核政策:
通常,
create、update和delete等写入请求会在RequestResponse级别记录。通常,
get、list和watch事件会在Metadata级别记录。有些事件被视为特殊情况。如需查看被视为特殊情况的请求的确切列表,请参阅政策脚本。 特殊情况包括以下内容:
由
kubelet、system:node-problem-detector或system:serviceaccount:kube-system:node-problem-detector发出的针对nodes/status资源或pods/status资源的 update 和 patch 请求会在 Request 级别记录。由
system:nodes组中的任何身份发出的针对nodes/status资源或pods/status资源的 update 和 patch 请求会在 Request 级别记录。system:serviceaccount:kube-system:namespace-controller发出的deletecollection请求会在 Request 级别记录。针对
secrets资源、configmaps资源或tokenreviews资源的请求会在 Metadata 级别记录。
某些请求是不会被记录的。如需查看系统不会记录的请求的确切列表,请参阅政策脚本中的
level: None规则。系统不会记录以下请求:system:kube-proxy发出的监视endpoints资源、services资源或services/status资源的请求。system:unsecured发出的针对kube-system命名空间中configmaps资源的 get 请求。kubelet发出的针对nodes资源或nodes/status资源的 get 请求。system:nodes组中的任何身份发出的针对nodes资源或nodes/status资源的 get 请求。system:kube-controller-manager、system:kube-scheduler或system:serviceaccount:endpoint-controller发出的针对kube-system命名空间中endpoints资源的 get 和 update 请求。system:apiserver发出的针对namespaces资源、namespaces/status资源或namespaces/finalize资源的 get 请求。system:kube-controller-manager发出的针对metrics.k8s.io组中任何资源的 get 和 list 请求。对与
/healthz*、/version或/swagger*匹配的网址发出的请求。