Falco event-generator: тестирование правил и бенчмаркинг

Использование

Полная документация по командной строке доступна здесь.

Список действий

$ event-generator list --all

helper.CombinedServerClient
helper.DoNothing
helper.ExecLs
helper.InboundConnection
helper.NetworkActivity
helper.OutboundConnection
helper.RunShell
k8saudit.ClusterRoleWithPodExecCreated
k8saudit.ClusterRoleWithWildcardCreated
k8saudit.ClusterRoleWithWritePrivilegesCreated
k8saudit.CreateDisallowedPod
k8saudit.CreateHostNetworkPod
k8saudit.CreateModifyConfigmapWithPrivateCredentials
k8saudit.CreateNodePortService
k8saudit.CreatePrivilegedPod
k8saudit.CreateSensitiveMountPod
k8saudit.K8SConfigMapCreated
k8saudit.K8SDeploymentCreated
k8saudit.K8SServiceCreated
k8saudit.K8SServiceaccountCreated
syscall.AddingSshKeysToAuthorizedKeys
syscall.ChangeNamespacePrivilegesViaUnshare
syscall.ChangeThreadNamespace
syscall.ClearLogActivities
syscall.ContactEC2InstanceMetadataServiceFromContainer
syscall.ContainerDriftDetectedChmod
syscall.ContainerDriftDetectedOpenCreate
syscall.CreateFilesBelowDev
syscall.CreateHardlinkOverSensitiveFiles
syscall.CreateHiddenFilesOrDirectories
syscall.CreateSymlinkOverSensitiveFiles
syscall.DbProgramSpawnedProcess
syscall.DebugfsLaunchedInPrivilegedContainer
syscall.DecodingPayloadInContainer
syscall.DeleteOrRenameShellHistory
syscall.DetectCryptoMinersUsingTheStratumProtocol
syscall.DetectReleaseAgentFileContainerEscapes
syscall.DirectoryTraversalMonitoredFileRead
syscall.DisallowedSSHConnectionNonStandardPort
syscall.DropAndExecuteNewBinaryInContainer
syscall.ExecutionFromDevShm
syscall.FilelessExecutionViaMemfdCreate
syscall.FindAwsCredentials
syscall.InterpretedProcsInboundNetworkActivity
syscall.InterpretedProcsOutboundNetworkActivity
syscall.JavaProcessClassFileDownload
syscall.KubernetesClientToolLaunchedInContainer
syscall.LaunchIngressRemoteFileCopyToolsInContainer
syscall.LaunchPackageManagementProcessInContainer
syscall.LaunchRemoteFileCopyToolsInContainer
syscall.LaunchSuspiciousNetworkToolInContainer
syscall.LaunchSuspiciousNetworkToolOnHost
syscall.MkdirBinaryDirs
syscall.ModifyBinaryDirs
syscall.ModifyContainerEntrypoint
syscall.ModifyShellConfigurationFile
syscall.MountLaunchedInPrivilegedContainer
syscall.NetcatRemoteCodeExecutionInContainer
syscall.NonSudoSetuid
syscall.PacketSocketCreatedInContainer
syscall.PolkitLocalPrivilegeEscalationVulnerabilityCVE20214034
syscall.PotentialLocalPrivilegeEscalationViaEnvironmentVariablesMisuse
syscall.ProgramRunWithDisallowedHttpProxyEnv
syscall.PtraceAntiDebugAttempt
syscall.PtraceAttachedToProcess
syscall.ReadEnvironmentVariableFromProcFiles
syscall.ReadSensitiveFileTrustedAfterStartup
syscall.ReadSensitiveFileUntrusted
syscall.ReadShellConfigurationFile
syscall.ReadSshInformation
syscall.RemoveBulkDataFromDisk
syscall.RunShellUntrusted
syscall.ScheduleCronJobs
syscall.SearchPrivateKeysOrPasswords
syscall.SetSetuidOrSetgidBit
syscall.SudoPotentialPrivilegeEscalation
syscall.SystemProcsNetworkActivity
syscall.SystemUserInteractive
syscall.UnexpectedUDPTraffic
syscall.UnprivilegedDelegationOfPageFaultsHandlingToAUserspaceProcess
syscall.UserMgmtBinaries
syscall.WriteBelowBinaryDir
syscall.WriteBelowEtc
syscall.WriteBelowMonitoredDir
syscall.WriteBelowRoot
syscall.WriteBelowRpmDatabase

Запуск действий

event-generator run [regexp]

Без аргументов запускаются все действия; если указано регулярное выражение (regular expression) — только те действия, которые ему соответствуют.

