审核日志记录

概览

Anthos clusters on VMware (GKE On-Prem) 利用 Kubernetes 审核日志记录功能,该功能会按时间顺序记录对 Kubernetes API 服务器进行的调用。审核日志适合用于调查可疑的 API 请求以及收集统计信息。

您可以配置集群,使其将审核日志写入磁盘或 Google Cloud 项目中的 Cloud Audit Logs。与写入磁盘,甚至在本地日志记录系统中捕获日志相比,写入 Cloud Audit Logs 具有多个优势:

  • 所有 Anthos 集群的审核日志都可以集中管理。
  • 写入 Cloud Audit Logs 的日志条目是不可变的。
  • Cloud Audit Logs 条目会保留 400 天。
  • Cloud Audit Logs 包含在 Anthos 的价格中。

基于磁盘的审核日志记录

默认情况下,审核日志会写入永久性磁盘,这样虚拟机重启和升级就不会导致日志消失。Anthos clusters on VMware 最多可保留 12 GB 的审核日志条目。

Cloud Audit Logs

如果您为集群启用 Cloud Audit Logs,则集群的 Kubernetes API 服务器的管理员活动审核日志条目会发送到 Google Cloud(使用您在集群配置文件的 cloudAuditLogging.projectID 字段中指定的 Google Cloud 项目)。此 Google Cloud 项目被称为审核日志记录项目

审核日志记录项目必须与舰队宿主项目相同。

启用 Cloud Audit Logs 时,Anthos clusters on VMware 会停用基于磁盘的审核日志记录。

为了将日志条目缓冲并写入到 Cloud Audit Logs,Anthos clusters on VMware 会将一个 audit-proxy Pod 部署到管理员集群中。此组件也可用作用户集群的 Sidecar 容器。

限制

适用于 Anthos clusters on VMware 的当前 Cloud Audit Logs 版本存在一些限制:

  • 不支持数据访问(get、list、watch 请求)日志记录。

  • 不支持修改 Kubernetes 审核政策。

  • Cloud Audit Logs 不能应对长时间的网络中断。如果无法将日志条目导出到 Google Cloud,则它们将缓存在 10G 磁盘缓冲区中。如果该缓冲区填满,则会丢弃后续条目。

启用 Anthos Audit API

在审核日志记录项目中启用 Anthos Audit API。

启用 Anthos Audit API

为 Cloud Audit Logs 创建服务账号

您已经创建了一个或多个服务账号,以便于使用 Anthos clusters on VMware。对于此功能,您需要额外创建一个服务账号,称为审核日志记录服务账号

  1. 创建您的审核日志记录服务账号:

    gcloud iam service-accounts create audit-logging-service-account
  2. 为 Cloud Audit Logs 服务账号创建 JSON 密钥文件:

    gcloud iam service-accounts keys create audit-logging-key.json \
       --iam-account AUDIT_LOGGING_SERVICE_ACCOUNT_EMAIL
    

    其中,AUDIT_LOGGING_SERVICE_ACCOUNT_EMAIL 是您的服务账号的电子邮件地址。

  3. audit-logging-key.json 保存在管理员工作站上其他服务账号密钥所在的位置。

创建已启用 Cloud Audit Logs 的管理员集群

只有在一开始创建管理员集群时,您才能为该管理员集群启用 Cloud Audit Logs。您不能修改现有管理员集群来启用 Cloud Audit Logs。

  1. 请参阅创建管理员集群

  2. 在管理员集群配置文件中,填写 cloudAuditLogging 部分。

  3. cloudAuditLogging.projectID 设置为您的审核日志记录项目的 ID。

  4. cloudAuditLogging.clusterLocation 设置为您要在其中存储审核日志的 Google Cloud 地区。为了缩短延迟时间,请选择靠近本地数据中心的区域。

  5. cloudAuditLogging.serviceAccountKeyPath 设置为审核日志记录服务账号的 JSON 密钥文件的路径。

例如:

cloudAuditLogging:
  projectID: "my-project"
  clusterLocation: "us-west1"
  serviceAccountKeyPath: "/my-key-folder/audit-logging-key.json"

继续照常创建集群。

创建已启用 Cloud Audit Logs 的用户集群

  1. 请参阅创建用户集群

  2. 在用户集群配置文件中,填写 cloudAuditLogging 部分。

  3. cloudAuditLogging.projectID 设置为您的审核日志记录项目的 ID。

  4. cloudAuditLogging.clusterLocation 设置为您要在其中存储审核日志的 Google Cloud 地区。为了缩短延迟时间,请选择靠近本地数据中心的区域。

  5. cloudAuditLogging.serviceAccounKeyPath 设置为 Cloud Audit Logs 服务账号的 JSON 密钥文件的路径。

  6. 确保已填写 gkeConnect 部分,并且 gkeConnect.projectIDcloudAuditLogging.projectID 相同。

例如:

gkeConnect:
  projectID: "my-project"
  registerServiceAccountKeyPath: "/my-key-fokder/connect-register-key.json"

