基于Go的高性能轻量化数据收集器,专注于终端数据采集和双向通信。
SysArmor数据收集器是一个专门用于终端数据采集的轻量化组件,特点:
- 🪶 轻量化设计: 资源占用低,专注核心数据采集功能
- 🔌 插件化架构: 支持多种数据源插件,易于扩展
- 🚀 高性能处理: Go语言实现,低CPU和内存占用
- 🔄 双向通信: 支持与Server的双向通信,如远程查询
- 📊 统一数据格式: 标准化事件格式,便于分析和关联
- 🛠️ 灵活配置: 支持配置文件和命令行参数
sysarmor-collector/
├── cmd/ # 应用程序入口点
│ ├── sysarmor-collector/ # 统一数据收集器
│ └── test-consumer/ # 测试消费者
├── internal/ # 私有应用程序代码
│ ├── core/ # 核心收集器框架
│ │ ├── collector.go # 基础收集器实现
│ │ └── buffer.go # 事件缓冲区
│ └── plugins/ # 插件系统
│ ├── plugin.go # 插件接口定义
│ └── sysdig/ # Sysdig插件实现
├── configs/ # 配置文件
│ └── app/ # 应用配置
│ └── sysarmor-collector.json # 示例配置文件
├── test/ # 测试和性能基准
│ ├── integration/ # 集成测试
│ └── performance/ # 性能测试
├── scripts/ # 脚本文件
├── bin/ # 编译后的二进制文件(构建时生成)
├── go.mod # Go模块文件
├── go.sum # 依赖锁定文件
├── Makefile # 构建脚本
└── README.md # 项目文档
# 检查依赖
/usr/local/go/bin/go version
sysdig --version # 可选,用于本地测试
# 配置Go PATH(如果需要)
export PATH=$PATH:/usr/local/go/bin
# 进入项目目录
cd sysarmor-collector
数据收集器需要连接到NATS消息队列服务。请先启动独立的NATS服务器:
# 进入NATS服务器目录
cd ../sysarmor-nats-server
# 启动NATS集群
make up
# 验证集群状态
make status
# 下载依赖
make deps
# 构建所有组件
make build
# 或者单独构建
make build-collector # 构建收集器
make build-consumer # 构建测试消费者
# 使用配置文件运行(30秒采集,-p参数,自定义JSON格式)
sudo ./bin/sysarmor-collector -c configs/app/sysarmor-collector.json
# 详细日志模式
sudo ./bin/sysarmor-collector -v -c configs/app/sysarmor-collector.json
# 使用Makefile快速启动
make run-collector
# 快速启动模式(10秒测试)
sudo ./bin/sysarmor-collector --sysdig -cmd "sudo sysdig -j 'proc.name!=sysdig'" -subject sysdig.events -d 10s
# 指定NATS集群
sudo ./bin/sysarmor-collector -n "nats://localhost:4222,nats://localhost:4223" --sysdig -cmd "sudo sysdig -j" -subject sysdig.events -d 30s
# 运行测试消费者验证数据(在另一个终端)
make run-consumer
# 或直接运行
./bin/test-consumer sysdig.events
# 使用NATS CLI工具验证(可选)
# go install github.com/nats-io/natscli/nats@latest
# nats sub sysdig.events --count=5
{
"nats_urls": [
"nats://localhost:4222",
"nats://localhost:4223",
"nats://localhost:4224"
],
"batch_size": 100,
"flush_timeout": "1s",
"log_level": "info",
"plugins": {
"sysdig": {
"command": [
"sudo",
"sysdig",
"-p",
"*{\"event\":{\"evt.num\":\"%evt.num\",\"evt.time\":\"%evt.time\",\"evt.type\":\"%evt.type\",\"evt.args\":\"%evt.args\",\"fd.name\":\"%fd.name\",\"proc.pid\":\"%proc.pid\",\"proc.name\":\"%proc.name\",\"proc.cmdline\":\"%proc.cmdline\",\"proc.ppid\":\"%proc.ppid\",\"proc.pname\":\"%proc.pname\",\"proc.pcmdline\":\"%proc.pcmdline\"}}",
"proc.name!=sysdig and (fd.name exists and fd.name != \"\")"
],
"subject": "sysdig.events",
"duration": "30s",
"backpressure": "1ms",
"log_level": "info"
}
}
}
Usage: sysarmor-collector [选项]
选项:
-h, --help 显示帮助信息
-c, --config string 配置文件路径
-n, --nats-urls string NATS服务器地址,逗号分隔 (默认: "nats://localhost:4222")
-v, --verbose 详细日志输出
快速启动模式:
--sysdig 启用Sysdig插件
-cmd, --command string Sysdig命令
-subject string NATS主题名称
-d, --duration duration 采集持续时间,0表示持续采集 (默认: 0)
-b, --batch-size int 批量大小 (默认: 100)
-t, --timeout duration 刷新超时时间 (默认: 1s)
--bp, --backpressure duration 背压控制延迟 (默认: 1ms)
NATS_URLS # NATS服务器地址
SYSDIG_CMD # Sysdig命令
CONFIG_FILE # 配置文件路径
指标 | Python+Kafka | Go+NATS | 提升幅度 |
---|---|---|---|
CPU使用率 | 20-40% | 8-15% | 70-80%降低 |
内存使用 | - | - | - |
吞吐量 | 10K-30K/sec | 100K+/sec | 3-10倍提升 |
延迟 | - | - | - |
# 清理构建产物
make clean
# 下载依赖
make deps
# 构建所有组件
make build
# 运行测试
make test
# 性能测试
make test-performance
# 代码格式化
make fmt
# 代码检查
make lint
# 安全扫描
make security
# 查看帮助
make help
- 在
internal/plugins/
目录下创建新插件目录 - 实现
Plugin
接口,参考internal/plugins/sysdig/
- 在主程序中注册插件
- 更新配置文件格式
- 添加相应的测试
type Plugin interface {
// 基础方法
Name() string
Type() PluginType
Version() string
// 生命周期方法
Initialize(config map[string]interface{}) error
Start(ctx context.Context, collector *core.BaseCollector) error
Stop() error
// 状态方法
IsRunning() bool
GetStatus() PluginStatus
// 双向通信支持
HandleCommand(cmd *Command) (*CommandResponse, error)
}
当前支持两种输出格式:
{
"evt.num": "12345",
"evt.time": "2024-01-01T10:00:00.123456Z",
"evt.type": "openat",
"proc.name": "cat",
"fd.name": "/etc/passwd"
}
{
"event": {
"evt.num": "12345",
"evt.time": "2024-01-01T10:00:00.123456Z",
"evt.type": "openat",
"evt.args": "fd=3(<f>/etc/passwd) name=/etc/passwd flags=1(O_RDONLY)",
"fd.name": "/etc/passwd",
"proc.pid": "1234",
"proc.name": "cat",
"proc.cmdline": "cat /etc/passwd",
"proc.ppid": "1000",
"proc.pname": "bash",
"proc.pcmdline": "/bin/bash"
}
}
package main
import (
"fmt"
"log"
"github.com/nats-io/nats.go"
)
func main() {
// 连接NATS
nc, err := nats.Connect("nats://localhost:4222")
if err != nil {
log.Fatal(err)
}
defer nc.Close()
// 订阅事件
nc.Subscribe("sysdig.events", func(m *nats.Msg) {
fmt.Printf("Received: %s\n", string(m.Data))
})
select {} // 保持运行
}
func batchConsumer() {
nc, _ := nats.Connect("nats://localhost:4222")
defer nc.Close()
events := make([]string, 0, 100)
ticker := time.NewTicker(5 * time.Second)
nc.Subscribe("sysdig.events", func(m *nats.Msg) {
events = append(events, string(m.Data))
if len(events) >= 100 {
processBatch(events)
events = events[:0]
}
})
go func() {
for range ticker.C {
if len(events) > 0 {
processBatch(events)
events = events[:0]
}
}
}()
}
-
Go命令未找到
# 配置Go PATH export PATH=$PATH:/usr/local/go/bin go version
-
NATS连接失败
# 检查NATS服务器状态 cd ../sysarmor-nats-server make status make health
-
sysdig权限问题
# 确保使用sudo运行 sudo ./bin/sysarmor-collector --sysdig -cmd "sudo sysdig -j" -subject sysdig.events
-
构建失败
# 清理并重新构建 make clean make deps make build
-
配置文件解析错误
# 检查JSON格式是否正确 cat configs/app/sysarmor-collector.json | jq .
# 详细日志模式
sudo ./bin/sysarmor-collector -v -c configs/app/sysarmor-collector.json
# 快速启动详细日志
sudo ./bin/sysarmor-collector -v --sysdig -cmd "sudo sysdig -j" -subject sysdig.events -d 10s
# 调整批量大小
sudo ./bin/sysarmor-collector --sysdig -cmd "sudo sysdig -j" -subject sysdig.events -b 500
# 调整刷新间隔
sudo ./bin/sysarmor-collector --sysdig -cmd "sudo sysdig -j" -subject sysdig.events -t 500ms
# 背压控制
sudo ./bin/sysarmor-collector --sysdig -cmd "sudo sysdig -j" -subject sysdig.events --bp 5ms
# 增加文件描述符限制
ulimit -n 65536
# 调整网络缓冲区
echo 'net.core.rmem_max = 134217728' >> /etc/sysctl.conf
echo 'net.core.wmem_max = 134217728' >> /etc/sysctl.conf
sysctl -p
- ✅ 完全兼容原始sysdig命令和过滤器
- ✅ 支持-j和-p两种输出格式
- ✅ 支持时间限制采集,自动退出
- ✅ 支持自定义NATS连接参数
- ✅ 向后兼容的Makefile目标
- ✅ 完成Sysdig收集器基础功能
- ✅ 实现插件化架构
- ✅ 实现配置文件支持
- ✅ 统一收集器框架
- ✅ 双向通信基础架构
- ✅ 时间限制和自动退出
- ✅ 配置文件时间字段解析
- 🔄 添加OSQuery插件支持(双向通信)
- 🔄 完善错误处理和重试机制
- 🔄 添加更多测试用例
- 🔄 性能优化和监控指标
- 🔄 添加Sysmon插件支持(Windows)
- 🔄 实现事件过滤和预处理
- 🔄 添加配置热重载
- 🔄 完善文档和示例
- 🔄 添加ETW插件支持(Windows高级)
- 🔄 实现更多数据源插件
- 🔄 集成健康检查和自愈机制
- 🔄 添加数据压缩和加密
- ❌ 不在Collector层面集成Wazuh: 根据架构设计,Wazuh集成在SysArmor Server层面实现
- 🎯 专注轻量化: Collector保持轻量化,复杂分析功能由Server端处理
- 🔄 双向通信: 重点发展与Server的双向通信能力,支持远程查询和控制
如有问题,请检查:
- Go环境配置:
go version
- NATS服务器状态:
cd ../sysarmor-nats-server && make status
- 系统权限: 确保使用sudo运行需要特权的命令
- 配置文件格式: 使用
jq
验证JSON格式
本项目采用MIT许可证。