eBPF Runtime Protection
Kernel-level мониторинг процессов, фильтрация системных вызовов и enforcement сетевых правил через eBPF. Построен на aya 0.13 в Rust.
Обзор
FlowLink использует eBPF (extended Berkeley Packet Filter) для kernel-level мониторинга и защиты. eBPF-программы загружаются в ядро Linux и выполняются в безопасном sandbox, обеспечивая нулевое влияние на производительность при мониторинге и < 1ms задержку при enforcement.
Rust
Язык
aya 0.13 crate
< 1ms
Задержка enforcement
на syscall
4
Программ eBPF
monitor, filter, bastion, audit
Архитектура eBPF
FlowLink eBPF stack состоит из 4 программ, каждая из которых решает свою задачу. Все программы написаны на Rust с использованием aya 0.13 и загружаются через FlowLink daemon.
Process Monitor
kprobe на sys_execve, sys_clone и sys_fork для отслеживания создания процессов. Каждый новый процесс логируется с полным контекстом: PID, PPID, UID, GID, command line, cgroup.
1// FlowLink eBPF: Process Monitor (aya 0.13)2use aya::{programs::KProbe, BpfLoader};3use aya_log::BpfLogger;45let mut bpf = BpfLoader::new()6 .set_global("AGENT_PID", &agent_pid)7 .load(&process_monitor_bytes)?;89let monitor: &mut KProbe = bpf.program_mut("on_execve")10 .unwrap()11 .try_into()?;1213monitor.load()?;14monitor.attach()?;1516// При каждом execve: логируем PID, command, parent
Syscall Filter
kprobe на опасных syscalls (open, openat, connect, socket, ptrace) с проверкой через cgroup. Если процесс принадлежит агенту и syscall не разрешён политикой — возвращается -EPERM.
1// FlowLink eBPF: Syscall Filter — dangerous syscall blocking2#[kprobe]3pub fn on_openat(ctx: KProbeContext, fd: i32, pathname: *const c_char) -> u32 {4 let pid = bpf_get_current_pid_tgid() >> 32;56 // Check if process is under FlowLink agent cgroup7 if !is_agent_cgroup(pid) { return 0; }89 // Read the path being opened10 let path = read_path(pathname);1112 // Check against deny list from FlowLink policy store13 if is_denied_path(&path) {14 log_event(pid, "DENY", &path);15 return -EPERM as u32; // Block the syscall16 }1718 0 // Allow19}
Network Bastion
cgroup-based socket filter для контроля всех исходящих сетевых подключений. Проверяет destination IP, port и protocol против network policy. Поддерживает IPv4/IPv6.
1// FlowLink eBPF: Network Bastion — outbound connection control2#[cgroup_sock_ops]3pub fn on_connect(ctx: SockOpsContext) -> i32 {4 let pid = bpf_get_current_pid_tgid() >> 32;56 // Only enforce for agent processes7 if !is_agent_cgroup(pid) { return 0; }89 // Extract destination address and port10 let (family, daddr, dport) = get_socket_params(ctx);1112 // Check against network policy (loaded from FlowLink gateway)13 if !is_allowed_connection(family, &daddr, dport) {14 log_network_event(pid, "BLOCK", &daddr, dport);15 return -EACCES as i32; // Block connection16 }1718 0 // Allow19}
Audit Trail
Perf event buffer для передачи всех событий (allow/deny) из ядра в userspace FlowLink daemon. Daemon отправляет события через gRPC на Gateway для хранения и анализа.
Развёртывание
eBPF программы загружаются автоматически при запуске FlowLink daemon. Проверка совместимости ядра, загрузка через aya и attach к cgroup происходят без перезагрузки.
1# Запуск FlowLink с eBPF protection2$ flowlink-relay daemon --ebpf-enabled34# Проверка статуса eBPF программ5$ flowlink-relay ebpf status6 ✅ process_monitor — kprobe on sys_execve (attached)7 ✅ syscall_filter — kprobe + cgroup (attached)8 ✅ network_bastion — cgroup socket filter (attached)9 ✅ audit_trail — perf event buffer (active)1011# Проверка заблокированных операций12$ flowlink-relay ebpf events --since 1h13 [2026-05-30T14:23:07Z] agent=prod_deployer_01 syscall=openat path=/etc/shadow verdict=BLOCKED14 [2026-05-30T14:23:12Z] agent=prod_deployer_01 connect=192.168.1.100:5432 verdict=BLOCKED
Требования к ядру
| Фича | Linux | Описание |
|---|---|---|
| kprobes | 4.9+ | Базовая поддержка kprobe |
| BPF maps | 4.10+ | Хранение состояния в ядре |
| cgroup v2 | 4.5+ | Cgroup-based enforcement |
| BPF sock_ops | 4.13+ | Сетевые фильтры на сокетах |
| BPF kfunc | 6.1+ | Вызов функций ядра из eBPF |
| CO-RE | 5.5+ | Compile Once — Run Everywhere |
FlowLink использует CO-RE (Compile Once — Run Everywhere) через aya, что позволяет одной бинарной eBPF программе работать на разных версиях ядра без перекомпиляции.
Интеграция с Shield Engine
eBPF — это Level 3 enforcement в Shield Engine. Если MCP tool call прошёл Credential Vault и Network Bastion, но пытается выполнить запрещённый syscall — eBPF блокирует его на уровне ядра.
Сценарий блокировки
1# Агент пытается прочитать /etc/shadow через MCP tool2$ flowlink-relay mcp --tool filesystem_read --path /etc/shadow34# Shield Engine pipeline:5[1] Parser → tool=filesystem_read, path=/etc/shadow ✓6[2] Schema Valid → params valid ✓7[3] Policy Engine → DENY: /etc/shadow not in allowed_paths ✗8[4] Credential Vault→ access denied (readonly role) ✗9[5] Network Bastion → N/A ✓10[6] eBPF Monitor → pending...11[7] Decision → BLOCKED1213# Результат:14❌ MCP tool call blocked by Shield Engine (policy + credential)15📋 Audit log: evt_9d4e7f2a — "filesystem_read /etc/shadow BLOCKED"16🔔 Alert sent to security team via Telegram webhook
Подробнее: MCP Shield Engine → · Политики →