Модуль локального сбора логов (Vector)

Модуль локального сбора логов на базе Vector собирает, агрегирует и передает логи.

Vector является инструментом для обработки и передачи данных с открытым исходным кодом, написанном на Rust. В основе архитектуры Vector три основных компонента:

  • Sources (Источники) - компоненты, которые получают или собирают данные.
  • Transforms (Преобразования) - компоненты, которые изменяют или фильтруют данные.
  • Sinks (Получатели) - компоненты, которые отправляют данные во внешние системы.

Логи кластера доступны в графическом интерфейсе на вкладке Логи дашборда кластера, если выполнены условия:

  1. В кластере включен модуль локального сбора логов Vector.
  2. В кластере управления работает компонент управления модуля мониторинга Victoria Metrics Agent.

Установка модуля и базовая конфигурация

По умолчанию модуль устанавливается в клиентские кластеры и кластер управления во включенном состоянии. Для настройки конфигурации перейдите в графический интерфейс кластера, в боковом меню откройте раздел Сервисы и репозитории и перейдите на страницу Установленные сервисы, найдите Модуль локального сбора логов и нажмите Управлять.

Если в кластере модуль отсутствует, в боковом меню откройте раздел Сервисы и репозитории и перейдите на страницу Доступные чарты. На вкладке shturval выберите чарт shturval-log-collector и нажмите Установить.

Выберите необходимую версию чарта, а также неймспейс logging. После выбора версии чарта в правой части экрана отобразятся Доступные параметры конфигурации для сервиса (values). Пропишите в блоке Спецификация сервиса необходимые параметры в качестве customvalues.

Обратите внимание! Для работы модуля должен быть включен CRD для модуля сбора логов (shturval-log-collector-crds).

Для настройки модуля локального сбора логов (Vector) используется Vector Operator.

Поддерживаемые Vector Operator кастомные ресурсы (Kubernetes Custom Resources)
KindGroupVersion
ClusterVectorAggregatorobservability.kaasops.iov1alpha1
ClusterVectorPipelineobservability.kaasops.iov1alpha1
Vectorobservability.kaasops.iov1alpha1
VectorAggregatorobservability.kaasops.iov1alpha1
VectorPipelineobservability.kaasops.iov1alpha1

Базовая настройка модуля включает кастомные ресурсы ClusterVectorPipeline и Vector, определяющие его конфигурацию. Просмотреть ClusterVectorPipeline и Vector вы можете в графическом интерфейсе платформы. В вашем кластере откройте страницу Кастомные ресурсы раздела Администрирование, найдите и раскройте API-группу observability.kaasops.io. Выберите CRD ClusterVectorPipeline или Vector, на странице со списком кастомных ресурсов перейдите к манифесту объекта.

Обратите внимание! Изменение базовой настройки может привести к ошибкам сбора, агрегации и анализа логов. При необходимости задайте конфигурацию с помощью создания нового ClusterVectorPipeline.

ClusterVectorPipeline в платформе Штурвал

Модуль локального сбора логов осуществляет сбор записей журналов из стандартного потока вывода stdout системных сервисов кластера.

Преднастроенные кастомные ресурсы ClusterVectorPipeline собирают и агрегируют логи кластера в соответствии с их типами.

Кастомные ресурсы ClusterVectorPipeline
Наименование ClusterVectorPipelineОписание
k8s-logsСобирает логи контейнеров. При наличии лейбла у неймспейса shturval_tech/system-namespace логи агрегируются в k8s-logs, без указанного лейбла в k8s-user_logs
k8s-auditСобирает логи из /var/log/kube-api-audit/audit.log
k8s-eventsСобирает события из кластера Kubernetes
auditdСобирает системные логи из журнала с _TRANSPORT = audit
journaldСобирает логи: containerd, kubelet, shturvald

Источники сбора логов

Взаимодействие компонентов
Наименование компонентаСистемное название компонентаОписание
Модуль локального сбора логовshturval-log-collectorОсуществляет сбор записей журналов из стандартного потока вывода stdout системных сервисов кластера. Вычитывает записи из пути /var/log/kube-api-audit/audit.log локального хранилища
Модуль оркестрации контейнеровAPI-ServerРегистрирует запросы и записывает записи о зарегистрированных запросах в volume mount с типом hostpath /var/log/kube-api-audit/audit.log в локальное хранилище
Компонент хранения логов (кластер управления, клиентский кластер)VLogsХранит записи журналов регистрации событий. Предоставляет API для получения записей журналов событий для Vector (shturval-log-collector)
Модуль программного управления Платформой (Компонент «Авторизация»)shturval-backendПубликует события об авторизации запросов пользователей и системных учетных записей в стандартный поток вывода stdout
Модуль программного управления Платформой» (Компонент «Аутентификация»)shturval-backendОсуществляет аутентификацию пользователей в платформу “Штурвал”. Публикует записи об аутентификации в стандартный поток вывода stdout
Модуль программного управления Платформой (Компонент «Права доступа»)shturval-backendОсуществляет создание, изменение и удаление прав доступа пользователей и групп. Публикует записи о назначении, изменении и удалении прав доступа в стандартный поток вывода stdout
Среда исполнения контейнеровContainerdРегистрирует события запуска и остановки контейнеров. Публикует записи о запуске и остановке контейнеров в стандартный поток вывода stdout

