Стадия жизненного цикла модуляGeneral Availability

У модуля есть требования для установки

Включение логов для отладки

Falco

По умолчанию используется уровень логирования debug.

Falcosidekick

По умолчанию отладочное логирование выключено в Falcosidekick.

Для включения отладочного логирования установите параметр spec.settings.debugLogging в true:

apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
  name: runtime-audit-engine
spec:
  version: 1
  enabled: true
  settings:
    debugLogging: true

Просмотр метрик

Для получения метрик можно использовать PromQL-запрос falcosecurity_falcosidekick_falco_events_total{}:

d8 k -n d8-monitoring exec -it prometheus-main-0 prometheus -- \
  curl -s "http://127.0.0.1:9090/api/v1/query?query=falcosecurity_falcosidekick_falco_events_total" | jq

Уровень важности события передаётся двумя лейблами: priority содержит числовое значение, а priority_raw — название уровня строчными буквами. Для фильтрации событий по уровню важности используйте лейбл priority_raw:

priority priority_raw
8 emergency
7 alert
6 critical
5 error
4 warning
3 notice
2 informational
1 debug

Событие, пришедшее без собственного приоритета, — исключение из этой таблицы: оно экспортируется со значением priority="0" и пустым priority_raw. Prometheus отбрасывает пустой лейбл, поэтому ни один селектор по priority_raw такое событие не выбирает — в том числе событие, отправленное напрямую в приёмник falcosidekick без поля приоритета. Чтобы учитывать и такие события, фильтруйте по priority либо не фильтруйте по уровню важности вовсе.

Вместе с модулем поставляется Grafana-дашборд Runtime audit engine. Он показывает интенсивность событий по узлам, а также состояние Falco, k8s-metacollector, falcosidekick и rules-loader.

Метаданные Kubernetes в выводе событий

Вывод каждого правила типа syscall завершается неймспейсом и именем пода, в котором произошло событие:

ns=my-namespace pod=my-app-7d9f8b6c5-xk2vn

Событие syscall идентифицирует нагрузку только по идентификатору контейнера, поэтому неймспейс и имя пода Falco определяет по нему через сокет container runtime. Эти же два значения добавляются в свойство output_fields вывода в формате JSON — как k8s.ns.name и k8s.pod.name. Falcosidekick читает эти поля, поэтому метрика falcosecurity_falcosidekick_falco_events_total также передаёт их в лейблах k8s_ns_name и k8s_pod_name.

Правила типа k8sAudit это не затрагивает. Они и раньше передавали ns и pod, но берут их из самого события аудита Kubernetes.

Оба поля могут оказаться пустыми, а пустой лейбл Prometheus отбрасывает. Это происходит в двух случаях:

  • Событие возникло не в контейнере. У активности на уровне узла нет пода, который можно указать.
  • Falco ещё не получил метаданные контейнера. Они собираются асинхронно через сокет container runtime, поэтому самые первые события короткоживущего контейнера могут быть экспортированы до их получения.

Не строите PromQL-запрос на лейблах k8s_ns_name или k8s_pod_name: такой селектор молча пропускает все серии, где лейбл отсутствует, включая все события k8sAudit. Используйте эти поля для чтения события, а не для его выборки.

Если требуется обогащение, не зависящее от этого момента, обрабатывайте события через модуль security-events-manager. Он обогащает события на стороне пайплайна сборки событий, а не внутри Falco.

Эмуляция события Falco

Вы можете использовать утилиту event-generator для генерации событий Falco.

event-generator может генерировать различные подозрительные действия (syscalls, Kubernetes audit events и др.).

Вы можете использовать следующую команду для запуска тестового набора событий в кластере Kubernetes:

d8 k run falco-event-generator --image=falcosecurity/event-generator run

Образ event-generator входит в состав платформы.
Чтобы определить его путь, выполните следующую команду:

kubectl -n d8-system exec svc/deckhouse-leader -- bash -c "echo \$(deckhouse-controller module values runtime-audit-engine | yq '.registry.base')/runtime-audit-engine@\$(cat /deckhouse/downloaded/modules/900-runtime-audit-engine/images_digests.json | jq -r '.eventGenerator')"

В целях обеспечения безопасности данный образ создан без дополнительных зависимостей и предназначен для извлечения бинарного файла и его исполнения на хосте.
Чтобы извлечь бинарный файл, выполните следующие команды:

kubectl run falco-event-generator --image=$(kubectl -n d8-system exec svc/deckhouse-leader -- bash -c "echo \$(deckhouse-controller module values runtime-audit-engine | yq '.registry.base')/runtime-audit-engine@\$(cat /deckhouse/downloaded/modules/900-runtime-audit-engine/images_digests.json | jq -r '.eventGenerator')") --command -- /event-generator run
kubectl wait --for=jsonpath='{.status.phase}'=Running pod/falco-event-generator
kubectl cp falco-event-generator:event-generator ./event-generator 
kubectl delete pod falco-event-generator

Для корректного выполнения всех типов тестов событий на хосте должны быть установлены следующие пакеты или их аналоги, соответствующие конкретной операционной системе:

policykit-1 libcap-dev e2fsprogs openssh-client openssh-server nmap netcat-openbsd wget

Если вам нужно реализовать действие, воспользуйтесь руководством.

Эмуляция события Falcosidekick

Вы можете использовать Falcosidekick /test HTTP endpoint для отправки тестового события.

  • Создайте отладочное событие, выполнив команду:

    nsenter -t $(pidof falcosidekick) curl -X POST -H "Content-Type: application/json" -H "Accept: application/json" http://localhost:2801/test
  • Проверьте метрику отладочного события:

    d8 k -n d8-monitoring exec -it prometheus-main-0 prometheus -- \
      curl -s "http://127.0.0.1:9090/api/v1/query?query=falcosecurity_falcosidekick_falco_events_total" \
      | jq '.data.result.[] | select (.metric.priority_raw == "debug")'
  • Пример вывода:

    {
      "metric": {
        "__name__": "falcosecurity_falcosidekick_falco_events_total",
        "container": "kube-rbac-proxy",
        "hostname": "falcosidekick",
        "instance": "192.168.208.7:4212",
        "job": "runtime-audit-engine",
        "node": "dev-master-0",
        "priority": "1",
        "priority_raw": "debug",
        "rule": "Test rule",
        "source": "internal",
        "tier": "cluster"
      },
      "value": [
        1744234729.799,
        "1"
      ]
    }