Golang 擴展 osquery,讓系統查詢更強大!

在深圳有很多老闆都很奇葩,比如我的前老闆,需求是半夜給的,效果是要早上看到的,我要感謝我的的前老闆,讓我接觸到了聞所未聞的新奇技術。今天要分享的內容是 osquery 這個東西,不知道各位萬能的網友們知不知道。osquery 是一個強大的開源工具,它能讓我們像查詢數據庫一樣獲取操作系統信息。而 osquery-go 則是官方提供的 Golang SDK,可以讓我們擴展 osquery,添加自定義查詢表,獲取更多自定義信息。本文將介紹如何使用 osquery-go 擴展 osquery,並創建一個自定義表,獲取主機信息和環境變量。

什麼是 osquery-go?

osquery-go 是 osquery 的官方 Golang SDK,它的主要功能包括:

我們可以使用 osquery-go 添加自己的查詢表,並將其註冊到 osquery,這樣就能在 osqueryi 交互式終端中執行 SQL 語句查詢我們的數據。

如何使用 osquery-go 自定義 osquery 擴展?

osquery 允許用戶通過**擴展(Extension)**機制添加新的 SQL 查詢表。

擴展的工作流程如下:

1.osqueryd 進程啓動,並監聽擴展連接請求。

2.Golang 編寫的 osquery-go 擴展進程連接 osqueryd。

  1. 擴展註冊新的 SQL 查詢表,並提供查詢邏輯。

  2. 用戶可以在 osqueryi 終端中執行 SQL 語句查詢新表。

使用 osquery-go 實現擴展

首先我們新建一個 go 項目並添加依賴,具體操作如下所示:

mkdir cosquery
cd cosquery && go mod init cosquery
go get github.com/osquery/osquery-go

接着我們鍵入如下代碼:

package main
import (
	"context"
	"log"
	"os"
	"github.com/osquery/osquery-go"
	"github.com/osquery/osquery-go/plugin/table"
)
// 定義自定義表
func customInfoTable() *table.Plugin {
	columns := []table.ColumnDefinition{
		table.TextColumn("hostname"),  // 主機名
		table.TextColumn("env_var"),   // HOME目錄
	}
	return table.NewPlugin("custom_info", columns, generateCustomInfo)
}
// 生成查詢結果
func generateCustomInfo(ctx context.Context, queryContext table.QueryContext) ([]map[string]string, error) {
	hostname, _ := os.Hostname()
	envVar := os.Getenv("HOME") // 這裏獲取的是HOME變量
	result := []map[string]string{
		{
			"hostname": hostname,
			"env_var":  envVar,
		},
	}
	return result, nil
}
func main() {
	// 連接osqueryd
	server, err := osquery.NewExtensionManagerServer("custom_extension""/var/osquery/osquery.em")
	if err != nil {
		log.Fatalf("無法創建osquery擴展: %v", err)
	}
	// 註冊自定義表
	server.RegisterPlugin(customInfoTable())
	// 啓動擴展
	if err := server.Run(); err != nil {
		log.Fatalf("擴展運行失敗: %v", err)
	}
}

代碼解析

1. 創建查詢表

columns := []table.ColumnDefinition{
	table.TextColumn("hostname"),  
	table.TextColumn("env_var"),   
}

這裏定義了 custom_info 表,它包含兩個字段:

2. 生成查詢結果

func generateCustomInfo(ctx context.Context, queryContext table.QueryContext) ([]map[string]string, error) {
	hostname, _ := os.Hostname()
	envVar := os.Getenv("HOME")
	result := []map[string]string{
		{
			"hostname": hostname,
			"env_var":  envVar,
		},
	}
	return result, nil
}

3. 連接 osqueryd 並註冊擴展

server, err := osquery.NewExtensionManagerServer("custom_extension""/var/osquery/osquery.em")

測試並運行,前提必須確保 osquery 後臺程序是正常在運行的

go run main.go 
or
go build .
./cosquery

查詢結果如下所示:

➜ osqueryi
> select * from custom_info;
+------------+------------+
| hostname   | env_var    |
+------------+------------+
| xxxxx      | /home/xxxx/ |
+------------+------------+

osquery 的適用場景

osquery-go 適用於:

總結

本文介紹瞭如何使用 osquery-go 擴展 osquery,包括:

osquery-go 的基本原理

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/vw8GqodBDCaRDyfBZ1PJ6Q