Например, чтобы запустить только действия, содержащие слово Files в названии:

$ sudo event-generator run syscall\.\*Files\.\*

INFO sleep for 100ms                               action=syscall.ReadSensitiveFileUntrusted
INFO action executed                               action=syscall.ReadSensitiveFileUntrusted
INFO sleep for 100ms                               action=syscall.CreateSymlinkOverSensitiveFiles
INFO action executed                               action=syscall.CreateSymlinkOverSensitiveFiles
INFO sleep for 100ms                               action=syscall.DirectoryTraversalMonitoredFileRead
INFO action executed                               action=syscall.DirectoryTraversalMonitoredFileRead
INFO sleep for 100ms                               action=syscall.ReadSensitiveFileTrustedAfterStartup
INFO spawn as "httpd"                              action=syscall.ReadSensitiveFileTrustedAfterStartup args="^syscall.ReadSensitiveFileUntrusted$ --sleep 6s"
INFO sleep for 6s                                  action=syscall.ReadSensitiveFileUntrusted as=httpd
INFO action executed                               action=syscall.ReadSensitiveFileUntrusted as=httpd

Полезные параметры:

  • --loop — запускать действия в цикле

  • --sleep — задать время ожидания перед каждым действием (по умолчанию 100ms)

Обратите внимание: не все действия включены по умолчанию. Чтобы запустить все действия, используйте параметр --all.

Дополнительные параметры описаны здесь.

Запуск через Docker

Запустить все события с помощью Docker-образа локально:

docker run -it --rm falcosecurity/event-generator run

Запуск в Kubernetes

Инструмент можно развернуть в кластере Kubernetes с помощью helm-чарта event-generator. Перед установкой чарта добавьте репозиторий чартов falcosecurity:

helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update

Запустить все события однократно с помощью Kubernetes Job:

helm install event-generator falcosecurity/event-generator \
  --namespace event-generator \
  --create-namespace \
  --set config.loop=false \
  --set config.actions=""

Запустить все события в цикле с помощью Kubernetes Deployment:

helm install event-generator falcosecurity/event-generator \
  --namespace event-generator \
  --create-namespace \
  --set config.actions=""

Примечание. Приведённые команды применяются к пространству имён (namespace) event-generator. Чтобы использовать другое пространство имён, укажите другое имя. События будут генерироваться в том же пространстве имён.

Коллекции

Генерация активности системных вызовов

Коллекция syscall выполняет различные подозрительные действия, обнаруживаемые стандартным набором правил Falco.

По умолчанию включены только действия для стабильных правил. Чтобы включить все остальные действия, используйте параметр --all.

$ docker run -it --rm falcosecurity/event-generator run syscall --loop

Приведённая команда работает бесконечно, непрерывно генерируя по одному тестовому событию каждые 100 миллисекунд.

Генерация активности для правил k8saudit

Примечание

Коллекция событий k8saudit в event-generator поддерживается по мере возможности и может работать не в полной мере.

Коллекция k8saudit генерирует активность, соответствующую набору правил аудита k8s.

Все действия k8saudit по умолчанию отключены. Чтобы их включить, используйте параметр --all.

$ event-generator run k8saudit --all --loop --namespace `falco-eg-sandbox`
Примечание

Указанное пространство имён должно существовать заранее.

Приведённая команда работает бесконечно: создаёт ресурсы в пространстве имён falco-eg-sandbox и удаляет их после каждой итерации.

Примечания:

  • пространство имён должно быть создано заранее;

  • чтобы команда имела эффект, необходимо включить журнал аудита Kubernetes — подробности здесь.

Тестирование правил

Начиная с версии v0.4.0 инструмент включает удобный набор интеграционных тестов для правил Falco. Команда event-generator test запускает действия и проверяет их результаты на работающем экземпляре Falco.

Примечание

Перед использованием команды необходимо установить и запустить Falco с включённым HTTP-выводом, направленным на HTTP-сервер event-generator.

Локальное тестирование (только syscall)

Чтобы протестировать действия syscall на локальном экземпляре Falco, выполните следующую команду. По умолчанию команда test запускает HTTP-сервер на localhost:8080, куда Falco отправляет оповещения:

sudo ./event-generator test syscall

Тестирование в Kubernetes

Перед выполнением следующих команд убедитесь, что репозиторий чартов falcosecurity добавлен, как описано выше.

Запустить тестирование всех событий однократно с помощью Kubernetes Job:

helm install event-generator falcosecurity/event-generator \
  --namespace event-generator \
  --create-namespace \
  --set config.command=test \
  --set config.loop=false \
  --set config.actions=""

