Документация находится в разработке, может содержать неполную информацию.

Аудит

Для диагностики операций с API, например, в случае неожиданного поведения компонентов управляющего слоя, в Kubernetes предусмотрен режим журналирования операций с API. Этот режим можно настроить путем создания правил Audit Policy, а результатом работы аудита будет лог-файл /var/log/kube-audit/audit.log со всеми интересующими операциями. Более подробно можно почитать в разделе Auditing в документации Kubernetes.

Базовые политики аудита

В кластерах Deckhouse по умолчанию созданы базовые политики аудита:

  • логирование операций создания, удаления и изменения ресурсов;
  • логирование действий, совершаемых от имени сервисных аккаунтов из системных пространств имён: kube-system, d8-*;
  • логирование действий, совершаемых с ресурсами в системных пространствах имён: kube-system, d8-*.

Отключение базовых политик

Отключить сбор логов по базовым политикам можно установив флаг basicAuditPolicyEnabled в false.

Пример включения возможности аудита в kube-apiserver, но без базовых политик Deckhouse:

apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: control-plane-manager
spec:
  version: 1
  settings:
    apiserver:
      auditPolicyEnabled: true
      basicAuditPolicyEnabled: false

Можно воспользоваться патчем:

d8 k patch mc control-plane-manager --type=strategic -p '{"settings":{"apiserver":{"auditPolicyEnabled":true, "basicAuditPolicyEnabled": false}}}'

Пользовательские политики аудита

Модуль control-plane manager автоматизирует настройку kube-apiserver для добавления пользовательских политик аудита. Чтобы такие дополнительные политики заработали, нужно удостовериться, что аудит включён в секции параметров apiserver и создать секрет с политикой аудита:

  1. Включите параметр auditPolicyEnabled в настройках модуля:

    apiVersion: deckhouse.io/v1alpha1
    kind: ModuleConfig
    metadata:
      name: control-plane-manager
    spec:
      version: 1
      settings:
        apiserver:
          auditPolicyEnabled: true
    

    Включить можно редактированием ресурса, либо с помощью патча:

    d8 k patch mc control-plane-manager --type=strategic -p '{"settings":{"apiserver":{"auditPolicyEnabled":true}}}'
    
  2. Создайте Secret kube-system/audit-policy с YAML-файлом политик, закодированным в Base64:

    apiVersion: v1
    kind: Secret
    metadata:
      name: audit-policy
      namespace: kube-system
    data:
      audit-policy.yaml: <base64>
    

    Для примера audit-policy.yaml можно привести правило для логирования всех изменений в метаданных:

    apiVersion: audit.k8s.io/v1
    kind: Policy
    rules:
    - level: Metadata
      omitStages:
      - RequestReceived
    

    С примерами и информацией о правилах политик аудита можно ознакомиться в:

В текущей реализации не валидируется содержимое дополнительных политик.

Если в audit-policy.yaml в политике будут указаны неподдерживаемые опции или будет допущена опечатка, то apiserver не запустится, что приведёт к недоступности управляющего слоя.

В таком случае для восстановления потребуется вручную убрать параметры --audit-log-* в манифесте /etc/kubernetes/manifests/kube-apiserver.yaml и перезапустить apiserver следующей командой:

crictl stopp $(crictl pods --name=kube-apiserver -q)

После перезапуска будет достаточно времени, чтобы удалить ошибочный секрет:

d8 k -n kube-system delete secret audit-policy

Как работать с журналом аудита?

Предполагается наличие на master-узлах сборщика логов (например, log-shipper, promtail, filebeat), который будет отправлять записи из файла в централизованное хранилище:

/var/log/kube-audit/audit.log

Параметры ротации файла журнала предустановлены и их изменение не предусмотрено:

  • Максимальное занимаемое место на диске 1000 МБ.
  • Максимальная глубина записи 7 дней.

Учитывайте, что «максимальная глубина записи» не означает «гарантированная». Интенсивность записи в журнал зависит от настроек дополнительных политик и количества запросов к apiserver, поэтому фактическая глубина хранения может быть сильно меньше 7 дней, например, 30 минут. Это нужно принимать во внимание при настройке сборщика логов и при написании политик аудита.

Вывод аудит-лога в стандартный вывод

Если в кластере настроен сборщик логов с подов, можно собирать аудит лог, выведя его в стандартный вывод. Для этого в настройках модуля установите значение Stdout в параметре apiserver.auditLog.output.

Пример включения аудита с выводом в stdout:

apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: control-plane-manager
spec:
  version: 1
  settings:
    apiserver:
      auditPolicyEnabled: true
      auditLog:
        output: Stdout

Можно воспользоваться патчем:

d8 k patch mc control-plane-manager --type=strategic -p '{"settings":{"apiserver":{"auditPolicyEnabled":true, "auditLog":{"output":"Stdout"}}}}'

После рестарта kube-apiserver, в его логе можно увидеть события аудита:

d8 k -n kube-system logs $(d8 k -n kube-system get po -l component=kube-apiserver -oname | head -n1)

{"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Metadata","auditID":"38a26239-7f3e-402f-8c56-2fb57a3fe49d","stage":"ResponseComplete","requestURI": ...