Как работают агенты SecureExec
Агент SecureExec — это лёгкий однофайловый процесс, который работает на конечных точках и передаёт телеметрию безопасности на сервер приёма данных в режиме реального времени. В этой статье рассматривается архитектура агента, механизмы сбора событий и обоснование принятых технических решений.
Основной цикл агента
Агент подписывается на события ядра через интерфейсы аудита и трассировки операционной системы. На Linux это означает подключение к подсистеме аудита и procfs для событий процессов, inotify для файловых операций и netlink для сетевой активности.
События сериализуются с помощью Protocol Buffers и передаются потоком на сервер SecureExec через постоянное gRPC-соединение. Агент реализует два режима передачи:
- Потоковый (
send_events) — долгоживущий двунаправленный поток, оптимальный для конечных точек с высокой нагрузкой - Пакетный (
send_event_batch) — накапливает события за короткий промежуток времени и отправляет один bulk-запрос; лучше подходит для точек с нестабильным подключением
Схема события
Каждое событие содержит общий конверт:
message AgentEvent {
string id = 1;
uint64 seqno = 2;
string timestamp = 3;
string agent_id = 4;
string hostname = 5;
string os = 6;
string content_hash = 7;
string process_uid = 8;
oneof kind { ... }
}
Поле process_uid — это стабильный идентификатор процесса, сохраняющийся между перезагрузками. Он формируется из PID, времени запуска и имени хоста. Это позволяет правилам обнаружения отслеживать цепочку процессов даже для короткоживущих процессов.
Буфер и повторная отправка
Агент поддерживает локальный буфер на диске. Если соединение с сервером прерывается, события записываются в буфер и повторно отправляются по порядку после восстановления соединения. Это гарантирует, что никакая телеметрия не будет потеряна при сетевых сбоях или перезапуске сервера.
Событие heartbeat (AgentHeartbeat) сообщает значение spool_pending — количество событий в очереди, — что позволяет операторам отслеживать накопленный backlog через консоль.
Почему Rust?
Rust обеспечивает безопасность памяти и предсказуемую низколатентную производительность без сборщика мусора. Бинарный файл агента статически скомпонован и не имеет зависимостей от среды выполнения, что делает развёртывание таким же простым, как копирование одного файла на хост.
На загруженном производственном сервере, генерирующем 50 000 событий в минуту, агент SecureExec стабильно потребляет менее 1% CPU и около 20 МБ оперативной памяти.
Что дальше
Мы работаем над сбором событий на основе eBPF для Linux, что позволит перехватывать события уровня ядра с ещё меньшими накладными расходами и без необходимости привилегий root. Следите за обновлениями.