Baseline policy: сохраняем полезное, а не всё подряд
Audit policy применяется сверху вниз: побеждает первое совпавшее правило. Если раннее правило уже обработало pods/exec на Metadata, более подробное правило ниже не сработает. Поля доступных селекторов и событий зафиксированы в API reference для audit.k8s.io/v1.
Уровни различаются составом данных и ценой:
- Metadata сохраняет субъект, время, verb, URI, object reference, статус и annotations без тел;
- Request добавляет тело запроса;
- RequestResponse добавляет ещё и тело ответа.
Писать всё на RequestResponse опасно: audit stream может превратиться во вторую базу секретов, а нагрузка на API server и хранение вырастут. omitManagedFields: true уменьшает объём, но не скрывает Secret, токены, env.value, аргументы или чувствительные annotations.
Ниже приведены отдельные фрагменты возможной policy. Они показывают логику настройки, но перед использованием их нужно адаптировать к своему кластеру.
Например, в стартовой policy для Secret и ConfigMap можно сохранять только метаданные:
- level: Metadata
resources:
- group: ""
resources: [secrets, configmaps]
Другой пример — отдельное логирование subresources. Правило для pods не покрывает pods/exec, pods/attach или pods/portforward, поэтому их можно перечислить отдельно:
- level: Request
resources:
- group: ""
resources:
- pods/exec
- pods/attach
- pods/portforward
- pods/ephemeralcontainers
Если правилу нужно содержимое запроса при изменении RBAC или workload, можно использовать уровень Request. Он добавит requestObject, но не будет копировать ответ:
- level: Request
verbs: [create, update, patch, delete, deletecollection]
resources:
- group: rbac.authorization.k8s.io
resources: [roles, rolebindings, clusterroles, clusterrolebindings]
- group: apps
resources: [deployments, daemonsets, statefulsets]
В этом примере policy завершается правилом catch-all. Оно сохраняет основные сведения о запросах, которые не совпали с предыдущими правилами:
- level: Metadata
Для полей requestObject.spec.* достаточно уровня Request или RequestResponse. Конкретное stock rule при этом может фильтровать точную строку уровня. Если автор правила буквально зафиксировал level == "Request", более подробное событие с level: RequestResponse не совпадёт с условием. После выбора policy сверьте контракты включаемых правил.
Есть ещё два ограничения. Для PATCH request body может содержать массив операций без полной итоговой спецификации. Уровень также нельзя выбирать по будущему responseStatus: коды 401/403 фильтруются уже в Elastic.