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

Модуль собирает, агрегирует и анализирует журналы логов приложений. Использует за основу Fluentbit. По умолчанию предустановлен multiline parser для языков: go, java, python, ruby.

Если необходимо добавить собственный формат, перейдите в Кластер/Установленные сервисы. Найдите Модуль локального сбора логов.

В блоке Спецификация сервиса допишите extraObjects, содержащий необходимые манифесты.

Например:

extraObjects:
  - apiVersion: fluentbit.fluent.io/v1alpha2
    kind: ClusterFilter
    metadata:
      name: my-parser
      labels:
        fluentbit.fluent.io/enabled: "true"
    spec:
      match: "*"
      filters:
      - parser:
          keyName: log
          parser: my-regex

  - apiVersion: fluentbit.fluent.io/v1alpha2
    kind: ClusterParser
    metadata:
      name: my-regex
      labels:
        fluentbit.fluent.io/enabled: "true"
    spec:
      regex:
        timeKey: time
        timeFormat: "%d/%b/%Y:%H:%M:%S %z"
        types: "code:integer size:integer"
        regex: '^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^\"]*?)(?: +\S*)?)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*" "(?<agent>[^\"]*)")?$'

Если модуль не отображается, перейдите в Сервисы и репозитории/Доступные чарты, найдите чарт “shturval-log-operator” и нажмите “Установить”.

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

Для интеграции с SIEM необходимо из консоли подключиться к кластеру, для которого необходимо выполнить интеграцию. Для этого используйте скачивание kubeconfig из интерфейса кластера.

После подключения к консоли необходимо создать следующие кастомные ресурсы в API-группе fluentbit.fluent.io:

Добавление метадаты в фильтр:

apiVersion: fluentbit.fluent.io/v1alpha2
kind: ClusterFilter
metadata:
  labels:
    fluentbit.fluent.io/component: logging
    fluentbit.fluent.io/enabled: "true"
  name: syslog-add-metadata
spec:
  filters:
  - recordModifier:
      alias: syslog-add-metadata
      records:
      - hostname ${NODE_NAME}
      - product shturval
  matchRegex: syslog.*

Добавление в фильтр мультилайн парсера логов:

apiVersion: fluentbit.fluent.io/v1alpha2
kind: ClusterFilter
metadata:
  labels:
    fluentbit.fluent.io/component: logging
    fluentbit.fluent.io/enabled: "true"
  name: syslog-multiline
spec:
  filters:
  - multiline:
      keyContent: log
      parser: go, java, python, ruby
  match: syslog-.*

Ввод кубовых логов:

apiVersion: fluentbit.fluent.io/v1alpha2
kind: ClusterInput
metadata:
  labels:
    fluentbit.fluent.io/component: logging
    fluentbit.fluent.io/enabled: "true"
    k8slens-edit-resource-version: v1alpha2
  name: syslog-kube
