Stronghold поддерживает включение audit-устройств с опцией filter, которая ограничивает набор записей, попадающих в конкретный аудит-лог. Фильтры задаются при включении устройства и не могут быть изменены впоследствии: для изменения фильтра устройство нужно отключить и включить заново.

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

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

Fallback-устройства

Фильтрация делает аудит гибче, но также создает риск потери записей. Например, если одно устройство настроено на operation == "read", а другое на operation == "write", записи с operation == "update" не попадут ни в одно из них.

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

Инсталляции, использующие только отфильтрованные устройства, должны всегда настраивать fallback-устройство.

Во всей инсталляции Stronghold может быть не более одного fallback-устройства.

Ограничения

  • Фильтр нельзя добавить к уже включенному устройству: он задается только при включении.
  • Фильтрация поддерживается для всех типов audit-устройств: file, socket, syslog.
  • Нельзя одновременно указать filter и fallback=true: эти опции взаимоисключающие.
  • Допускается только одно fallback-устройство.
  • Fallback-устройство может быть единственным audit-backend-ом, и в этом случае оно будет получать все записи.

Фильтрация и тестовые сообщения

При включении audit-устройства Stronghold отправляет тестовое сообщение. Если фильтр не соответствует свойствам тестового сообщения, оно не будет записано в лог нового устройства. При этом само включение устройства считается успешным.

Свойства тестового сообщения по умолчанию:

СвойствоЗначение
mount_pointпустая строка
mount_typeпустая строка
namespaceпустая строка
operationupdate
pathsys/audit/test

Доступные свойства для фильтрации

Фильтры могут ссылаться только на следующие свойства аудит-записи:

СвойствоПримерОписание
mount_pointmount_point == "auth/oidc"Логировать записи для точки монтирования auth/oidc
mount_typemount_type == "kv-v2"Логировать записи от плагинов kv-v2
namespacenamespace != "admin/"Логировать записи не из namespace admin
operationoperation == "read"Логировать все операции чтения
pathpath == "auth/approle/login"Логировать активность на пути входа AppRole

Путь не-root namespace должен заканчиваться символом / для корректного совпадения. Root namespace не имеет пути и соответствует только пустой строке. Для фильтрации root namespace используйте namespace == "".

Фильтры используют синтаксис bexpr и поддерживают:

  • операторы сравнения ==, !=;
  • оператор matches для регулярных выражений;
  • составные выражения and, or, not.

Метрики fallback

Stronghold публикует telemetry-метрики, связанные с fallback-аудитом:

  • audit.fallback.success — увеличивается, когда fallback-устройство успешно записало аудит-событие, которое не было успешно записано ни одним не-fallback устройством;
  • audit.fallback.miss — увеличивается, когда событие не было записано ни одним отфильтрованным устройством и при этом fallback-устройство не настроено.

Метрика audit.fallback.miss особенно полезна для обнаружения потерь аудит-событий в конфигурациях, где используются только отфильтрованные устройства.

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

Допустим, у вас есть audit-файл stronghold-audit.log, и вы хотите направлять события key/value (kv) в отдельный файл kv-audit.log.

  1. Включите file audit-устройство с фильтром по mount_type:

    stronghold audit enable                \
      -path kv-only                        \
      file                                 \
      filter='mount_type == "kv"'          \
      file_path=/logs/kv-audit.log
  2. Включите fallback-устройство:

    stronghold audit enable                \
      -path=my-fallback                    \
      -description="fallback device"       \
      file                                 \
      fallback=true                        \
      file_path=/tmp/kv-audit.fallback.log
  3. Убедитесь, что устройства включены:

    stronghold audit list --detailed
  4. Включите KV secrets engine:

    stronghold secrets enable -path my-kv kv-v2
  5. Запишите секрет:

    stronghold kv put -mount=my-kv my_secret the_value=always_angry

После этого файл kv-audit.log будет содержать записи по операциям с my-kv, а fallback-устройство перехватит записи, не попавшие под фильтр.