访问审核日志

本页面介绍了如何在 Google Kubernetes Engine (GKE) 集群中使用审核日志记录功能。

Kubernetes 支持的所有集群都具有 Kubernetes 审核日志,该日志按时间顺序记录了对 Kubernetes API 服务器进行的调用。 Kubernetes 审核日志条目适合用于调查可疑的 API 请求、收集统计信息,或针对不当 API 调用创建监控提醒。

GKE 集群将 Kubernetes Audit Logging 与 Cloud Audit LogsCloud Logging 集成。您可以在自己的 Google Cloud 项目中查看 Kubernetes 审核日志条目。

项目的审核日志不止包含 Kubernetes 写入的条目,还包含 GKE 写入的条目。

GKE 1.11.4 及更高版本中提供 Audit Logging GA。

准备工作

在开始之前,请确保您已执行以下任务:

使用以下任一方法设定默认的 gcloud 设置:

  • 使用 gcloud init(如果您想要在系统引导下完成默认设置)。
  • 使用 gcloud config(如果您想单独设置项目 ID、区域和地区)。

使用 gcloud init

如果您收到 One of [--zone, --region] must be supplied: Please specify location 错误,请完成本部分。

  1. 运行 gcloud init 并按照说明操作:

    gcloud init

    如果您要在远程服务器上使用 SSH,请使用 --console-only 标志来防止命令启动浏览器:

    gcloud init --console-only
  2. 按照说明授权 gcloud 使用您的 Google Cloud 帐号。
  3. 创建新配置或选择现有配置。
  4. 选择 Google Cloud 项目。
  5. 选择默认的 Compute Engine 区域。

使用 gcloud config

  • 设置默认项目 ID
    gcloud config set project project-id
  • 如果您使用的是区域级集群,请设置默认计算区域
    gcloud config set compute/zone compute-zone
  • 如果您使用的是地区级集群,请设置默认计算地区
    gcloud config set compute/region compute-region
  • gcloud 更新到最新版本:
    gcloud components update

在您的项目中需要有一个 GKE 集群。您可以使用现有集群,也可以为本主题中的练习创建一个新集群。如果选择使用现有集群,请确保该集群有过一些近期活动。例如,如果您最近未创建 Deployment,则可以通过输入以下命令立即创建 Deployment:

kubectl run log-exercise --image nginx

了解 Kubernetes 审核日志

项目中的审核日志

您的 Cloud 项目具有以下审核日志:

  • 管理员活动日志
  • 数据访问日志

默认情况下,管理员活动日志处于启用状态,且无需任何额外费用。

默认情况下,数据访问日志处于停用状态,启用该日志可能会额外计费。如需详细了解如何启用数据访问日志以及相关费用,请参阅配置数据访问日志

GKE 不支持 Access Transparency 日志记录功能。

各种 Google Cloud 服务都会将条目写入您的项目的日志中。Kubernetes 服务还会将条目写入您的项目的审核日志中。对于 GKE 集群,以下服务写入的日志条目是最具相关性的:

服务 显示名 说明
k8s.io Kubernetes k8s.io 服务用于 Kubernetes 审核日志。这些日志由 Kubernetes API 服务器组件生成,其中包含有关使用 Kubernetes API 执行的操作的信息。例如,您使用 kubectl 命令对 Kubernetes 资源所做的任何更改都会由 k8s.io 服务记录。如需了解详情,请参阅 Kubernetes 文档中的审核
container.googleapis.com Kubernetes Engine container.googleapis.com 服务用于 GKE 控制层面审核日志。这些日志由 GKE 内部组件生成,其中包含关于使用 GKE API 执行的操作的信息。例如,您使用 gcloud 命令对 GKE 集群配置所做的任何更改都会由 container.googleapis.com 服务记录。

查看项目的管理员活动日志