spec:
  tail:
    db: /fluent-bit/tail/pos-test.db
    dbSync: Normal
    memBufLimit: 100MB
    multilineParser: cri, docker
    path: /var/log/containers/*_shturval-backend_*.log
    readFromHead: false
    refreshIntervalSeconds: 10
    skipLongLines: true
    storageType: memory
    tag: syslog-kube.*

Ввод логов событий безопасности:

apiVersion: fluentbit.fluent.io/v1alpha2
kind: ClusterInput
metadata:
  labels:
    fluentbit.fluent.io/component: logging
    fluentbit.fluent.io/enabled: "true"
    k8slens-edit-resource-version: v1alpha2
  name: syslog-kube-api-audit
spec:
  tail:
    db: /fluent-bit/tail/kube-api-audit-syslog.db
    dbSync: Normal
    memBufLimit: 50MB
    path: /var/log/kube-api-audit/audit.log
    refreshIntervalSeconds: 10
    skipLongLines: true
    tag: syslog-kaudit

Вывод кубовых логов:

В хост необходимо прописать IP-адрес хоста, в port необходимо прописать значение порта

apiVersion: fluentbit.fluent.io/v1alpha2
kind: ClusterOutput
metadata:
  labels:
    fluentbit.fluent.io/component: logging
    fluentbit.fluent.io/enabled: "true"
    k8slens-edit-resource-version: v1alpha2
  name: syslog-kube
spec:
  matchRegex: syslog-kube.*
  syslog:
    host: XX.XX.XX.XX
    mode: TCP
    port: YYY
    syslogAppnameKey: product
    syslogHostnameKey: hostname
    syslogMessageKey: log

Вывод кубовых логов событий безопасности:

В хост необходимо прописать IP-адрес хоста, в port необходимо прописать значение порта

apiVersion: fluentbit.fluent.io/v1alpha2
kind: ClusterOutput
metadata:
  labels:
    fluentbit.fluent.io/component: logging
    fluentbit.fluent.io/enabled: "true"
    k8slens-edit-resource-version: v1alpha2
  name: syslog-kube-api-audit
spec:
  matchRegex: syslog-kaudit
  syslog:
    host: XX.XX.XX.XX
    mode: TCP
    port: YYY
    syslogAppnameKey: product
    syslogHostnameKey: hostname
    syslogMessageKey: log

С дополнительной информацией можно ознакомиться на официальном сайте. В текущем релизе используется Fluentbit версии 2.2.2, версия FluentBit Operator 2.8.0

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

Fluent Operator поддерживает следующие пользовательские ресурсы (Kubernetes Custom Resources):

Kind Group Version
ClusterFilter fluentbit.fluent.io v1alpha2
ClusterFluentBitConfig fluentbit.fluent.io v1alpha2
ClusterInput fluentbit.fluent.io v1alpha2
ClusterOutput fluentbit.fluent.io v1alpha2
ClusterParser fluentbit.fluent.io v1alpha2
Collector fluentbit.fluent.io v1alpha2
FluentBit fluentbit.fluent.io v1alpha2

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

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

Это можно сделать с помощью применения манифеста в cli:

apiVersion: v1
kind: Secret
metadata:
  name: fluent-bit-output-es
type: Opaque
stringData:
  username: имя_пользователя
  password: пароль1234

Либо в интерфейсе платформы. Перейдите на страницу Кластер/Название кластера/Неймспейсы/logging/Хранилище/Secrets.

Создайте секрет с типом Opaque. В блоке Ключи создайте два ключа, где

  • Первый ключ: username, значение: имя_пользователя
  • Второй ключ: password, значение: пароль1234

Замените значения имя_пользователя и пароль1234 на валидные значения.

Перейдите в раздел Кластеры/Название Кластера/Системные сервисы/Установленные системные сервисы.

Найдите системный сервис: Модуль локального сбора логов.

В блоке спецификация системного сервиса укажите имя и порт сервера, а также имя кластера в качестве значения logstashPrefix:

fluentbit:
  output:
    es:
      enable: true
      host: хост
      port: 9200
      logstashFormat: false
      index: значение_индекса
      httpUser:
       valueFrom:
         secretKeyRef:
           key: fluent-bit-output-es
           name: username
           optional: true
      httpPassword:
       valueFrom:
         secretKeyRef:
           key: fluent-bit-output-es
           name: password
           optional: true
      suppressTypeName: true
      tls:
        verify: false
      traceError: true

Для перенаправления логов в syslog создайте манифест в формате yaml:

apiVersion: fluentbit.fluent.io/v1alpha2
kind: ClusterOutput
metadata:
  annotations:
    meta.helm.sh/release-name: shturval-log-operator
    meta.helm.sh/release-namespace: logging
  labels:
    app.kubernetes.io/managed-by: Helm
    fluentbit.fluent.io/component: logging
    fluentbit.fluent.io/enabled: "true"
  name: syslog
spec:
  match: *
  syslog:
    host: "ip_используемого_siem"
    port: 514
    mode: udp

Примените манифест с помощью команды в интерфейсе командной строки:

kubectl apply -f /путь_к_манифесту/название_манифеста.yaml