Запустить тестирование всех событий в цикле с помощью Kubernetes Deployment:

helm install event-generator falcosecurity/event-generator \
  --namespace event-generator \
  --create-namespace \
  --set config.command=test \
  --set config.actions=""

Для тестирования событий k8saudit в Kubernetes необходимо включить функцию Kubernetes Audit Log и подключить плагин k8saudit в Falco.

Бенчмаркинг

Начиная с версии v0.5.0, event-generator можно использовать для бенчмаркинга (benchmarking) работающего экземпляра Falco. Команда event-generator bench генерирует большое количество событий в секунду (Events Per Second, EPS), позволяя оценить пропускную способность вашей установки Falco.

Запуск бенчмарка

Главное, что нужно понять перед запуском бенчмарка: параметр --sleep управляет количеством EPS (по умолчанию 250ms) — чем меньше это значение, тем выше EPS. Если задан параметр --loop, время ожидания автоматически уменьшается вдвое с каждым раундом. Параметр --pid позволяет отслеживать процесс Falco.

Примечание

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

Имейте в виду, что не все действия подходят для бенчмаркинга: некоторые из них занимают слишком много времени и не позволяют достичь высокого EPS. Например, действия k8saudit не предназначены для этого, поскольку им требуется время на создание ресурсов Kubernetes. Ряд действий syscall также делает паузы (например, syscall.ReadSensitiveFileUntrusted) и потому не подходит для этой цели.

Пример бенчмарка

Распространённый способ протестировать производительность локального экземпляра Falco — выполнить следующую команду (по умолчанию bench запускает HTTP-сервер на localhost:8080, куда Falco отправляет оповещения):

sudo event-generator bench "ChangeThreadNamespace|ReadSensitiveFileUntrusted" --all --loop --sleep 10ms --pid $(pidof -s falco)

📣 Новая команда suite

Начиная с версии v0.13, event-generator включает новую команду верхнего уровня suite, которая потребляет тестовые сценарии, описанные в YAML-файлах. Если традиционные подкоманды run, test и bench выполняют действия, реализованные на Go, то новые подкоманды suite работают с YAML-описаниями — это означает, что добавить новый сценарий можно без написания кода на Go.

Тесты группируются в наборы тестов (test suites) по правилу Falco, на которое они нацелены; отчёты формируются для каждого набора отдельно. Доступны три подкоманды:

  • event-generator suite run — выполняет действия, описанные в файле, без проверки результатов.

  • event-generator suite test — выполняет те же действия и проверяет, что работающий экземпляр Falco сгенерировал ожидаемые оповещения.

  • event-generator suite explain — документирует язык YAML-описаний, следуя иерархии свойств в схеме.

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

tests:
  - name: "Drop and execute new binary in container"
    rule: "Drop and execute new binary in container"
    description: "Testing reverse shell rule"
    runner: HostRunner
    context:
      container:
        image: image-name
        name: container-name
      processes:
        - args: "arg1 arg2"
          name: "proc0"
          exe: "arg0"
          user: user1
        - user: user2
        - user: root
          capabilities: "cap_net_admin,cap_net_bind_service,cap_chown=ep"
    resources:
      - type: clientServer
        name: cs1
        l4Proto: "%{item.l4Proto}"
        address: "%{item.address}"
    steps:
      - type: syscall
        name: d1
        syscall: dup2
        args:
          oldFd: "${cs1.client.fd}"
          newFd: 0
    expectedOutcome:
      source: "syscall"
    cases:
      - strategy: matrix
        values:
          l4Proto: ["tcp4", "udp4"]
          address: ["11.0.0.1:80"]
      - strategy: vector
        values:
          l4Proto: "unix"
          address: ""

Полное описание языка YAML доступно в справочнике по YAML-описаниям. Рабочие примеры, охватывающие каждую возможность, находятся в каталоге samples/.

Часто задаваемые вопросы

Какие тестовые события умеет генерировать этот инструмент?

Можно ли внести вклад, добавив новые события?

Конечно!

Ознакомьтесь с соглашениями реестра событий, после чего смело открывайте pull request!

Любой вклад высоко ценится.

Можно ли использовать этот проект как библиотеку?

Проект предоставляет три основных пакета, которые можно импортировать и использовать по отдельности:

  • /cmd — реализация интерфейса командной строки (CLI)

  • /events — реестр событий

  • /pkg/runner — реализации исполнителей (runners) действий

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

Благодарности

Отдельная благодарность Марку Стемму (@mstemm) — автору первого генератора событий.

© 2026 meganuke