Журналы аудита Stronghold — основной источник событий безопасности: кто, когда, с какого адреса и к какому пути обращался и с каким результатом. Для централизованного анализа передавайте их в SIEM-систему.

Общая схема:

  1. Включите одно или несколько аудит-устройств (file, syslog, socket).
  2. Соберите записи агентом доставки логов (log-shipper в Deckhouse Platform, Vector, Fluent Bit, rsyslog).
  3. Разберите JSON-записи и сопоставьте поля со схемой SIEM-системы.

Выбор аудит-устройства

Выберите аудит-устройство в зависимости от того, как SIEM-система собирает события:

УстройствоСпособ сбораОсобенности
fileАгент читает файл и отправляет записи в SIEMНаиболее предсказуемый вариант. Нужна ротация файла и контроль свободного места
syslogЛокальный syslog-агент пересылает записи в SIEMЗаписи бывают большими: используйте надёжный транспорт и дублируйте устройством file
socketStronghold отправляет записи напрямую в TCP-, UDP- или UNIX-сокет коллектораПри недоступности коллектора запросы к Stronghold могут блокироваться, по UDP возможна потеря записей

Включайте как минимум два аудит-устройства: если запись в аудит не удаётся, Stronghold может перестать обслуживать запросы. Подробнее — в разделе «Аудит в Stronghold».

Пример: файл для доставки в SIEM и syslog как резервный канал:

d8 stronghold audit enable file file_path=/var/log/stronghold_audit.log
d8 stronghold audit enable syslog tag="stronghold" facility="AUTH"

Сбор в Deckhouse Platform

В DP для доставки логов используется модуль log-shipper. Он читает логи подов и отправляет их в Elasticsearch, OpenSearch, Splunk, Logstash, Kafka, Loki, Vector или по протоколу syslog.

Чтобы log-shipper мог собрать аудит как логи подов, записи должны выводиться в стандартный поток вывода. В DP (Stronghold EE, management.mode: Automatic) аудит включается параметром enableAuditLog в ModuleConfig модуля stronghold:

spec:
  settings:
    enableAuditLog: true

Модуль сам включает аудит-устройство stronghold_audit_stdout (тип file, file_path=stdout). В EE, если параметр не задан, модуль отключает аудит. Параметр нельзя задать при management.mode: Manual; в этом случае, а также в standalone-установке, включите устройство вручную:

d8 stronghold audit enable -path=file-stdout file file_path=stdout

Пример конфигурации log-shipper, которая отправляет логи подов Stronghold в Elasticsearch:

apiVersion: deckhouse.io/v1alpha1
kind: ClusterLoggingConfig
metadata:
  name: stronghold-audit
spec:
  type: KubernetesPods
  kubernetesPods:
    namespaceSelector:
      labelSelector:
        matchLabels:
          kubernetes.io/metadata.name: d8-stronghold
  destinationRefs:
    - siem-elasticsearch
---
apiVersion: deckhouse.io/v1alpha1
kind: ClusterLogDestination
metadata:
  name: siem-elasticsearch
spec:
  type: Elasticsearch
  elasticsearch:
    endpoint: https://elasticsearch.example.com:9200
    index: stronghold-audit-%F
    auth:
      strategy: Basic
      user: stronghold
      password: <BASE64_PASSWORD>

<BASE64_PASSWORD> — пароль пользователя stronghold в Elasticsearch в кодировке base64.

В логах подов вместе с аудитом присутствуют и операционные журналы Stronghold. Отделяйте записи аудита по наличию полей type (request или response) и request.id.

Сбор вне Kubernetes

Для Stronghold на Linux используйте любой агент, который умеет читать файл с JSON-строками. Пример конфигурации Vector:

sources:
  stronghold_audit:
    type: file
    include:
      - /var/log/stronghold_audit.log

transforms:
  parse:
    type: remap
    inputs: [stronghold_audit]
    source: |
      . = parse_json!(.message)

sinks:
  siem:
    type: elasticsearch
    inputs: [parse]
    endpoints: ["https://elasticsearch.example.com:9200"]
    bulk:
      index: "stronghold-audit-%Y.%m.%d"

Пример для Fluent Bit:

[INPUT]
    Name   tail
    Path   /var/log/stronghold_audit.log
    Parser json
    Tag    stronghold.audit

[OUTPUT]
    Name   forward
    Match  stronghold.audit
    Host   siem-collector.example.com
    Port   24224

Настройте ротацию файла аудита (например, через logrotate) и после ротации отправьте Stronghold сигнал SIGHUP, чтобы он переоткрыл файл.

Подключение к SIEM-системам

Способы приёма событий для распространённых SIEM-систем:

SIEM-системаСпособ приёма
ELK / OpenSearchПрямая запись в индекс через log-shipper, Vector или Logstash; разбор JSON на стороне агента
SplunkHTTP Event Collector (HEC) с sourcetype типа _json
MaxPatrol SIEMПриём JSON-событий по syslog или из файла через агент сбора; требуется правило нормализации для формата Stronghold
KUMAКоллектор с JSON-нормализатором, приём по TCP/syslog

Сопоставление полей

Структура записей описана в разделе «Схема записей журнала аудита». Типовое сопоставление с полями SIEM:

Поле StrongholdЗначение в SIEM
timeВремя события
typeТип события: request или response
request.idИдентификатор для связи запроса и ответа
request.operationДействие: create, read, update, delete, list
request.pathОбъект доступа
request.mount_type, request.mount_pointТип и путь механизма секретов или метода аутентификации
request.namespace.pathПространство имён Stronghold
request.remote_addressIP-адрес источника
auth.display_nameИмя субъекта
auth.entity_idИдентификатор сущности
auth.policies, auth.token_policiesПрименённые политики
errorРезультат: при наличии поля — ошибка или отказ в доступе

Практические замечания:

  • Чувствительные строки (токены, значения секретов) в записях хешируются HMAC-SHA256 с солью аудит-устройства. Для сравнения значения с хешем используйте механизм audit hash того же устройства.
  • Для корреляции используйте записи response: в них есть и данные запроса, и результат.
  • Для снижения объёма используйте фильтрацию и исключение полей на отдельном аудит-устройстве, направленном в SIEM. Сохраните полный журнал на другом устройстве.
  • Примеры событий для правил корреляции: множественные ошибки аутентификации (auth/*/login с error), операции с sys/audit, sys/policies, sys/auth, использование root-токена (auth.policies содержит root).