Stronghold поддерживает включение audit-устройств с опцией exclude, которая позволяет удалять определенные поля из аудит-записей перед записью в лог. Это позволяет тонко настраивать состав записей для каждого устройства.

Исключение полей аудит-записей является продвинутой функцией. Использование исключений может привести к потере данных в аудит-логах. Всегда тестируйте конфигурацию в непроизводственной среде.

При включении audit-устройства с исключениями каждая аудит-запись перед записью проверяется на соответствие опциональным условиям. Если условие совпадает, указанные поля удаляются из записи. Для одного устройства можно задать несколько комбинаций условий и полей.

Поведение уже существующих устройств и новых устройств без исключений не изменяется.

Опция exclude

Значение опции exclude должно быть валидным JSON-массивом объектов исключений.

Объект исключения

  • condition (string, опционально) — предикатное выражение в синтаксисе bexpr. При совпадении Stronghold удаляет поля, указанные в fields. Если condition не задан или является пустой строкой, правило применяется безусловно.
  • fields (string[], обязательно) — массив полей для удаления, заданных в синтаксисе JSON Pointer.
[
  {
    "condition": "",
    "fields": [ "" ]
  }
]

Семантика “золотого источника”

Условия исключений всегда вычисляются относительно оригинальной, неизмененной аудит-записи. Удаление полей одним правилом не влияет на вычисление условий последующих правил. Это гарантирует предсказуемое поведение независимо от порядка объявления правил.

Примеры исключений

Исключить данные ответа

Удалить поле data из ответа в любой аудит-записи:

[
  {
    "fields": [ "/response/data" ]
  }
]

Исключить данные запроса для transit-монтирований

Удалить поле data из запроса для записей с mount_type == "transit":

[
  {
    "condition": "\"/request/mount_type\" == transit",
    "fields": [ "/request/data" ]
  }
]

Несколько исключений

Удалить data из запроса и ответа для transit, а также entity_id из auth для записей, где client_token начинается с hmac:

[
  {
    "condition": "\"/request/mount_type\" == transit",
    "fields": [ "/request/data", "/response/data" ]
  },
  {
    "condition": "\"/auth/client_token\" matches \"hmac.+\"",
    "fields": [ "/auth/entity_id" ]
  }
]

Синтаксис условий

Условия в condition поддерживают два формата ссылок на поля:

  1. JSON Pointer в кавычках. Пример: "/request/mount_type" == transit
  2. Нативный формат bexpr. Пример: request.mount_type == "transit"

Поддерживаются операторы:

  • ==
  • !=
  • matches
  • in
  • not in
  • and
  • or
  • not

В отличие от filter, условия exclude вычисляются относительно полной аудит-записи. Для них доступны все поля записи, а не только ограниченный набор свойств.

Структура аудит-записи

Поля, доступные для ссылок в условиях исключений, соответствуют актуальной JSON-структуре аудит-записи Stronghold.

Практически это означает:

  • для ссылок через JSON Pointer используйте путь к реальному полю в JSON-структуре;
  • для условий в bexpr можно использовать эквивалентную точечную нотацию;
  • если поле является объектом, можно адресовать как сам объект, так и его вложенные поля.

Характерные примеры:

  • /request/data <-> request.data
  • /request/mount_type <-> request.mount_type
  • /request/namespace/id <-> request.namespace.id
  • /request/namespace/path <-> request.namespace.path
  • /request/request_uri <-> request.request_uri
  • /auth/entity_id <-> auth.entity_id
  • /response/data <-> response.data
  • /response/wrap_info/token <-> response.wrap_info.token

Если вы сомневаетесь в корректности пути, сначала проверьте, как поле сериализуется в аудит-записи конкретного типа (request или response), и только затем добавляйте исключение.

Практический пример

Включение file audit-устройства с исключением данных ответа для kv-монтирований:

stronghold audit enable              \
  -path filtered-file                \
  file                               \
  file_path=/logs/audit.log          \
  exclude='[{"condition": "\"/request/mount_type\" == kv", "fields": ["/response/data"]}]'

Комбинация фильтрации и исключений:

stronghold audit enable                   \
  -path transit-only                      \
  file                                    \
  filter='mount_type == "transit"'        \
  file_path=/logs/transit.log             \
  exclude='[{"fields": ["/request/data"]}]'

В этом примере устройство:

  1. Принимает только записи от transit-монтирований.
  2. Удаляет из них request.data перед записью.