Gymterview
senior

Что такое Runtime Security и как работает Falco?

Runtime Security — обнаружение и реагирование на аномальное поведение контейнеров в реальном времени, то есть непосредственно во время их работы. В отличие от сканирования образов (подход shift-left, который выявляет уязвимости до деплоя), runtime security работает на этапе выполнения и обнаруживает атаки, которые невозможно выявить статическим анализом: запуск неожиданных процессов, доступ к конфиденциальным файлам, аномальные сетевые подключения.

Falco (CNCF graduated project) — ведущий open-source инструмент runtime security для контейнеров и Kubernetes, разработанный компанией Sysdig.

Принцип работы Falco:

  1. Перехват системных вызовов — Falco подключается к ядру Linux через eBPF (рекомендуемый способ) или загружаемый kernel module. Каждый системный вызов (open, execve, connect, write и др.) из каждого контейнера проходит через Falco.
  2. Анализ по правилам — каждый перехваченный вызов сопоставляется с набором правил, написанных на языке условий Falco. Правила описывают нормальное и аномальное поведение.
  3. Генерация оповещений — при совпадении с правилом Falco создаёт событие с указанием severity, деталей процесса, контейнера и namespace.

Установка Falco в Kubernetes через Helm:

Пример
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update
helm install falco falcosecurity/falco \
    --namespace falco \
    --create-namespace \
    --set driver.kind=ebpf \
    --set falcosidekick.enabled=true \
    --set falcosidekick.config.slack.webhookurl="https://hooks.slack.com/..."

Параметр driver.kind=ebpf указывает использовать eBPF вместо kernel module. eBPF безопаснее и не требует установки дополнительных модулей ядра, но требует ядро Linux 5.8+.

Примеры правил Falco:

Пример
# Обнаружение запуска shell в контейнере
# (в production-контейнере не должно запускаться интерактивных оболочек)
- rule: Terminal shell in container
  desc: A shell was used as the entrypoint/exec into a container
  condition: >
    spawned_process and container
    and shell_procs
    and proc.pname exists
    and not proc.pname in (shell_binaries)
  output: >
    Shell spawned in container
    (user=%user.name user_loginuid=%user.loginuid
    container_id=%container.id container_name=%container.name
    shell=%proc.name parent=%proc.pname cmdline=%proc.cmdline
    image=%container.image.repository)
  priority: WARNING
  tags: [container, shell, mitre_execution]

# Обнаружение чтения чувствительных файлов
- rule: Read sensitive file in container
  desc: Attempt to read sensitive files (e.g., /etc/shadow)
  condition: >
    sensitive_files and open_read
    and container
    and not proc.name in (allowed_sensitive_readers)
  output: >
    Sensitive file opened for reading in container
    (user=%user.name file=%fd.name container=%container.name
    image=%container.image.repository)
  priority: WARNING

# Обнаружение исходящих подключений к нестандартным портам
- rule: Unexpected outbound connection
  desc: Container making unexpected outbound network connection
  condition: >
    outbound and container
    and not fd.sport in (80, 443, 8080, 8443, 5432, 9092, 6379)
    and not k8s.ns.name = "kube-system"
  output: >
    Unexpected outbound connection from container
    (command=%proc.cmdline connection=%fd.name
    container=%container.name image=%container.image.repository
    namespace=%k8s.ns.name)
  priority: NOTICE

# Обнаружение записи в директорию /etc
- rule: Write below etc
  desc: Attempt to write to /etc directory in container
  condition: >
    write_etc_common and container
  output: >
    File below /etc opened for writing in container
    (user=%user.name file=%fd.name container=%container.name
    image=%container.image.repository)
  priority: ERROR

# Обнаружение запуска криптомайнера
- rule: Detect crypto miners
  desc: Detect common crypto mining processes
  condition: >
    spawned_process and container
    and (proc.name in (xmrig, minergate, minerd, cpuminer)
    or proc.cmdline contains "stratum+tcp")
  output: >
    Crypto mining process detected in container
    (user=%user.name process=%proc.name container=%container.name
    image=%container.image.repository)
  priority: CRITICAL

Каждое правило содержит: condition (условие срабатывания на языке фильтров Falco), output (шаблон сообщения с макросами для подстановки контекста), priority (уровень критичности от DEBUG до CRITICAL) и tags (метки для группировки и фильтрации).

Falcosidekick — маршрутизация оповещений:

Falcosidekick принимает оповещения от Falco и маршрутизирует их в различные целевые системы: мессенджеры, SIEM, системы мониторинга, хранилища логов:

Пример
# values.yaml для Falcosidekick
falcosidekick:
  config:
    slack:
      webhookurl: "https://hooks.slack.com/services/..."
      minimumpriority: "warning"
    elasticsearch:
      hostport: "http://elasticsearch:9200"
      index: "falco"
    prometheus:
      enabled: true
    # Автоматическая реакция: создание Policy Report при инцидентах
    kubernetesPolicyReport:
      enabled: true

Falcosidekick поддерживает более 50 целевых систем, включая Slack, PagerDuty, Elasticsearch, Kafka, AWS SNS, Prometheus и другие.

Типичные инциденты, обнаруживаемые Falco в банковских системах:

Инцидент Severity Рекомендуемое действие
Запуск shell (/bin/sh, /bin/bash) в production-контейнере WARNING Уведомление в SOC (Security Operations Center)
Чтение /etc/shadow или других чувствительных файлов ERROR Уведомление + немедленное расследование инцидента
Запуск процесса, не являющегося entrypoint NOTICE Логирование и анализ
Исходящее подключение к неизвестному IP/порту WARNING Уведомление + проверка на эксфильтрацию данных
Модификация бинарных файлов приложения CRITICAL Уведомление + автоматическое удаление пода
Обнаружение криптомайнера CRITICAL Немедленная эскалация, удаление пода, расследование вектора компрометации

Альтернативы Falco: Sysdig Secure (коммерческая версия от тех же разработчиков), Aqua Security, Prisma Cloud (Palo Alto Networks).