• Русский
  • Как настроить сбор аудита для импортированных стандартных кластеров Kubernetes?

    Описание сценария

    После импорта стандартного кластера Kubernetes в платформу необходимо включить аудит Kubernetes API сервера на кластере, прежде чем платформа сможет собирать данные аудита с этого кластера.

    Этот документ применим к стандартным кластерам Kubernetes, узлы управляющей плоскости которых находятся под вашим управлением, например, кластерам на базе kubeadm. Он не применим к управляемым облачным кластерам Kubernetes, где вы не можете войти или изменить узлы управляющей плоскости.

    Предварительные условия

    • Стандартный кластер Kubernetes уже импортирован в платформу.
    • Вы можете войти на каждый узел управляющей плоскости в кластере.
    • Кластер использует стандартный путь манифеста статического Pod API сервера в стиле kubeadm: /etc/kubernetes/manifests/kube-apiserver.yaml.

    Процедура

    1. Создайте локальный файл policy.yaml для политики аудита.

      Установите apiVersion в соответствии с версией Kubernetes:

      • 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НетМаксимальный размер файла журнала аудита в МиБ. Рекомендуемое значение: 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