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 поддерживают два формата ссылок на поля:
- JSON Pointer в кавычках. Пример:
"/request/mount_type" == transit - Нативный формат bexpr. Пример:
request.mount_type == "transit"
Поддерживаются операторы:
==!=matchesinnot inandornot
В отличие от 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"]}]'В этом примере устройство:
- Принимает только записи от
transit-монтирований. - Удаляет из них
request.dataперед записью.