You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:50:29