控制台

  1. 在 Cloud Console 中,转到日志记录菜单中的日志页面。

    转到“日志”页面

  2. 在页面顶部附近,找到用于选择资源类型的下拉菜单。从下拉菜单中,选择 Kubernetes 集群

  3. (可选)指定位置或选择所有位置 (All location)。如果选择某一位置,则可以选择该位置中的特定集群。

  4. 右侧的下一个菜单用于选择日志。从下拉菜单中选择活动,然后点击确定

  5. 默认情况下,显示屏会显示所有日志级别。要指定日志级别(例如警告),请从表示日志级别的下拉菜单中选择该级别。

  6. 显示屏可能只会显示过去一小时内的日志条目。如果您没有看到过去一小时内的任何日志条目,请点击加载较旧的日志

  7. 按标签过滤或搜索文字框中(在前面步骤中所述的下拉菜单上方),点击向下箭头以打开该下拉菜单。从菜单中,选择转换为高级过滤条件

  8. 文本框将显示类似于以下内容的过滤条件:

    resource.type="k8s_cluster"
    logName="projects/my-project/logs/cloudaudit.googleapis.com%2Factivity"
    
  9. 通过点击行的开头的箭头,打开其中一个日志条目。条目的 logName 字段的值为 projects/project-id/logs/cloudaudit.googleapis.com%2Factivity

gcloud

列出项目的管理员活动日志中的前两个日志条目:

gcloud logging read \
    'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"' \
    --limit 2 \
    --freshness 300d

其中,project-id 是您的项目 ID。

输出区将显示两个日志条目。请注意,对于每个日志条目,logName 字段的值为 projects/project-id/logs/cloudaudit.googleapis.com%2Factivity

insertId: 18yao5jem14og
labels:
  cluster_version: 1.8.8-gke.0
logName: projects/project-id/logs/cloudaudit.googleapis.com%2Factivity
...

基本和高级过滤条件界面

在 Cloud Console 中,“日志”页面具有两种过滤条件界面:基本和高级。如需了解这两种过滤条件界面,请参阅日志查看器过滤条件界面

查看写入管理员活动日志的服务

控制台

  1. 在 Cloud Console 中,转到日志记录菜单中的日志页面。

    转到“日志”页面

  2. 如果日志页面未处于高级模式,请切换到高级模式。在过滤条件框中,点击右侧的向下箭头,然后选择转换为高级过滤条件

  3. 在过滤条件框中,删除任何现有文本,然后输入此过滤条件。

    logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
    protoPayload.serviceName="k8s.io"
    

    其中,project-id 是您的项目 ID。

    点击提交过滤条件

    显示区将列出管理员活动日志中由 k8s.io 服务写入的所有条目,即由 Kubernetes 控制层面写入的条目。

  4. 查找由非 k8s.io 服务写入的日志条目:在过滤条件框中,将 serviceName="k8s.io" 更改为 serviceName!="k8s.io"。点击提交过滤条件

    显示区将列出管理员活动日志中非 k8s.io 服务写入的日志条目。

  5. 打开其中一个日志条目,然后展开 protoPayload 字段。查看 serviceName 的值以查看写入该日志条目的服务。

  6. 查找由 container.googleapis.com 服务写入的日志条目,即由 Kubernetes Engine 控制层面写入的条目:在过滤条件框中,将 serviceName!="k8s.io" 更改为 serviceName="container.googleapis.com"。点击提交过滤条件

gcloud

  1. 列出项目的管理员活动日志中由 k8s.io 服务写入的前两个日志条目,即由 Kubernetes 控制层面写入的条目。

    gcloud logging read \
       'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
           AND protoPayload.serviceName="k8s.io"' \
       --limit 2 \
       --freshness 300d
    

    其中,project-id 是您的项目 ID。

    在输出结果中,您可以看到 protoPayload:serviceName 的值为 k8s.io

    protoPayload:
     ...
     serviceName: k8s.io
    
  2. 查找由非 k8s.io 服务写入的日志条目:

    gcloud logging read \
       'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
           AND protoPayload.serviceName!="k8s.io"' \
       --limit 2 \
       --freshness 300d
    

    输出区将列出管理员活动日志中非 k8s.io 服务写入的日志条目。

    logName: projects/project-id/logs/cloudaudit.googleapis.com%2Factivity
    ...
    protoPayload:
     ...
     serviceName: compute.googleapis.com
    ...
    
  3. 在其中一个日志条目中,查看 protoPayload.serviceName 的值以查看写入该日志条目的服务。

  4. 查找由 container.googleapis.com 服务写入的日志条目,即由 GKE 控制层面写入的条目:

    gcloud logging read \
       'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
           AND protoPayload.serviceName="container.googleapis.com"' \
       --limit 2 \
       --freshness 300d
    

    其中,project-id 是您的项目 ID。

按资源类型过滤管理员活动日志

