Falco: мониторинг контейнеров в рантайме и обнаружение подозрительной активности

0
10
Обложка статьи: Falco: мониторинг контейнеров в рантайме и обнаружение подозрительной активности

Trivy и syft проверяют образ до запуска. Falco — для другой задачи: он наблюдает за реально работающими контейнерами через системные вызовы ядра и поднимает тревогу на подозрительное поведение в момент, когда оно происходит, а не при следующем сканировании.

Статья опирается на логику направления «Мониторинг кибербезопасности» из методики зрелости Группы Сбер (источник); это методика для крупных компаний, мы используем её как ориентир и пересказываем своими словами. Проверка выполнена Falco (официальный образ) на тестовом хосте, после неё контейнеры удалены.

Что должно получиться

Уровень Что это значит на практике
2. Гигиенический Подозрительное поведение внутри работающих контейнеров (чтение чувствительных файлов, неожиданный интерактивный доступ) обнаруживается в момент события, а не постфактум по журналам приложения

Критерии сформулированы нами по мотивам методики, это ориентир, а не оценка соответствия.

Как это работает

Falco перехватывает системные вызовы на уровне ядра (через eBPF) и сверяет их с набором готовых правил — у него их несколько сотен «из коробки», написанных сообществом под типовые подозрительные действия: чтение /etc/shadow, запуск интерактивного шелла внутри контейнера, запись в системные каталоги, попытки повышения привилегий. В отличие от журналов самого приложения, Falco видит действие независимо от того, пишет ли само приложение об этом в свой журнал.

Запуск

docker run -d --name falco --privileged \
  -v /var/run/docker.sock:/host/var/run/docker.sock \
  -v /proc:/host/proc:ro \
  -v /sys/kernel/btf:/sys/kernel/btf:ro \
  -v /boot:/host/boot:ro \
  -v /lib/modules:/host/lib/modules:ro \
  -v /usr:/host/usr:ro \
  -v /etc:/host/etc:ro \
  falcosecurity/falco:latest

Важно понимать перед запуском: Falco с таким набором прав видит не только тестовый контейнер, который вы хотите проверить, а все контейнеры на хосте, включая уже работающие продуктивные нагрузки. На тестовом сервере с другими сервисами первый же запуск Falco показал предупреждение от контейнера, не имеющего отношения к тесту, — это нормальное поведение инструмента, а не ошибка, но означает, что запуск Falco на общем хосте без предупреждения команды может вызвать неожиданные находки по чужим для вас сервисам.

Результат проверки

На тестовом контейнере Alpine без специальных прав (--cap-drop=ALL) выполнены два действия, каждое проверяет своё готовое правило:

Действие Сработавшее правило Поля события
cat /etc/shadow внутри контейнера Read sensitive file untrusted file=/etc/shadow, process=cat, container_name= имя тестового контейнера

Запись события включает имя контейнера, процесс, полный путь к файлу и дерево родительских процессов — достаточно, чтобы сразу понять, что произошло и в каком контейнере, без дополнительного разбора. Это тот же класс события, что в статье про проверку auditd тестом Atomic Red Team T1003.008 — там обнаружение происходит на уровне хоста через auditd, здесь — на уровне контейнерного движка через Falco; оба способа дополняют друг друга, а не заменяют.

Порядок внедрения

  1. Предупредите команду перед первым запуском на общем хосте — Falco увидит все контейнеры, не только целевые.
  2. Начните со встроенных правил, не пишите свои с первого дня — готовый набор уже покрывает частые случаи.
  3. Настройте вывод в вашу систему журналирования (Falco умеет отправлять события по HTTP, в Kafka, в файл) — не оставляйте события только в консольном выводе контейнера.
  4. Разберите первую неделю находок и добавьте исключения для легитимных действий, которые ложно совпадают с правилами (например, сервисный процесс, которому действительно нужно читать файл, помеченный как чувствительный).
  5. Добавляйте собственные правила только после того, как освоились со встроенными — язык правил Falco позволяет описывать специфичные для вашей инфраструктуры сценарии.

Диагностика

Симптом Причина и что делать
В журнале много предупреждений о сторонних сервисах Falco по умолчанию видит весь хост. Это ожидаемо; фильтруйте вывод по контейнеру, который действительно проверяете
Предупреждения failed to create tracepoint в журнале запуска Частичное ограничение механизма дополнительной защиты (TOCTOU) в вложенной или ограниченной среде выполнения. Само обнаружение продолжает работать, сообщение информационное
Ожидаемое действие не поймано правилом Нет подходящего встроенного правила под конкретный случай. Проверьте список правил (falco --list) и, если нужно, напишите собственное
Слишком много срабатываний по легитимным действиям Типичная настройка: добавьте исключение в конкретное правило для вашего легитимного процесса, не отключайте правило целиком

Ограничения

Falco обнаруживает совпадение с правилом в момент действия — он не блокирует действие сам по себе (базовая конфигурация) и не заменяет сканирование образов до запуска. Находка Falco — сигнал для разбора, а её отсутствие не означает отсутствие проблемы: правило может быть не написано под конкретную технику, которая реально произошла.

Где это в модели зрелости

Материал относится к направлению «Мониторинг кибербезопасности» (материалы направления, карта зрелости). Уровень 2 требует обнаружения значимых событий безопасности в момент, когда они происходят: для контейнерных нагрузок Falco закрывает эту задачу там, где обычные журналы приложения могут не фиксировать подозрительное действие вовсе.

Как проверить

  1. Falco развёрнут и выводит события в общую систему журналирования, не только в консоль контейнера.
  2. Тестовое действие (например, чтение файла с паролями) корректно обнаруживается встроенным правилом.
  3. Команда предупреждена, что Falco видит весь хост, а не только целевые контейнеры.
  4. Ложные срабатывания на легитимные процессы разобраны и закрыты точечными исключениями, а не отключением правил целиком.

Источники

  • Методика оценки уровня зрелости кибербезопасности компании, Группа Сбер: sberbank.ru.
  • Документация Falco (проект CNCF): falco.org/docs.

Комментарии закрыты.