如何为导入的标准 Kubernetes 集群配置审计采集?

场景描述

将标准 Kubernetes 集群导入平台后,必须先在该集群上启用 Kubernetes API 服务器审计日志记录,平台才能从该集群采集审计数据。

本文档适用于控制平面节点由您自行管理的标准 Kubernetes 集群,例如基于 kubeadm 的集群。不适用于无法登录或修改控制平面节点的托管云 Kubernetes 集群。

前提条件

  • 标准 Kubernetes 集群已导入平台。
  • 您可以登录集群中的每个控制平面节点。
  • 集群使用标准的 kubeadm 风格 API 服务器静态 Pod 清单路径:/etc/kubernetes/manifests/kube-apiserver.yaml

操作步骤

  1. 创建本地的 policy.yaml 审计策略文件。

    根据 Kubernetes 版本设置 apiVersion

    • Kubernetes 1.24 之前版本:audit.k8s.io/v1beta1
    • Kubernetes 1.24 及以后版本:audit.k8s.io/v1

    使用以下内容:

    apiVersion: audit.k8s.io/v1
    kind: Policy
    omitStages:
      - "RequestReceived"
    rules:
      - level: None
        users:
          - system:kube-controller-manager
          - system:kube-scheduler
          - system:serviceaccount:kube-system:endpoint-controller
        verbs: ["get", "update"]
        namespaces: ["kube-system"]
        resources:
          - group: ""
            resources: ["endpoints"]
      - level: None
        nonResourceURLs:
          - /healthz*
          - /version
          - /swagger*
      - level: None
        resources:
          - group: ""
            resources: ["events"]
      - level: None
        resources:
          - group: "devops.alauda.io"
      - level: None
        verbs: ["get", "list", "watch"]
      - level: None
        namespaces:
          - kube-system
          - cpaas-system
          - alauda-system
          - istio-system
          - kube-node-lease
        resources:
          - group: "coordination.k8s.io"
            resources: ["leases"]
      - level: None
        resources:
          - group: "authorization.k8s.io"
            resources: ["subjectaccessreviews", "selfsubjectaccessreviews"]
          - group: "authentication.k8s.io"
            resources: ["tokenreviews"]
      - level: Metadata
        resources:
          - group: ""
            resources: ["secrets", "configmaps"]
      - level: RequestResponse
        resources:
          - group: ""
          - group: "aiops.alauda.io"
          - group: "apps"
          - group: "app.k8s.io"
          - group: "authentication.istio.io"
          - group: "auth.alauda.io"
          - group: "autoscaling"
          - group: "asm.alauda.io"
          - group: "clusterregistry.k8s.io"
          - group: "crd.alauda.io"
          - group: "infrastructure.alauda.io"
          - group: "monitoring.coreos.com"
          - group: "networking.istio.io"
          - group: "networking.k8s.io"
          - group: "portal.alauda.io"
          - group: "rbac.authorization.k8s.io"
          - group: "storage.k8s.io"
          - group: "tke.cloud.tencent.com"
          - group: "devopsx.alauda.io"
          - group: "core.katanomi.dev"
          - group: "deliveries.katanomi.dev"
          - group: "integrations.katanomi.dev"
          - group: "builds.katanomi.dev"
          - group: "operators.katanomi.dev"
          - group: "tekton.dev"
          - group: "operator.tekton.dev"
          - group: "eventing.knative.dev"
          - group: "flows.knative.dev"
          - group: "messaging.knative.dev"
          - group: "operator.knative.dev"
          - group: "sources.knative.dev"
          - group: "operator.devops.alauda.io"
      - level: Metadata
    TIP

    如果集群版本早于 1.24,仅需将 apiVersion 字段改为 audit.k8s.io/v1beta1,策略内容其余部分保持不变。

  2. policy.yaml 上传到每个控制平面节点的 /etc/kubernetes/audit/ 目录。

    WARNING
    • 如果集群有多个控制平面节点,需上传到每个节点。
    • 如果目录不存在,请手动创建 /etc/kubernetes/audit/
  3. 修改每个控制平面节点上的 /etc/kubernetes/manifests/kube-apiserver.yaml 文件。

    spec.containers[].command 中添加或更新以下审计相关参数:

    参数是否必需说明
    --audit-policy-file必须设置为 /etc/kubernetes/audit/policy.yaml
    --audit-log-format必须设置为 json
    --audit-log-path必须设置为 /etc/kubernetes/audit/audit.log
    --audit-log-mode推荐值:batch
    --audit-log-maxsize审计日志文件最大大小(MiB)。推荐值:200
    --audit-log-maxbackup保留的审计日志文件数量。推荐值:2

    示例:

    - --audit-log-format=json
    - --audit-log-maxbackup=2
    - --audit-log-maxsize=200
    - --audit-log-mode=batch
    - --audit-log-path=/etc/kubernetes/audit/audit.log
    - --audit-policy-file=/etc/kubernetes/audit/policy.yaml
  4. 在同一 kube-apiserver.yaml 文件中添加审计目录挂载配置。

    spec.containers[].volumeMounts 下添加:

    - mountPath: /etc/kubernetes/audit
      name: k8s-audit

    spec.volumes 下添加:

    - hostPath:
        path: /etc/kubernetes/audit
        type: DirectoryOrCreate
      name: k8s-audit
    WARNING
    • 如果集群有多个控制平面节点,需在每个节点更新该清单文件。
    • volumeMounts[].name 必须与对应的 volumes[].name 保持一致。
    • 不要更改挂载路径 /etc/kubernetes/audit
  5. 保存文件并验证配置是否生效。

    检查每个控制平面节点上是否生成了 /etc/kubernetes/audit/audit.log 文件。如果文件存在且包含审计记录,则配置生效。

    ls -l /etc/kubernetes/audit/audit.log
    tail -n 20 /etc/kubernetes/audit/audit.log