管理员活动日志中的每个日志条目适用于某种类型的资源。以下是与 Kubernetes 集群最相关的资源类型:

资源类型 显示名 说明
k8s_cluster Kubernetes 集群 Kubernetes API 服务器写入的日志条目适用于 k8s_cluster 资源类型。这些日志条目说明对集群中 Kubernetes 资源(例如 Pod、Deployment、Secret)的操作。
gke_cluster GKE 集群操作 Kubernetes Engine API 服务器写入的日志条目适用于 gke_cluster 资源。这些日志条目说明集群创建和删除等操作。

您可以在 Cloud Console 中或借助 gcloud 命令行工具使用这些过滤条件。

控制台

  1. 在 Cloud Console 中,转到日志记录菜单中的日志页面。

    转到“日志”页面

  2. 如果日志页面未处于基本模式,请切换到基本模式。 在过滤条件框中,点击右侧的向下箭头,然后选择清除过滤条件并返回基本模式

  3. 从用于选择资源类型的下拉菜单中,选择 Kubernetes 集群。这是 k8s_cluster 资源类型的显示名。

  4. 从用于选择日志的下拉菜单中,选择活动,然后点击确定

    显示区将列出管理员活动日志中适用于 k8s_cluster 资源类型的所有日志条目。

  5. 打开其中一个日志条目,然后展开 resource 字段。验证 type 字段是否具有值 k8s_cluster

  6. 从下拉菜单中选择 GKE 集群操作。 这是 gke_cluster 资源类型的显示名。从用于选择日志的下拉菜单中,选择活动,然后点击确定

    显示区将列出管理员活动日志中适用于 gke_cluster 资源类型的所有日志条目。

gcloud

  1. 列出项目的管理员活动日志中适用于 k8s_cluster 资源类型的前两个日志条目:

    gcloud logging read \
       'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
           AND resource.type="k8s_cluster"' \
       --limit 2 \
       --freshness 300d
    

    其中,project-id 是您的项目 ID。

    在输出结果中,您可以看到 resource:type 字段的值为 k8s_cluster

    resource:
     ...
     type: k8s_cluster
    
  2. 列出项目的管理员活动日志中适用于 gke_cluster 资源类型的前两个日志条目:

    gcloud logging read \
       'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
           AND resource.type="gke_cluster"' \
       --limit 2 \
       --freshness 300d
    

    在输出结果中,您可以看到 resource:type 字段的值为 gke_cluster

    resource:
     ...
     type: gke_cluster
    

管理员活动日志的示例过滤条件

以下是一些您可以在 Cloud Console 中试用的过滤条件示例。在每个示例中,请将 project-id 替换为您的项目 ID。

查找对基于角色的访问控制的更改,不包括自动系统更改。

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.authorization.rbac.v1"
NOT protoPayload.authenticationInfo.principalEmail:"system"
logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.authorization.rbac.v1.roles"
NOT protoPayload.authenticationInfo.principalEmail:"system"
logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.authorization.rbac.v1.rolebindings"
NOT protoPayload.authenticationInfo.principalEmail:"system"

您可以使用类似查询来查找对 clusterrolesclusterrolebindings 的更改。

查找证书签名请求。

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.resourceName:"certificates.k8s.io/v1beta1/certificatesigningrequests"

查找未经身份验证的网络请求。

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail:"system:anonymous"

查找 kubelet 引导程序身份调用。

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail:"kubelet"

查找节点已经过身份验证的请求。

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail:"system:node"

查找 IP 地址范围之外的调用。

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.requestMetadata.callerIp!="127.0.0.1"
protoPayload.requestMetadata.callerIp!="::1"
NOT protoPayload.requestMetadata.callerIp:"ip-prefix"

在管理员活动日志中查找适用于 k8s_cluster 资源类型并说明 Deployment 创建的条目。

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"deployments.create"

在管理员活动日志中查找适用于 k8s_cluster 资源类型且 system:anonymous 值为 principalEmail 的条目。这些条目可能表示失败的身份验证尝试。

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail="system:anonymous"

在管理员活动日志中查找适用于 gke_cluster 资源类型并说明集群创建的条目:

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="gke_cluster"
protoPayload.methodName="google.container.v1.ClusterManager.CreateCluster"

在管理员活动日志中查找适用于 gke_cluster 资源类型且 ERROR 值为 severity 的条目:

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="gke_cluster"
severity="ERROR"