cloudAuditLogging:
  projectID: "my-project"
  clusterLocation: "us-west1"
  serviceAccountKeyPath: "/my-key-folder/audit-logging-key.json"

继续照常创建集群。

为现有用户集群启用 Cloud Audit Logs

您只能在注册用户集群的 Google Cloud 项目中启用 Cloud Audit Logs。

如果现有用户集群未注册,请在启用 Cloud Audit Logs 之前按照以下步骤注册:

  1. gkeConnect 部分添加到用户集群配置文件中。例如:

    gkeConnect:
      projectID: "my-project"
      registerServiceAccountKeyPath: "/my-key-fokder/connect-register-key.json"
    
  2. 更新集群:

    gkectl update cluster --config USER_CLUSTER_CONFIG --kubeconfig ADMIN_CLUSTER_KUBECONFIG
    

注册用户集群后,请按照以下步骤启用 Cloud Audit Logs:

  1. 填写用户集群配置文件文件的 cloudAuditLogging 部分。如需详细了解各个字段,请参阅创建已启用 Cloud Audit Logs 的用户集群cloudAuditLogging 部分中的 projectID 必须与 gkeConnect 部分中的相同。

  2. 更新集群:

    gkectl update cluster --config USER_CLUSTER_CONFIG --kubeconfig ADMIN_CLUSTER_KUBECONFIG
    

为现有用户集群停用 Cloud Audit Logs

  1. 在用户集群配置文件中,删除 cloudAuditLogging 部分。

  2. 更新用户集群:

gkectl update cluster --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] --config [USER_CLUSTER_CONFIG]

访问审核日志

基于磁盘的审核日志记录

  1. 查看在管理员集群及其所有关联的用户集群中运行的 Kubernetes API 服务器:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get pods --all-namespaces -l component=kube-apiserver
    

    其中,[ADMIN_CLUSTER_KUBECONFIG] 是管理员集群的 kubeconfig 文件。

  2. 下载 API 服务器的审核日志:

    kubectl cp -n NAMESPACE APISERVER_POD_NAME:/var/log/kube-audit/kube-apiserver-audit.log /tmp/kubeaudit.log
    

    此命令会提取最新的日志文件,该日志文件对于管理员集群最多可以包含 1 GB 的数据,而对于用户集群最多可以包含 850 GB 的数据。

    您还可以在 /var/log/kube-audit/kube-apiserver-audit.log 下的控制平面节点上查找管理员集群的审核日志。用户集群的审核日志位于名为 kube-audit-kube-apiserver-0PersistentVolumeClaim 中。您可以通过 volume 条目在您自己的 Pod 中访问此数据,如下所示:

    volumes:
    - name: kube-audit
      hostPath:
        path: /var/log/kube-audit
        type: ""
    volumes:
    - name: kube-audit
      persistentVolumeClaim:
        claimName: kube-audit-kube-apiserver-0
        readOnly: true

如需在相应的管理员集群节点(且仅限此节点)上安排 Pod,您需要在 Pod 规范中添加 nodeSelectortolerations 部分,如下所示:

    spec:
      nodeSelector:
        node-role.kubernetes.io/master: ''
      tolerations:
      - key: node-role.kubernetes.io/master
        value: ""
        effect: NoSchedule

对于用户集群,请使用以下 nodeSelector

   spec:
     nodeSelector:
       kubernetes.googleapis.com/cluster-name: USER_CLUSTER_NAME

较早的审核记录保存在单独的文件中。如需查看这些文件,请运行以下命令:

   kubectl exec -n NAMESPACE APISERVER_POD_NAME -- ls /var/log/kube-audit -la

每个审核日志的文件名都有一个时间戳,用于指明文件的轮替时间。文件包含该时间和日期之前的审核日志。

Cloud Audit Logs

控制台

  1. 在 Google Cloud 控制台中,转到日志记录菜单中的日志页面。

    前往日志浏览器

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

  3. 在文本框中填写以下过滤条件:

    resource.type="k8s_cluster"
    logName="projects/PROJECT_ID/logs/externalaudit.googleapis.com%2Factivity"
    protoPayload.serviceName="anthosgke.googleapis.com"
    
  4. 点击提交过滤条件以显示来自 Anthos clusters on VMware 集群(已配置为登录此项目)的所有审核日志。

gcloud

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

gcloud logging read \
    'logName="projects/PROJECT_ID/logs/externalaudit.googleapis.com%2Factivity" \
    AND resource.type="k8s_cluster" \
    AND protoPayload.serviceName="anthosgke.googleapis.com" ' \
    --limit 2 \
    --freshness 300d

其中,PROJECT_ID 是您的项目 ID。

输出内容会显示两个日志条目。请注意,对于每个日志条目,logName 字段的值为 projects/PROJECT_ID/logs/externalaudit.googleapis.com%2Factivity,并且 protoPayload.serviceName 等于 anthosgke.googleapis.com

审核政策

Cloud Audit Logs 行为由静态配置的 Kubernetes 审核日志记录政策决定。更改此政策目前不受支持,但将在未来版本中提供。