Перейти к основному содержимому
Версия: 4.5.X

eBPF

Конфигурация

Конфигурация eBPF-коллектора во многом схожа с конфигурациями прочих коллекторов, различие состоит лишь в блоке collector:

collector:
type: ebpf
value:
# Размер буфера perf buffer в eBPF. Должен быть степенью двойки.
perf-buffer-size: 1024
# Настройки, относящиеся к событиям контейнерных сред.
containers:
# Использовать сокеты сред для запуска контейнеров для обогащения событий, относящихся к контейнерам.
enrich-with-container-info: false
# Настройки конкретной среды запуска контейнеров (имя и путь к сокету).
# Пример:
# - name: docker
# socket: /var/run/docker.sock
runtimes: []
# Настройки, относящиеся к кэшированию событий eBPF и помогающие снизить потери в ядре при высоком количестве событий.
cache:
# Тип кэширования: none (отсутствует), memory (кэш в оперативной памяти)
type: none
# Размер кэша в мегабайтах.
size: 0
# Настройки, относящиеся к системе возможностей Linux. В большинстве случаев запуск коллектора
# от лица суперпользователя является приемлемым и более легким, но для большей безопасности можно настроить возможности коллектора.
capabilities:
# Не убирать возможности во время исполнения.
bypass: false
# Добавить возможности к сохраняемым в течение всего времени исполнения.
add: []
# Убрать возможности из сохраняемых в течение всего времени исполнения.
drop: []
# Настройки, относящиеся к захвату артефактов.
capture:
# Путь к директории, где хранятся захваченные артефакты.
output-path: /tmp/komrad/ebpf-collector/out
# Размер буфера perf buffer в eBPF, использующийся для захвата артефактов. Должен быть степенью двойки.
blob-perf-buffer-size: 1024
# Настройки захвата для записи файлов. Когда в какой-либо файл происходит запись, содержимое
# файла захватывается (если данная возможность активирована).
write:
# Захватывать содержимое файлов, в которые производится запись.
capture: false
# Фильтры для префиксов путей к файлам. Пример: /path/prefix*
path: []
# Возможный тип файла. Значения: 'regular', 'pipe', 'socket', 'stdin', 'stdout', 'stderr'.
# Тип 'std*' означает, что будет захватываться содержимое соответствующего стандартного потока процессов.
type: []
# Настройки захвата для считываемых файлов. Когда из какого-либо файла происходит чтение, содержимое
# файла захватывается (если данная возможность активирована). Все поля эквивалентны полям в секции для записи.
read:
capture: false
path: []
type: []
# Захватывать загружаемые модули ядра.
kernel-module: false
# Захватывать исполняемые бинарные файлы.
executed-file: false
# Захватывать участки памяти, измененные распаковщиком памяти. Захват срабатывает,
# когда защита памяти меняется с записи-исполнения (Write+Execute) на запись (Write).
memory-regions: false
# Захватывать байткод загружаемых BPF программ.
bpf-programs: false
# Настройки захвата сетевого трафика.
network:
# Захватывать сетевой трафик.
capture: false
# Захватывать только трафик, относящийся к заданным фильтрам событий (т.е., политикам). Если стоит значение false,
# захватывает весь трафик вне зависимости от фильтров.
filtered: true
# Размер захватываемых данных из каждого пакета.
packet-length: 86

Введение

eBPF-коллектор создает события KOMRAD, используя технологию eBPF - технологию, позволяющую запускать сторонний код в пространстве ядра (если говорить поверхностно). В сфере информационной безопасности и, в частности, продукта KOMRAD, это значит, что благодаря eBPF можно получать информацию о событиях ядра, сетевом взаимодействии и многое другое.

eBPF коллектор основан на open-source продукте Tracee, позволяющем регистрировать и фильтровать множество событий (системные вызовы, передача пакетов и пр.). Поэтому в дальнейших разделах будет приводиться ссылка на соответствующие разделы в документации Tracee.

Значение каждого поля описано в конфигурационном файле, поэтому далее будут лишь подробные пояснения и сравнение с Tracee.

perf-buffer-size и capture.blob-perf-buffer-size

Данные настройки относятся к загружаемым в ядро eBPF программам. По идее, их настройка может влиять на производительность и функциональных изменений не несет.

containers

