如何使用Golang启动osquery守护进程,获取process_events与file_events表信息?
用Golang启动osquery守护进程并获取实时事件数据(无需扩展)
前置准备
- 确保系统已安装osquery,
osqueryd命令可直接调用 - 编写osquery配置文件(比如
osquery.conf),启用事件采集:
{ "options": { "disable_events": false, "enable_file_events": true, "enable_process_events": true, "events_expiry": 3600, "verbose": false }, "schedule": {}, "packs": {} }
核心思路
通过Golang启动osqueryd进程,指定stdio作为日志插件,让osquery把实时事件输出到标准输出,然后Golang捕获并解析这些输出,最后存储数据。这种方式不需要编写osquery扩展,直接通过进程通信实现。
完整Golang代码示例
package main import ( "bufio" "encoding/json" "log" "os" "os/exec" ) // 适配osquery事件的结构体 type OsqueryEvent struct { Name string `json:"name"` Hostname string `json:"hostname"` UnixTime int64 `json:"unix_time"` Columns map[string]interface{} `json:"columns"` } func main() { // 启动osqueryd,指定配置文件和stdio日志输出 cmd := exec.Command("osqueryd", "--config_path", "./osquery.conf", "--logger_plugin", "stdio") // 获取进程stdout管道 stdout, err := cmd.StdoutPipe() if err != nil { log.Fatalf("无法获取stdout管道: %v", err) } // 启动osqueryd进程 if err := cmd.Start(); err != nil { log.Fatalf("启动osqueryd失败: %v", err) } defer cmd.Wait() // 逐行读取stdout输出 scanner := bufio.NewScanner(stdout) for scanner.Scan() { var event OsqueryEvent line := scanner.Text() // 解析JSON格式的事件数据 if err := json.Unmarshal([]byte(line), &event); err != nil { log.Printf("解析事件失败: %v, 原始内容: %s", err, line) continue } // 筛选目标事件表 if event.Name == "process_events" || event.Name == "file_events" { log.Printf("捕获到%s事件: %+v", event.Name, event.Columns) // 调用存储函数处理事件 saveEvent(event) } } if err := scanner.Err(); err != nil { log.Fatalf("读取stdout出错: %v", err) } } // 事件存储示例:追加写入本地日志文件 func saveEvent(event OsqueryEvent) { file, err := os.OpenFile("osquery_events.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { log.Printf("打开日志文件失败: %v", err) return } defer file.Close() eventJSON, err := json.MarshalIndent(event, "", " ") if err != nil { log.Printf("序列化事件失败: %v", err) return } if _, err := file.Write(append(eventJSON, '\n')); err != nil { log.Printf("写入事件到文件失败: %v", err) } }
关键注意事项
- 权限要求:采集进程和文件事件需要root权限,所以Golang程序需要以root身份运行
- 配置验证:确保osquery配置文件中
enable_file_events和enable_process_events设为true,否则不会生成事件 - 日志过滤:
stdio插件会输出osquery所有日志(包括启动日志、错误日志),所以需要通过event.Name筛选process_events和file_events - 存储扩展:示例中是写入本地文件,你可以根据需求修改
saveEvent函数,将数据写入MySQL、Redis等存储系统
内容的提问来源于stack exchange,提问作者User0987
相关产品推荐
相关产品推荐