Сбор и обработка логов

Для конфигурации сбора и обработки логов вы можете настроить ClusterVectorPipeline. Спецификация (spec) ClusterVectorPipeline содержит блоки:

  • sources - определяет источники данных;
  • transforms- определяет преобразования данных;
  • sinks - определяет конечные точки для отправки данных.
Пример конфигурации для обработки логов Kubernetes
apiVersion: observability.kaasops.io/v1alpha1
kind: ClusterVectorPipeline
metadata:
  name: k8s-logs
  namespace: monitoring
spec:
  # Источник данных - логи Kubernetes
  sources:
    kubernetes_logs:
      type: kubernetes_logs

  # Цепочка трансформаций
  transforms:
    # Преобразование временной метки
    remap_timestamp:
      type: remap
      inputs: [kubernetes_logs]
      source: |
        parsed_time = parse_timestamp!(.timestamp, format: "%+")
        if is_timestamp(parsed_time) {
          ."@timestamp" = parsed_time
          del(.timestamp)
        }        

    # Замена точек на подчеркивания в именах полях
    dedot_fields:
      type: remap
      inputs: [remap_timestamp]
      source: |
                . = map_keys(., recursive: true) -> |key| { replace(key, ".", "_") }

    # Фильтрация системных пространств имен
    filter_system_namespaces:
      type: filter
      inputs: [dedot_fields]
      condition: |
                exists(.kubernetes.namespace_labels."shturval_tech/system-namespace")

    # Фильтрация пользовательских пространств имен
    filter_user_namespaces:
      type: filter
      inputs: [dedot_fields]
      condition: |
                !exists(.kubernetes.namespace_labels."shturval_tech/system-namespace")

Особенности обработки логов:

  • Использует встроенный источник kubernetes_logs;
  • remap_timestamp: парсинг и преобразование временных меток;
  • dedot_fields: замена точек на подчеркивания в именах полей;
  • filter_system_namespaces и filter_user_namespaces: разделение логов по типу пространств имен.

Обратите внимание! Для применения изменений конфигурации необходимо перевести Модуль локального сбора логов (shturval-log-collector) в ручной режим управления (Manual), при выборе управления в автоматическом режиме (Auto) применяется базовая конфигурация.

Рекомендации при конфигурации

  • Используйте понятные имена для пайплайнов;
  • Следуйте единому стилю именования компонентов;
  • Выстраивайте логичную цепочку преобразований;
  • Используйте входы (inputs) для определения последовательности;
  • Фильтруйте ненужные данные как можно раньше;
  • Используйте четкие условия фильтрации;
  • Минимизируйте количество трансформаций;
  • Избегайте дублирования обработки данных.

Интеграция с SIEM

Для интеграции с системой управления информационной безопасностью и событиями безопасности SIEM в кластере должен быть включен Модуль локального сбора логов (Vector).

Чтобы настроить интеграцию, необходимо внести изменения в спецификацию (ssc) Модуля локального сбора логов.

  1. В графическом интерфейсе кластера в боковом меню откройте раздел Сервисы и репозитории и перейдите на страницу Установленные сервисы, найдите Модуль локального сбора логов (shturval-log-collector), откройте карточку модуля и в блоке Спецификация сервиса добавьте customvalues, как в приведенном примере ниже.
Пример customvalues
    shturval: 
      k8s_audit: 
        enable: true
        sinks: 
          siem: 
            type: socket
            inputs: 
            - critical_level
            address: "<ваше значение параметра>"
            mode: <ваше значение параметра>
            encoding: 
              codec: json
      journald: 
        sinks: 
          siem: 
            type: socket
            inputs: 
            - critical_level
            address: "<ваше значение параметра>"
            mode: <ваше значение параметра>
            encoding: 
              codec: json
      k8s_logs:  
        transforms: 
          filter_backend: 
            condition: |
              .kubernetes.pod_namespace == "shturval-backend" &&
              ((.kubernetes.container_name == "opa" && starts_with(string!(.kubernetes.pod_name), "shturval-backend-")) || (.kubernetes.container_name == "authn" &starts_with    (string!(.kubernetes.pod_name), "authn-")))              
            inputs: 
            - post_transforms_system_namespaces
            type: filter
        sinks: 
          siem: 
            type: socket
            inputs: 
            - filter_backend
            address: "<ваше значение параметра>"
            mode: <ваше значение параметра>
            encoding: 
              codec: json
ПараметрОписаниеТип данныхПример
addressСокет (IP-адрес и порт) SIEMstring10.11.12.13:514
modeПротокол подключенияstringudp

