Что такое Runtime Security и как работает Falco?
Runtime Security — обнаружение и реагирование на аномальное поведение контейнеров в реальном времени, то есть непосредственно во время их работы. В отличие от сканирования образов (подход shift-left, который выявляет уязвимости до деплоя), runtime security работает на этапе выполнения и обнаруживает атаки, которые невозможно выявить статическим анализом: запуск неожиданных процессов, доступ к конфиденциальным файлам, аномальные сетевые подключения.
Falco (CNCF graduated project) — ведущий open-source инструмент runtime security для контейнеров и Kubernetes, разработанный компанией Sysdig.
Принцип работы Falco:
- Перехват системных вызовов — Falco подключается к ядру Linux через eBPF (рекомендуемый способ) или загружаемый kernel module. Каждый системный вызов (open, execve, connect, write и др.) из каждого контейнера проходит через Falco.
- Анализ по правилам — каждый перехваченный вызов сопоставляется с набором правил, написанных на языке условий Falco. Правила описывают нормальное и аномальное поведение.
- Генерация оповещений — при совпадении с правилом 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).