xonoxitron/ebpf-sentinel

GitHub: xonoxitron/ebpf-sentinel

一个专为 ML 工作负载优化的 Rust eBPF Linux 端点安全传感器,结合 MITRE ATT&CK 检测规则与 Claude AI 辅助警报分诊。

Stars: 0 | Forks: 0

# ebpf-sentinel **🛡️ 原生 eBPF 的 Linux 端点检测 · 📜 检测即代码 · 🤖 基于 Claude 的警报分类** [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/17bda78d99091730.svg)](https://github.com/xonoxitron/ebpf-sentinel/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) ![Rust](https://img.shields.io/badge/rust-nightly%20+%20stable-orange) ![eBPF](https://img.shields.io/badge/eBPF-Linux%205.8%2B-green) ![MITRE ATT&CK](https://img.shields.io/badge/MITRE%20ATT%26CK-mapped-red) ## 为什么开发这个项目 **ebpf-sentinel** 是一个现代 **Linux 节点传感器** 的实操实现——这类系统通常用于保护大规模训练和推理主机的检测平台。它展示了: - **eBPF 内核插桩**(tracepoints、ring buffers、in-kernel maps),具有极低的用户空间开销 - **检测工程**,通过版本控制的 YAML 规则映射到 **MITRE ATT&CK** - **安全遥测管道**(NDJSON、gRPC/protobuf),适用于 SIEM 和内部平台 - **AI 辅助的检测与响应**,使用 Anthropic Messages API 对机器学习高负载的端点进行结构化分类 如果你正在评估 **Linux 内核安全**、**EDR**、**检测工程** 或 **AI × 安全** 相关职位的候选人——这个仓库旨在提供可直接克隆并构建的证据,证明端到端的独立负责能力。 ## 架构 ``` flowchart TB subgraph kernel["Linux kernel · sentinel-ebpf"] direction TB TP["Tracepoints
execve · connect · openat
fork · exec"] MAPS["BPF maps
PROCESS_TREE · MONITORED_PATHS
PerCpuArray scratch"] RB[("EVENTS RingBuf
256 KiB · mmap")] TP --> MAPS TP --> RB end subgraph types["sentinel-common"] EVT["SentinelEvent
fixed-size C layout"] end subgraph daemon["sentinel daemon · Rust + Tokio"] direction TB LOAD["ProbeLoader
BTF / CO-RE attach · map seeding"] CONS["RingBuf consumer
parse · mpsc channel"] ENR["Enricher
parent_comm · lineage
K8s CRI metadata"] RULES["RuleEngine
YAML rules + Sigma import"] SUP["AlertSuppressor
per-rule rate limits"] TRI["Claude Triager
optional SOAR"] MET["Prometheus :9090
events · alerts · suppressed"] SINK["MultiSink
stdout · NDJSON · gRPC"] LOAD --> CONS CONS --> ENR ENR -->|"all events"| SINK ENR --> RULES RULES --> SUP SUP -->|"MITRE alerts"| TRI TRI --> SINK SUP -->|"non-suppressed"| SINK ENR --> MET RULES --> MET SUP --> MET end subgraph config["Configuration & rules"] CFG["config/sentinel.yaml"] RULES_DIR["rules/ · sigma/"] CFG --> LOAD CFG --> ENR CFG --> SINK CFG --> MET RULES_DIR --> RULES end subgraph external["Downstream"] ANTH["Anthropic API"] PLATFORM["SIEM / platform
grpc-ingest · log aggregation"] TRI -.-> ANTH SINK --> PLATFORM end RB -->|"zero-copy events"| CONS EVT -.-> kernel EVT -.-> daemon ``` **遥测路径** —— 每一个内核事件都会被解析、丰富、可选择地发送到 sinks,并在 Prometheus 中进行计数。 **检测路径** —— 丰富后的事件会根据 YAML/Sigma 规则进行评估;匹配项在导出警报前,会经过抑制处理和可选的 Claude 分类。 ### 针对 ML 负载的设计原则 | 关注点 | 方法 | |--------|----------| | **CPU 开销** | 通过 tracepoints 获取内核事件;单一 ring buffer;探测器没有产生基于事件的系统调用 | | **内存** | 固定大小的 `#[repr(C)]` 事件;per-CPU scratch map 避免了 BPF 栈耗尽 | | **训练节点上的误报** | Claude 分类提示词编码了 ML 上下文(PyTorch、checkpoints、遥测) | | **集群规模** | 无状态守护进程 (daemon);使用 gRPC 摄取用于集中式管道;NDJSON 用于日志聚合 | | **可维护性** | Rust 用户空间 + Rust eBPF ([Aya](https://aya-rs.dev));共享 `sentinel-common` 类型 | ## 功能矩阵(与职位相关的能力) | 能力 | 实现方式 | |-----------|----------------| | **eBPF / 内核传感器** | `sentinel-ebpf`: execve, connect, openat, fork/exec 血缘, FIM | | **Rust 系统编程** | Workspace crates, `no_std` eBPF, 异步用户空间 daemon | | **检测即代码** | YAML 规则,在启动时预编译正则表达式,MITRE 元数据 | | **SIEM / 日志聚合** | 结构化 JSON 警报;NDJSON sink | | **内部平台 / API 设计** | gRPC + Protobuf (`SentinelIngest`);参考 `grpc-ingest` 服务器 | | **SOAR / 自动化** | 规则 `actions: [alert, triage]` → Claude 丰富化管道 | | **用于安全运营的 AI** | Anthropic API 集成,支持结构化分类 JSON | | **进程血缘** | 内核态 `PROCESS_TREE` map + 用户空间丰富器 | | **文件完整性监控** | 可配置的路径前缀;可写打开检测 | | **CI/CD** | GitHub Actions:构建 eBPF,运行单元测试,rustfmt | | **测试驱动开发** | 规则引擎单元测试(前缀、正则表达式、MITRE 规则) | ## 快速开始 ### 前置条件 ``` # Toolchain(参见 rust-toolchain.toml) rustup toolchain install nightly rustup component add --toolchain nightly rust-src cargo install bpf-linker # 系统(Debian/Ubuntu) sudo apt-get install -y clang llvm libelf-dev # Kernel:带 BTF 的 Linux ≥ 5.8 test -f /sys/kernel/btf/vmlinux && echo "BTF OK" || echo "install kernel BTF package" ``` ### 构建 ``` git clone https://github.com/xonoxitron/ebpf-sentinel.git cd ebpf-sentinel make build # binaries:target/release/sentinel、target/release/grpc-ingest ``` ### 无需 root 尝试检测(30秒) ``` make demo # 或:./examples/demo-detection.sh ``` 运行规则引擎的单元测试和一个合成的反向 shell (reverse-shell) 管道测试 —— 不需要 `sudo`。 ### 运行实时传感器 ``` # CAP_BPF + CAP_PERFMON + CAP_SYS_ADMIN,或 root export ANTHROPIC_API_KEY="sk-ant-..." # optional, for Claude triage sudo -E ./target/release/sentinel --config config/sentinel.yaml ``` **安全触发**(在第二个终端) —— 内置的可写暂存区规则: ``` cp /bin/ls /tmp/sentinel-demo && /tmp/sentinel-demo --version rm -f /tmp/sentinel-demo ``` 预期会在 **stderr** 看到警报 `T1574.006-001`。完整演练:[`examples/README.md`](examples/README.md)。 ### 仅警报模式 ``` sudo -E ./target/release/sentinel --config config/sentinel.yaml --no-emit-events ``` ### Claude 分类 在 `config/sentinel.yaml` 中启用: ``` triage: enabled: true api_key_env: ANTHROPIC_API_KEY model: claude-sonnet-4-20250514 max_tokens: 1024 ``` 带有 `actions: [alert, triage]` 的规则在导出时会收到结构化的分类 JSON。 ### gRPC 摄取管道 ``` # 终端 A — 参考 ingest 服务器 (0.0.0.0:50051) ./target/release/grpc-ingest # 终端 B — 带 gRPC sink 的 agent sudo -E ./target/release/sentinel --config config/sentinel-grpc.yaml ``` 参见 [`config/sentinel-grpc.yaml`](config/sentinel-grpc.yaml) 和 [`examples/docker-compose.yml`](examples/docker-compose.yml)。 ## 示例输出 ### Sink 格式 | Sink | 事件 | 警报 | |------|--------|--------| | **stdout** | stdout 上的 JSON | **stderr** 上的 JSON | | **ndjson** | `{"record_type":"event","data":{...}}` | `{"record_type":"alert","data":{...}}` | | **grpc** | `SentinelIngest.StreamEvents` | `SentinelIngest.StreamAlerts` | ### 警报 payload(核心字段) ``` { "rule_id": "T1059.004-001", "title": "Interactive Shell Spawned by Network Utility", "severity": "critical", "mitre": { "tactic": "Execution", "technique": "T1059.004" }, "event": { "kind": "exec", "pid": 18341, "ppid": 18340, "comm": "bash", "parent_comm": "nc", "path": "/bin/bash", "lineage": ["nc", "systemd"] } } ``` ### NDJSON 封装 ``` {"record_type":"alert","data":{"rule_id":"T1574.006-001","title":"...","event":{...}}} ``` ### Claude 分类丰富化(警报上的 `triage` 字段) ``` { "triage": { "severity": "critical", "summary": "Reverse shell pattern: bash spawned directly by netcat.", "reasoning": "Interactive shell with network utility parent is a high-fidelity execution chain.", "mitre": ["T1059.004", "T1071.001"], "remediation": [ "Isolate the node from the network.", "Kill PID 18341 and parent 18340; preserve memory if feasible.", "Audit UID 1000 credentials and recent outbound connections." ], "false_positive_likelihood": 0.03 } } ``` ## 检测即代码 规则位于 [`rules/`](rules/) 中 —— 每个检测对应一个 YAML 文件。每个规则支持: - **字段匹配器**:`eq`, `ne`, `prefix`, `suffix`, `contains`, `matches` (正则表达式) - **布尔逻辑**:`all` / `any` 条件组 - **MITRE ATT&CK** 元数据 - **动作**:`alert`, `triage` ``` id: T1059.004-001 title: Interactive Shell Spawned by Network Utility severity: critical mitre: tactic: Execution technique: T1059.004 conditions: all: - field: kind op: eq value: exec - field: comm op: matches value: "^(bash|sh|zsh|dash|fish)$" - field: parent_comm op: matches value: "^(nc|ncat|socat|python3?|perl|ruby|php|curl)$" actions: [alert, triage] ``` ### 事件字段(在用户空间中丰富) | 种类 | 关键字段 | |------|------------| | `exec` | `comm` (来自路径 basename), `parent_comm`, `path`, `lineage`, `uid` | | `connect` | `comm`, `addr_family`, `dst_addr`, `dst_port` (IPv4 和 IPv6) | | `open` | `comm`, `path`, `flags` | | `fileintegrity` | `comm`, `path`, `flags` | | `processfork` | `comm` (父进程), `pid`, `ppid`, `uid` | | *(丰富化后)* | 启用 K8s 时的 `container_id`, `pod_name`, `pod_namespace`, `pod_image` | ### 内置检测 | ID | 名称 | 严重程度 | |----|------|----------| | `T1059.004-001` | 由网络工具启动的交互式 shell | 严重 | | `T1574.006-001` | 从可写暂存目录执行的二进制文件 | 高 | | `CUSTOM-ML-EXFIL-001` | 传输工具访问了模型构件 (artifact) | 高 | | `T1003.008-001` | 访问凭据存储 (`/etc/shadow`) | 高 | | `FIM-001` | 监控路径上的文件完整性违规 | 严重 | | `NET-IPv6-001` | 出站 IPv6 连接 | 低 | | `sigma-sentinel-sigma-nc-shell` | Sigma: netcat 启动的 shell | 严重 | ## 项目布局 ``` ebpf-sentinel/ ├── .github/workflows/ci.yml # Build + test + integration CI ├── config/ │ ├── sentinel.yaml # Default agent config │ └── sentinel-grpc.yaml # gRPC sink example ├── examples/ │ ├── demo-detection.sh # Hands-on demo (no root) │ ├── config/ # alerts-only, FIM lab, triage, K8s, … │ ├── rules/ # Custom rule lab (DEMO-TMP-ECHO-001) │ ├── sigma/ # Sample Sigma imports │ ├── triggers/ # Safe detection fire scripts │ ├── scripts/ # live-sensor, watch-alerts, gRPC pipeline │ ├── deploy/ # systemd + DaemonSet manifests │ ├── prometheus/ # Scrape config │ ├── docker-compose.yml # grpc-ingest reference stack │ └── README.md # Full examples catalog ├── rules/ # Native YAML detections (MITRE-mapped) ├── sigma/ # Sigma rules (imported at startup) ├── docs/ # PORTABILITY.md, K8S.md ├── sentinel-common/ # Shared #[repr(C)] event types ├── sentinel-ebpf/ # Kernel probes (Aya, bpfel-unknown-none) │ └── src/ │ ├── probes.rs # execve · connect · openat · fork/exec │ └── helpers.rs # emit · FIM · process tree └── sentinel/ # Userspace daemon ├── proto/sentinel.proto # gRPC telemetry schema ├── tests/integration.rs # Pipeline + eBPF loader tests └── src/ ├── loader.rs # BTF attach · map seeding ├── enricher.rs # /proc seed · lineage · K8s ├── rules/ # YAML + Sigma engine ├── suppress.rs # Per-rule rate limits ├── metrics.rs # Prometheus exporter ├── triage.rs # Claude SOAR integration └── sinks/ # stdout · NDJSON · gRPC ``` ## 技术栈 | 层级 | 技术 | |-------|------------| | 内核探测器 | Rust eBPF ([Aya](https://aya-rs.dev)), tracepoints, ring buffer | | 用户空间代理 | Rust, Tokio, `aya`, `clap` | | 规则 | YAML, `serde`, `regex` (预编译) | | 分类 | Anthropic Messages API, 结构化 JSON | | 遥测 | JSON, NDJSON, gRPC/Protobuf (Tonic) | | 构建 | `aya-build`, `bpf-linker`, nightly `build-std` | ## 配置参考 [`config/sentinel.yaml`](config/sentinel.yaml): | 键 | 描述 | |-----|-------------| | `rules_dir` | YAML 检测规则的路径 | | `sigma_dir` | 可选的 Sigma 规则导入目录 (`sigma-{id}` 前缀) | | `monitored_paths` | 推送到 eBPF map 的 FIM 路径前缀 | | `sinks` | `stdout`, `ndjson`, 或 `grpc` 输出 | | `triage` | Claude 模型,token 限制,API 密钥环境变量 | | `host` | 事件/警报上的主机名标签 | | `metrics` | Prometheus 抓取 endpoint (`sentinel_events_total`, `sentinel_alerts_total`) | | `suppression` | 每个规则的警报速率限制 | ### Sigma 导入 `sigma_dir` 下的 Sigma YAML 规则会在启动时转换为原生规则 (`sigma-{id}` 前缀)。 | Sigma 字段 | Sentinel 字段 | 备注 | |-------------|----------------|-------| | `Image` | `comm` | 路径后缀标准化 (`/bin/bash` → `bash`) | | `ParentImage` | `parent_comm` | 相同的标准化 | | `CommandLine` | `path` | | | `DestinationIp` | `dst_addr` | | | `DestinationPort` | `dst_port` | | | `logsource.category` | `kind` | `process_creation` → `exec` 等 | 不支持的 Sigma 字段将被跳过并发出警告。 ### Prometheus 当 `metrics.enabled: true` 时,抓取 `http://:9090/metrics`: ``` curl -s localhost:9090/metrics | grep sentinel_ ``` ## 路线图 - [x] 针对多内核集群的 CO-RE / BTF 可移植性强化 - [x] IPv6 连接遥测 (`sys_enter_connect` v6 解析) - [x] 警报抑制和基于规则的速率限制 - [x] Prometheus 指标 (`sentinel_events_total`, `sentinel_alerts_total`) - [x] Kubernetes pod 元数据丰富 (CRI / container ID) - [x] Sigma 规则导入 - [x] 使用 `testcontainers` + 特权 CI 运行器的集成测试 ## 开发 ``` make demo # hands-on detection demo (recommended first step) make test # unit tests make integration # integration + sudo eBPF loader test make fmt # rustfmt make clippy # lint (strict) make ingest # run gRPC reference server ``` ### 故障排除 | 症状 | 修复方法 | |---------|-----| | `kernel BTF not found` | 安装 `linux-image-$(uname -r)` debug/BTF 包;参见 [`docs/PORTABILITY.md`](docs/PORTABILITY.md) | | 加载 BPF 时提示 `Operation not permitted` | 以 root 身份运行或授予 `CAP_BPF`, `CAP_PERFMON`, `CAP_SYS_ADMIN` | | 没有规则匹配 | 从仓库根目录运行;检查配置中的 `rules_dir` 路径 | | stderr 上没有警报 | 使用 stdout sink 时,警报输出到 **stderr**;事件输出到 **stdout** | | gRPC 连接被拒绝 | 在代理之前启动 `grpc-ingest`;验证配置中的 `endpoint` | ## 安全提示 该代理会将 eBPF 程序加载到内核中。请仅在你拥有的系统上运行。在生产环境中启用 Claude 分类之前,请审查规则——警报可能包含敏感的主机遥测数据。 ## 许可证 [MIT](LICENSE) ## 关键词 `eBPF` · `Linux 内核安全` · `端点检测` · `EDR` · `检测工程` · `检测即代码` · `MITRE ATT&CK` · `Rust` · `Aya` · `tracepoints` · `ring buffer` · `SIEM` · `SOAR` · `Claude` · `Anthropic` · `安全自动化` · `ML 基础设施安全` · `GPU 训练节点` · `遥测管道` · `gRPC` · `NDJSON` · `文件完整性监控` · `进程血缘` · `反向 shell 检测`
标签:Docker镜像, EDR, Linux内核安全, Python工具, Rust, SOAR, x64dbg, 可视化界面, 网络流量审计, 脆弱性评估, 自定义请求头, 通知系统