Как настроить сбор и перенаправление логов

Общая схема настройки логов

Логи собирает модуль локального сбора логов shturval-log-collector на базе Vector. Модуль устанавливается из чарта shturval-log-collector в неймспейс logging, а его параметры передаются в Helm через customvalues.

Для настройки отправки логов во внешнее хранилище, syslog или SIEM используйте ShturvalServicePatch. ShturvalServicePatch переопределяет customvalues сервиса shturval-log-collector и позволяет добавить новые sinks и transforms без ручной правки системных ClusterVectorPipeline.

Для отправки логов в SIEM используйте инструкцию: Экспорт логов безопасности во внешние системы.

Минимальный порядок настройки:

  1. Убедитесь, что в кластере установлен CRD-чарт shturval-log-collector-crds и shturval-log-collector в неймспейсе logging в режиме Авто.
  2. Проверьте базовый сбор логов: на дашборде кластера должна быть доступна вкладка Логи.
  3. Подготовьте манифест ShturvalServicePatch с нужными параметрами.
  4. Загрузите его через функциональность импорта манифестов в GUI.
  5. Дождитесь применения изменений и проверьте статус на странице сервиса.

После применения ShturvalServicePatch:

  • на вкладке Сервис модуля локального сбора логов статус переходит в Patched;
  • на вкладке Применённые ShturvalServicePatch отображается список примененных ShturvalServicePatch.
Скриншоты загрузки манифеста и статус сервиса

Статус Patched на вкладке сервиса

Применённые ShturvalServicePatch

Список ShturvalServicePatch

Детали применённого патча

Перенаправление логов во внешнее хранилище

Сценарий: нужно перенаправить один или несколько типов логов во внешнее хранилище (например, Elasticsearch/OpenSearch), сохранив при этом локальное хранение в VictoriaLogs.

Общий шаблон ShturvalServicePatch

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-log-collector
  customvalues:
    shturval:
      <тип_логов>:        # auditd, journald, k8s_audit, k8s_events, k8s_logs
        enable: true      # Включает отправку логов
        transforms: {}    # Преобразование логов (опционально)
        sinks:            # Конечные точки для отправки данных
          elastic_bank:   # Имя получателя данных
            type: <тип_sink>   # например: elasticsearch
            auth:               # Настройки аутентификации
              user: <user>
              password: <password>
              strategy: <strategy>
            endpoints:          # URL-адрес(а) подключения
              - <endpoint>
            tls:                # Настройки TLS-соединения
              verify_certificate: true
            api_version: <version>
            buffer:             # Буфер для хранения логов перед отправкой
              max_size: <size>
              type: <buffer_type>

Расшифровка ключевых полей:

Параметр Описание Тип данных Пример
metadata.name Имя ShturvalServicePatch string shturval-log-collector-logs
elastic_bank.type Тип sink; в примерах ключ получателя назван elastic_bank, в sinks допустимы другие имена string elasticsearch
elastic_bank.auth.user Имя учётной записи для подключения string username
elastic_bank.auth.password Пароль учётной записи string 1234qwe
elastic_bank.auth.strategy Стратегия аутентификации string basic
elastic_bank.endpoints Список URL-адресов для подключения array https://external-opensearch.address:9200/
elastic_bank.api_version Версия API внешнего хранилища string v8
elastic_bank.buffer.max_size Размер буфера для хранения логов перед отправкой int 268435488
elastic_bank.buffer.type Тип буфера string disk

Примеры перенаправления

Ниже приведены примеры для всех типов логов. Структура аналогична — меняется имя ключа под shturval:, значение inputs и префикс индекса.

auditd

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: shturval-log-collector-auditd
spec:
  shturvalServiceConfigName: shturval-log-collector
  customvalues:
    shturval:
      auditd:
        sinks:
          elastic_bank:
            type: elasticsearch
            inputs:
              - auditd
            bulk:
              index: "{{ .Values.CLUSTER_NAME }}_auditd-%Y.%m.%d"
            auth:
              user: my_username
              password: "my_password"
              strategy: basic
            endpoints:
              - "https://external-opensearch.address:9200"
            tls:
              verify_certificate: false
            api_version: "v8"
            buffer:
              max_size: 268435488
              type: disk