В приведенной спецификации в SIEM будут направлены логи: k8s_logs, journald и k8s_audit. Вы можете переопределить перечень направляемых логов. Для этого в блоке shturval удалите ненужный блок с логами.

  1. Сохраните внесенные изменения.

Vector имеет систему подтверждения доставки данных, он выполняет повторную отправку данных при некорректной доставке. Это позволяет нивелировать особенности UDP протокола.

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

Для настройки перенаправления логов выполните следующие действия:

  1. В кластере, где нужно сделать перенаправление логов, в боковом меню откройте раздел Сервисы и репозитории и перейдите на страницу Установленные сервисы, найдите и откройте Модуль локального сбора логов (shturval-log-collector).

  2. В разделе Спецификация сервиса добавьте конфигурацию shturval и укажите:

  • тип логов, которые необходимо перенаправить: auditd, journald, k8s_audit, k8s_events,k8s_logs. В блоке shturval должны быть перечислены все типы логов, для которых требуется перенаправление.
  • получателей логов в sinks и их данные для аутентификации, URL-адрес подключения, настройки TLS-соединения и буфера хранения логов до отправки.
  • при необходимости преобразования логов перед отправкой настройте конфигурацию в параметре transforms.
Пример customvalues
    shturval:
      <ваше значение>: # Тип логов для перенаправления
        enable: true # Включает отправку логов elasticsearch
        transforms: {} # Преобразование логов
        sinks: # Конечные точки для отправки данных
          elastic_logs: # Имя получателя данных
            type: <ваше значение параметра>
            auth:  # Настройки аутентификации для подключения к elasticsearch
              user: <ваше значение параметра>
              password: <ваше значение параметра>
              strategy: <ваше значение параметра>
            endpoints: # URL-адрес для подключения
              - <ваше значение параметра>
            tls: # Настройки TLS-соединения
              verify_certificate: true
            api_version: <ваше значение параметра>
            buffer: # Настройка буфера для хранения логов перед отправкой 
              max_size: <ваше значение параметра> 
              type: <ваше значение параметра>
ПараметрОписаниеТип данныхПример
metadata.nameИмя ShturvalServicePatchstringshturval-log-collector-logs
elastic_logs.typeТип получателя данныхstringelasticsearch
elastic_logs.auth.userИмя учетной записи для подключения к Elasticsearchstringusername
elastic_logs.auth.passwordПароль учетной записи для подключения к Elasticsearchstring1234qwe
elastic_logs.auth.strategyСтратегия аутентификации Elasticsearchstringbasic
elastic_logs.endpointsСписок URL-адресов для подключенияarrayhttps://elastic.bank.local:9200/
elastic_logs.api_versionВерсия API Elasticsearchstringv8
elastic_logs.buffer.max_sizeРазмер буфера для хранения логов перед отправкойint268435488
elastic_logs.buffer.typeТип буфера для хранения логов перед отправкойstringdisk
Пример перенаправления auditd
    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
    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
    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
    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
Пример перенаправления journald
    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

В syslog

Для перенаправления логов в syslog добавьте в спецификацию сервиса блок shturval с требуемыми параметрами.

Пример перенаправления в syslog
shturval:
  k8s_audit:
    sinks:
      syslog:
        type: socket 
        inputs: 
         - <ваше значение параметра>
        address: <ваше значение параметра>
        mode: <ваше значение параметра>
ПараметрОписаниеТип данныхПример
k8s_audit.sinks.syslog.inputsИмя transform в пайплайне k8s-audit; в поставляемых values — critical_levelarraycritical_level
k8s_audit.sinks.syslog.addressАдрес syslog-сервераstring11.12.13.14:5000
k8s_audit.sinks.syslog.modeТип протокола передачиstringtcp

В примере выше приведена настройка с использованием socket. С другими способами конфигурации параметров для перенаправления логов на syslog-сервер вы можете ознакомиться в официальной документации.

  1. Когда настройка спецификации модуля завершена, сохраните внесенные изменения. Потребуется некоторое время для применения изменений.

Отключить отправку логов

Если необходимо отключить отправку всех логов:

  1. В кластере в боковом меню откройте раздел Сервисы и репозитории и перейдите на страницу Установленные сервисы, найдите и откройте Модуль локального сбора логов (shturval-log-collector).

  2. В разделе Спецификация сервиса добавьте конфигурацию shturval и переопределите значение параметра platform_logs_enable в shturval с true на false, как приведено в примере.

Пример customvalues
shturval:
  platform_logs_enable: false

Если необходимо отключить отправку одного типа логов в кластере

  1. В кластере в боковом меню откройте раздел Сервисы и репозитории и перейдите на страницу Установленные сервисы, найдите и откройте Модуль локального сбора логов (shturval-log-collector).

  2. В разделе Спецификация сервиса добавьте конфигурацию shturval c типом лога и переопределите значение параметра enable с true на false, как приведено в примере.

Пример customvalues отключения логов journald
shturval:
  journald:
    enable: false