Как работают агенты 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. Следите за обновлениями.