k8s_audit

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: shturval-log-collector-kaudit
spec:
  shturvalServiceConfigName: shturval-log-collector
  customvalues:
    shturval:
      k8s_audit:
        sinks:
          elastic_bank:
            type: elasticsearch
            inputs:
              - critical_level
            bulk:
              index: "{{ .Values.CLUSTER_NAME }}_kaudit-%Y.%m.%d"
            auth:
              user: my_username
              password: "my_password"
              strategy: basic
            endpoints:
              - "https://external-opensearch.address:9200"
            tls:
              verify_certificate: false
            api_version: "v8"
            buffer:
              max_size: 268435488
              type: disk

k8s_events

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: shturval-log-collector-kevents
spec:
  shturvalServiceConfigName: shturval-log-collector
  customvalues:
    shturval:
      k8s_events:
        sinks:
          elastic_bank:
            type: elasticsearch
            inputs:
              - delete_managed_fields
            bulk:
              index: "{{ .Values.CLUSTER_NAME }}_events-%Y.%m.%d"
            auth:
              user: my_username
              password: "my_password"
              strategy: basic
            endpoints:
              - "https://external-opensearch.address:9200"
            tls:
              verify_certificate: false
            api_version: "v8"
            buffer:
              max_size: 268435488
              type: disk

k8s_logs (с разделением неймспейсов)

При отправке логов Kubernetes в Elasticsearch/OpenSearch поле message после transform post_transforms_system_namespaces или post_transforms_user_namespaces может содержать структурированный объект — например, если контейнер пишет JSON (логи аутентификации authn с полями username, result, security_event_type и т. д.). VictoriaLogs индексирует такие поля и логи аутентификации отображаются на вкладке Логи кластера. Sink Elasticsearch ожидает строковое значение в поле message, поэтому без дополнительного преобразования часть событий может не попадать в индекс или не находиться при поиске в Elasticsearch/OpenSearch.

Добавьте transforms типа remap с encode_json(.message) и укажите их в inputs sinks вместо post_transforms_* напрямую. Имена transforms могут быть любыми, в примере ниже — system_namespaces_message_encode и user_namespaces_message_encode.

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: shturval-log-collector-klogs
spec:
  shturvalServiceConfigName: shturval-log-collector
  customvalues:
    shturval:
      k8s_logs:
        transforms:
          system_namespaces_message_encode:
            type: remap
            inputs:
              - post_transforms_system_namespaces
            source: |
              .message =
                encode_json(.message)              
          user_namespaces_message_encode:
            type: remap
            inputs:
              - post_transforms_user_namespaces
            source: |
              .message =
                encode_json(.message)              
        sinks:
          elastic_bank:
            type: elasticsearch
            inputs:
              - system_namespaces_message_encode
            bulk:
              index: "{{ .Values.CLUSTER_NAME }}_logs-%Y.%m.%d"
            auth:
              user: my_username
              password: "my_password"
              strategy: basic
            endpoints:
              - "https://external-opensearch.address:9200"
            tls:
              verify_certificate: false
            api_version: "v8"
            buffer:
              max_size: 268435488
              type: disk
          user-namespaces:
            type: elasticsearch
            inputs:
              - user_namespaces_message_encode
            bulk:
              index: "{{ .Values.CLUSTER_NAME }}_user-logs-%Y.%m.%d"
            auth:
              user: my_username
              password: "my_password"
              strategy: basic
            endpoints:
              - "https://external-opensearch.address:9200"
            tls:
              verify_certificate: false
            api_version: "v8"
            buffer:
              max_size: 268435488
              type: disk

Отдельный sink для пользовательских неймспейсов подключается к transform user_namespaces_message_encode (или аналогичному), который читает данные из post_transforms_user_namespaces. Второй поток в values может быть отключён.

После применения патча проверьте доставку логов во внешнем хранилище. Для событий входа в GUI ищите записи контейнера authn в неймспейсе shturval-backend с security_event_type: authentication и текстом login / logout внутри message.