Tracee по умолчанию пытается обогащать события дополнительным контекстом - например, запущен ли процесс в каком-то контейнере или нет. Для этого утилита обращается к средам выполнения контейнеров - среди них docker, containerd, cri-o, podman. Для этого Tracee использует UNIX-сокеты для общения клиентов (например,

docker cli) с демоном (dockerd).
В данном блоке можно указать, пробовать ли обогащать контейнерные события в принципе, а также указать пути к сокетам для контейнерных сред.

Соответствующая статья в документации Tracee здесь.

cache

При очень плотном потоке событий или при всплесках нагрузки события в буфере ядра могут теряться. Чтобы этого избежать, можно использовать механизм кэширования событий в пользовательском пространстве - именно в этом блоке указываются его настройки. Более подробно можно почитать о данном кэшировании в данном разделе документации Tracee.

capabilities

Для корректной работы eBPF коллектору нужны особые привилегии. Самым простым способом их получить будет запуск eBPF коллектора от имени суперпользователя, однако для большей безопасности можно воспользоваться системой Linux capabilities.

Для работы с меньшими привилегиями коллектору нужен определенный набор capabilities - о нем можно прочитать здесь в документации Tracee.

Более подробно о полях блока capabilities можно прочитать в соответствующем разделе документации Tracee.

capture

Tracee (и, соответственно, eBPF коллектор) предоставляет возможность захвата различных артефактов, связанных с регистрируемыми событиями. При наличии соответствующих политик и правил, а также активированной возможности захвата в конфигурации, при регистрации события eBPF коллектор также будет помещать артефакт в директорию, указанную в поле output-path.

Пример: если имеется политика с правилом отслеживания системного вызова execve, и включена возможность захвата исполняемых файлов, то при каждом вызове execve, помимо события в директории output-path, также будет находится копия исполненного файла.

Более подробно о захвате артефактов можно прочесть здесь.

Политики

Для управления отслеживанием событий eBPF коллектор использует так называемые политики - набор конфигураций правил и фильтров, определяющих регистрируемые события. Политики коллектора полностью соответствуют политикам Tracee.

Политика состоит из трех полей: имени (name), области действия (scope) и правил (rules). Имя определяет имя политики и будет использоваться для отображения задействованных политик в событии.

Scopes - области действия политики, определяющая, в каком контексте будет применяться политика. Область действия может быть как глобальной (действующей на всем хосте), так и более локализованной (в пределах событий пользователя с определенным uid, событий определенного процесса, команды и многое другое).

Rules - правила регистрации событий. Каждое правило состоит из двух частей: события (event) и фильтров (filters).

Поле события определяет регистрируемое событие. Ознакомиться с возможными событиями можно в документации Tracee в разделе Built-in Events. Среди возможных событий: системные вызовы, события сетевого стека, события безопасности (регистрируются подсистемами Linux), а также некоторые другие (см. Built-in Events -> Extra Events).

Фильтры позволяют отсеивать события event по некоторым критериям. Среди возможных фильтров - фильтры контекста (например, по идентификатору процесса или пользователя), фильтры аргументов (например, можно отслеживать системные вызовы open и его аналоги, открывающие файлы в папке /etc/echelon/komrad), а также фильтры возвращаемых значений (например, можно обнаруживать неудачно завершившиеся системные вызовы connect, т.е. те, у которых возвращаемое значение не равно нулю).

Плагины политик

Политики eBPF коллектора реализованы в виде плагина ebpf-policies, в котором перечисляется список применяемых политик. Пример:

ebpf-policies:
- name: container-dns-events
scopes:
- container
rules:
- event: net_packet_dns_request
- event: net_packet_dns_response
- name: pid-equal
scopes:
- global
rules:
- event: read
filters:
- pid=1000
- event: write
filters:
- pid=2000

В целом, плагин политик похож на YAML-представление политик Tracee (примеры) c тем различием, что политики Tracee заточены под k8s и имеют соответствующий синтаксис, а также небольшое различие в названии полей (scopes в плагине против scope в политике Tracee).

Парсинг событий eBPF коллектора

Для парсинга событий eBPF коллектора можно использовать модуль ebpf в плагине processors:

processors:
- module: ebpf

Опционально в модуле можно указать поле для разбора (from: Field), по умолчанию плагин применяется к полю Raw.