Экспорт логов безопасности во внешние системы

Интеграция с внешними системами мониторинга безопасности.

Введение

Для интеграции с SIEM в кластере должен быть включён Модуль локального сбора логов (Vector, shturval-log-collector). Перенаправление логов настраивается через ShturvalServicePatch, который применяется к спецификации сервиса shturval-log-collector; общий порядок работы с custom values описан в разделе Как управлять CustomValues сервисов.

Vector использует:

  • sources — источники данных;
  • transforms — преобразование и фильтрацию данных;
  • sinks — получателей, в которые отправляются логи.

Какие логи можно отправлять

В customvalues.shturval укажите типы логов, которые нужно перенаправлять. Поддерживаются:

  • auditd — системные логи аудита;
  • journald — логи containerd, kubelet, shturvald;
  • k8s_audit — логи аудита API Kubernetes;
  • k8s_events — события Kubernetes;
  • k8s_logs — логи контейнеров.

В блоке shturval должны быть перечислены все типы логов, для которых требуется перенаправление. Для каждого типа логов задайте получателей в sinks. Если требуется изменить записи перед отправкой, настройте transforms.


Общий порядок настройки

  1. Подготовьте ShturvalServicePatch для shturval-log-collector.
  2. В customvalues.shturval укажите типы логов, transforms при необходимости и sinks с параметрами подключения.
  3. Загрузите манифест в кластере через импорт манифестов.
  4. Дождитесь применения изменений.

Отправка в SIEM через socket

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

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-log-collector
  customvalues:
    shturval:
      k8s_audit:
        enable: true
        sinks:
          siem:
            type: socket
            inputs:
              - dedot_specific_fields
            address: "<ваше значение параметра>"
            mode: <ваше значение параметра>
            encoding:
              codec: json
      journald:
        sinks:
          siem:
            type: socket
            inputs:
              - journald
            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:
              - filter_system_namespaces
            type: filter
        sinks:
          siem:
            type: socket
            inputs:
              - filter_backend
            address: "<ваше значение параметра>"
            mode: <ваше значение параметра>
            encoding:
              codec: json
Параметр Описание Тип данных Пример
metadata.name Имя ShturvalServicePatch string shturval-log-collector-siem
address Сокет SIEM: IP-адрес и порт string 10.11.12.13:514
mode Протокол подключения string udp

Vector поддерживает подтверждение доставки данных. При некорректной доставке выполняется повторная отправка, что позволяет снизить влияние особенностей UDP-протокола.


Отправка в 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
              - post_transforms_user_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:
              - parse_kube_audit
            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:
              - delete_managed_fields
            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:
              - journald
            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 в кластере через импорт манифестов. После загрузки потребуется некоторое время для применения изменений.


Отправка в Elasticsearch или OpenSearch

Общий шаблон

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: <имя ресурса>
spec:
  shturvalServiceConfigName: shturval-log-collector
  customvalues:
    shturval:
      <ваше значение>: # Тип логов для перенаправления
        enable: true
        transforms: {}
        sinks:
          elastic_bank:
            type: <ваше значение параметра>
            auth:
              user: <ваше значение параметра>
              password: <ваше значение параметра>
              strategy: <ваше значение параметра>
            endpoints:
              - <ваше значение параметра>
            tls:
              verify_certificate: true
            api_version: <ваше значение параметра>
            buffer:
              max_size: <ваше значение параметра>
              type: <ваше значение параметра>
Параметр Описание Тип данных Пример
metadata.name Имя ShturvalServicePatch string shturval-log-collector-logs
elastic_bank.type Тип получателя данных string elasticsearch
elastic_bank.auth.user Имя учётной записи для подключения к Elasticsearch string username
elastic_bank.auth.password Пароль учётной записи для подключения к Elasticsearch string 1234qwe
elastic_bank.auth.strategy Стратегия аутентификации Elasticsearch string basic
elastic_bank.endpoints Список URL-адресов для подключения array https://elastic.bank.local:9200/
elastic_bank.api_version Версия API Elasticsearch string v8
elastic_bank.buffer.max_size Размер буфера для хранения логов перед отправкой int 268435488
elastic_bank.buffer.type Тип буфера для хранения логов перед отправкой string disk

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:
              - dedot_specific_fields
            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

apiVersion: ops.shturval.tech/v1beta2
kind: ShturvalServicePatch
metadata:
  name: shturval-log-collector-klogs
spec:
  shturvalServiceConfigName: shturval-log-collector
  customvalues:
    shturval:
      k8s_logs:
        sinks:
          elastic_bank:
            type: elasticsearch
            inputs:
              - post_transforms_system_namespaces
            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:
            inputs:
              - post_transforms_system_namespaces
            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

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

Отправка в syslog

Для перенаправления логов в syslog подготовьте ShturvalServicePatch для shturval-log-collector и добавьте в customvalues блок shturval с требуемыми параметрами.

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:
              - <ваше значение параметра>
            address: <ваше значение параметра>
            mode: <ваше значение параметра>
Параметр Описание Тип данных Пример
k8s_audit.sinks.syslog.inputs Преобразования (transforms) для логов k8s_audit. Перечень transforms определён в ClusterVectorPipeline с именем k8s-audit. array dedot_specific_fields
k8s_audit.sinks.syslog.address Адрес syslog-сервера string 11.12.13.14:5000
k8s_audit.sinks.syslog.mode Тип протокола передачи string tcp

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


Загрузка манифеста

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

Скриншот: импорт ShturvalServicePatch для SIEM

Импорт ShturvalServicePatch для SIEM

Скриншот: импорт ShturvalServicePatch для перенаправления логов

Импорт ShturvalServicePatch для перенаправления логов

Скриншот: импорт ShturvalServicePatch для syslog

Импорт ShturvalServicePatch для syslog

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


Проверка применения

Чтобы проверить, что ShturvalServicePatch применён:

  1. В кластере откройте раздел Сервисы и репозитории.
  2. Перейдите на страницу Установленные сервисы.
  3. Найдите Модуль локального сбора логов (shturval-log-collector) и откройте управление сервисом.
  4. Проверьте вкладку Сервис: после применения патча статус должен обновиться до Patched.
  5. Проверьте вкладку Примененные ShturvalServicePatch: в списке должен отображаться загруженный ShturvalServicePatch.
Скриншоты: применённый ShturvalServicePatch

Статус Patched

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


См. также