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

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

Логи собирает модуль локального сбора логов 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

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

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

Сценарий: нужно перенаправить один или несколько типов логов во внешнее хранилище (например, 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_logs:   # Имя получателя данных
            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_logs.type Тип sink; в примерах ключ получателя назван elastic_logs, в sinks допустимы другие имена string elasticsearch
elastic_logs.auth.user Имя учётной записи для подключения string username
elastic_logs.auth.password Пароль учётной записи string 1234qwe
elastic_logs.auth.strategy Стратегия аутентификации string basic
elastic_logs.endpoints Список URL-адресов для подключения array https://external-elastic.address:9200/
elastic_logs.api_version Версия API внешнего хранилища string v8
elastic_logs.buffer.max_size Размер буфера для хранения логов перед отправкой int 268435488
elastic_logs.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_logs:
            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-elastic.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_logs:
            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-elastic.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_logs:
            type: elasticsearch
            inputs:
              - critical_level
            bulk:
              index: "{{ .Values.CLUSTER_NAME }}_events-%Y.%m.%d"
            auth:
              user: my_username
              password: "my_password"
              strategy: basic
            endpoints:
              - "https://external-elastic.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_logs:
            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-elastic.address:9200"
            tls:
              verify_certificate: false
            api_version: "v8"
            buffer:
              max_size: 268435488
              type: disk
          elastic_user_logs:
            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-elastic.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_logs:
            type: elasticsearch
            inputs:
              - critical_level
            bulk:
              index: "{{ .Values.CLUSTER_NAME }}_journald-%Y.%m.%d"
            auth:
              user: my_username
              password: "my_password"
              strategy: basic
            endpoints:
              - "https://external-elastic.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.

Отправка в Loki

Подготовьте ShturvalServicePatch для применения к спецификации ssc Модуля локального сбора логов (shturval-log-collector). В customvalues добавьте блок shturval с требуемыми параметрами.

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: shturval-log-collector-logs-to-loki
spec:
  shturvalServiceConfigName: shturval-log-collector
  customvalues:
    shturval:
      platform_logs_enable: true
      k8s_logs:
        enable: true
        sinks:
          loki_external:
            type: loki
            inputs:
              - post_transforms_system_namespaces
            endpoint: <ваше значение параметра>
            path: /loki/api/v1/push
            compression: snappy
            tenant_id: "<ваше значение параметра>"
            encoding:
              codec: json
            tls:
              verify_certificate: false
            labels:
              __tenant_id__: "<ваше значение параметра>"
              resourceRealm: "<ваше значение параметра>"
              log_type: "kubernetes"
      k8s_audit:
        enable: true
        sinks:
          loki_external:
            type: loki
            inputs:
              - critical_level
            endpoint: <ваше значение параметра>
            path: /loki/api/v1/push
            compression: snappy
            tenant_id: "<ваше значение параметра>"
            encoding:
              codec: json
            tls:
              verify_certificate: false
            labels:
              __tenant_id__: "<ваше значение параметра>"
              resourceRealm: "<ваше значение параметра>"
              log_type: "k8s_audit"
      k8s_events:
        enable: true
        sinks:
          loki_external:
            type: loki
            inputs:
              - critical_level
            endpoint: <ваше значение параметра>
            path: /loki/api/v1/push
            compression: snappy
            tenant_id: "<ваше значение параметра>"
            encoding:
              codec: json
            tls:
              verify_certificate: false
            labels:
              __tenant_id__: "<ваше значение параметра>"
              resourceRealm: "<ваше значение параметра>"
              log_type: "k8s_events"
      journald:
        enable: true
        sinks:
          loki_external:
            type: loki
            inputs:
              - critical_level
            endpoint: <ваше значение параметра>
            path: /loki/api/v1/push
            compression: snappy
            tenant_id: "<ваше значение параметра>"
            encoding:
              codec: json
            tls:
              verify_certificate: false
            labels:
              __tenant_id__: "<ваше значение параметра>"
              resourceRealm: "<ваше значение параметра>"
              log_type: "journald"
      auditd:
        enable: true
        sinks:
          loki_external:
            type: loki
            inputs:
              - auditd
            endpoint: <ваше значение параметра>
            path: /loki/api/v1/push
            compression: snappy
            tenant_id: "<ваше значение параметра>"
            encoding:
              codec: json
            tls:
              verify_certificate: false
            labels:
              __tenant_id__: "<ваше значение параметра>"
              resourceRealm: "<ваше значение параметра>"
              log_type: "auditd"
Параметр Описание Тип данных Пример
metadata.name Имя ShturvalServicePatch string shturval-log-collector-logs-to-loki
platform_logs_enable Включает отправку логов платформы boolean true
<тип логов>.enable Включает отправку выбранного типа логов: auditd, journald, k8s_audit, k8s_events, k8s_logs boolean true
loki_external.type Тип получателя данных string loki
loki_external.inputs Список источников или преобразований логов для отправки в Loki array post_transforms_system_namespaces
loki_external.endpoint URL-адрес Loki string https://loki.example.com
loki_external.path Путь API для отправки логов в Loki string /loki/api/v1/push
loki_external.compression Алгоритм сжатия данных перед отправкой string snappy
loki_external.tenant_id Идентификатор тенанта в Loki string tenant-example
loki_external.encoding.codec Формат кодирования логов string json
loki_external.tls.verify_certificate Проверка TLS-сертификата при подключении boolean false
loki_external.labels.__tenant_id__ Лейбл тенанта для записей логов string tenant-example
loki_external.labels.resourceRealm Лейбл окружения или кластера, из которого отправляются логи string cluster-example
loki_external.labels.log_type Лейбл типа логов string kubernetes

В примере выше в Loki будут направлены логи: auditd, journald, k8s_audit, k8s_events и k8s_logs. Чтобы изменить перечень направляемых логов, удалите ненужный блок с типом логов из shturval.

Загрузите подготовленный ShturvalServicePatch в кластере через импорт манифестов. После загрузки потребуется некоторое время для применения изменений.

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

После применения 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.