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

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

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

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

Опция 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 поддерживают два формата ссылок на поля:

  • JSON Pointer в кавычках. Например, "/request/mount_type" == transit;
  • нативный формат 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 с исключением данных ответа для kv-монтирований:

  • Stronghold в DP
  • Stronghold в Linux
d8 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 filtered-file                \
  file                               \
  file_path=/logs/audit.log          \
  exclude='[{"condition": "\"/request/mount_type\" == kv", "fields": ["/response/data"]}]'

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

  • Stronghold в DP
  • Stronghold в Linux
d8 stronghold audit enable                \
  -path transit-only                      \
  file                                    \
  filter='mount_type == "transit"'        \
  file_path=/logs/transit.log             \
  exclude='[{"fields": ["/request/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 перед записью.