journald

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: shturval-log-collector-journald
spec:
  shturvalServiceConfigName: shturval-log-collector
  customvalues:
    shturval:
      journald:
        sinks:
          elastic_bank:
            type: elasticsearch
            inputs:
              - journald
            bulk:
              index: "{{ .Values.CLUSTER_NAME }}_journald-%Y.%m.%d"
            auth:
              user: my_username
              password: "my_password"
              strategy: basic
            endpoints:
              - "https://external-opensearch.address:9200"
            tls:
              verify_certificate: false
            api_version: "v8"
            buffer:
              max_size: 268435488
              type: disk

Скриншот: патч для перенаправления auditd

Иллюстрация: Скриншот: патч для перенаправления auditd

Патч auditd

Перенаправление логов в syslog

Для перенаправления логов в syslog-сервер также используется ShturvalServicePatch. В примере ниже перенаправляются логи k8s_audit в syslog через sink типа socket:

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: shturval-log-collector-syslog
spec:
  shturvalServiceConfigName: shturval-log-collector
  customvalues:
    shturval:
      k8s_audit:
        sinks:
          syslog:
            type: socket
            inputs:
              - critical_level
            address: "11.12.13.14:5000"
            mode: tcp
            encoding:
              codec: syslog
              syslog:
                rfc: rfc5424

Параметры syslog-sink:

Параметр Описание Тип данных Пример
k8s_audit.sinks.syslog.inputs Имя transform в пайплайне k8s-audit; в поставляемых values — critical_level array critical_level
k8s_audit.sinks.syslog.address Адрес syslog-сервера string 11.12.13.14:5000
k8s_audit.sinks.syslog.mode Тип протокола передачи string tcp
k8s_audit.sinks.syslog.encoding.codec Кодек форматирования: syslog — RFC-формат, json — JSON over socket string syslog
k8s_audit.sinks.syslog.encoding.syslog.rfc Стандарт RFC: rfc5424 (современный, по умолчанию) или rfc3164 (legacy) string rfc5424

Скриншот: патч syslog

Патч syslog Параметры encoding.syslog соответствуют socket sink в документации Vector.

Проверка конфигурации

После применения ShturvalServicePatch убедитесь, что конфигурация корректна и логи доставляются.

Шаг 1. Проверить имена transforms в пайплайне

Имя узла в поле inputs должно совпадать с именем существующего transform в пайплайне. Например, для k8s-audit:

  1. Перейдите в АдминистрированиеКастомные ресурсы.
  2. Выберите API-группу observability.kaasops.io и ресурс ClusterVectorPipeline.
  3. Откройте манифест пайплайна (например, k8s-audit) и в блоке spec.transforms найдите нужное имя (обычно critical_level).

Через CLI:

kubectl get clustervectorpipeline k8s-audit -o jsonpath='{.spec.transforms}' | jq 'keys'

Шаг 2. Проверить статус патча

  1. Перейдите в Сервисы и репозиторииУстановленные сервисыМодуль локального сбора логов.
  2. Статус сервиса должен измениться на Patched.
  3. На вкладке Применённые ShturvalServicePatch должен отображаться ваш патч.

Шаг 3. Проверить конфигурацию Vector

Проверьте логи подов Vector на наличие ошибок (например, unknown input или inputs references unknown component, если указано неверное имя в inputs):

kubectl logs -n logging -l app.kubernetes.io/name=vector --tail=100

Если доступен файл конфигурации внутри пода, можно запустить встроенную валидацию:

kubectl exec -n logging deploy/vector -- vector validate /etc/vector/vector.yaml

Шаг 4. Проверить доставку на стороне приёмника

Убедитесь, что syslog-сервер получает сообщения. При использовании encoding.codec: syslog сообщения должны приходить в формате RFC 5424 (или RFC 3164, если настроено). Обратите внимание, что при использовании протокола UDP (mode: udp) доставка не гарантируется; для критичных данных в production рекомендуется использовать TCP.