在管理员活动日志中查找适用于 k8s_cluster 资源类型并说明对 Secret 的写入请求的条目:

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.core.v1.secrets"
NOT protoPayload.methodName:"get"
NOT protoPayload.methodName:"list"
NOT protoPayload.methodName:"watch"

在管理员活动日志中查找适用于 k8s_cluster 资源类型并说明来自特定用户的 Pod 请求的条目:

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.core.v1.pods"
protoPayload.authenticationInfo.principalEmail="dev@example.com"

如需详细了解如何构建过滤条件,请参阅高级日志过滤条件

日志条目的结构

每个日志条目都是一个 LogEntry 类型的对象。如需了解详情,请参阅了解审核日志

启用数据访问日志

  1. 获取您的项目的 Identity and Access Management (IAM) 政策:

    gcloud projects get-iam-policy project-id > my-policy.yaml
    

    其中,project-id 是您的项目 ID。

  2. 打开 my-policy.yaml 以查看您的 IAM 政策。您的政策可能包含类似于以下内容的 bindings 对象:

    bindings:
    - members:
      - serviceAccount:xxx.gserviceaccount.com
      - serviceAccount:yyy.gserviceaccount.com
      role: roles/container.clusterAdmin
    - members:
      ...
    
  3. my-policy.yaml 中,创建一个 auditConfigs 对象,或添加到现有 auditConfigs 对象,以便在 auditLogConfigs 下列出 ADMIN_READDATA_WRITEDATA_READ

    auditConfigs:
    - auditLogConfigs:
      - logType: ADMIN_READ
      - logType: DATA_WRITE
      - logType: DATA_READ
      service: allServices
    

    请勿更改 etag 的值。

  4. 将更新的文件另存为 my-policy-2.yaml

  5. 为您的项目设置 IAM 政策:

    gcloud projects set-iam-policy project-id my-policy-2.yaml
    

    其中,project-id 是您的项目 ID。

查看项目的数据访问日志

控制台

  1. 在 Cloud Console 中,转到日志记录菜单中的日志页面。

    转到“日志”页面

  2. 如果日志页面未处于基本模式,请切换到基本模式。 在过滤条件框中,点击右侧的向下箭头,然后选择清除过滤条件并返回基本模式

  3. 在页面顶部附近,找到用于选择资源类型的下拉菜单。从下拉菜单中,选择 Kubernetes 集群

  4. 在用于选择日志的菜单中,选择 data_access,然后点击确定

  5. 按标签过滤或搜索文字框的右侧,点击向下箭头以打开下拉菜单。从菜单中,选择转换为高级过滤条件

  6. 文本框将显示类似于以下内容的过滤条件:

    resource.type="k8s_cluster"
    logName="projects/my-project/logs/cloudaudit.googleapis.com%2Fdata_access"
  7. 打开其中一个日志条目,并注意,条目的 logName 字段的值为 projects/project-id/logs/cloudaudit.googleapis.com%2Fdata_access

gcloud

列出项目的数据访问日志中的前两个日志条目:

gcloud logging read \
    'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Fdata_access"' \
    --limit 2 \
    --freshness 30d

其中,project-id 是您的项目 ID。

输出区将显示两个日志条目。请注意,对于每个日志条目,logName 字段的值为 projects/project-id/logs/cloudaudit.googleapis.com%2Fdata_access

insertId:  "x0vy9eej0j54"
labels: {…}
logName:  "projects/project-id/logs/cloudaudit.googleapis.com%2Fdata_access"
...

导出和存储日志条目

日志条目会在 Cloud Logging 中保留一段时间,这称为保留期限。之后,这些条目会被删除。

如果您要将日志条目保留更长时间,可以将它们导出到 Cloud Storage、BigQuery 或 Pub/Sub 等 Google 服务。

设置指标和提醒

您可以使用 Cloud Monitoring 根据日志条目来设置指标。您还可以使用基于日志的指标来设置图表和提醒

审核政策

Kubernetes 审核政策确定 Kubernetes API 服务器导出的日志条目。Kubernetes Engine 审核政策确定转到管理员活动日志的条目以及转到数据访问日志的条目。

如需详细了解 Kubernetes Engine 中的审核政策,请参阅 Kubernetes Engine 审核政策

后续步骤