Golang 擴展 osquery,讓系統查詢更強大!
在深圳有很多老闆都很奇葩,比如我的前老闆,需求是半夜給的,效果是要早上看到的,我要感謝我的的前老闆,讓我接觸到了聞所未聞的新奇技術。今天要分享的內容是 osquery 這個東西,不知道各位萬能的網友們知不知道。osquery 是一個強大的開源工具,它能讓我們像查詢數據庫一樣獲取操作系統信息。而 osquery-go 則是官方提供的 Golang SDK,可以讓我們擴展 osquery,添加自定義查詢表,獲取更多自定義信息。本文將介紹如何使用 osquery-go 擴展 osquery,並創建一個自定義表,獲取主機信息和環境變量。
什麼是 osquery-go?
osquery-go 是 osquery 的官方 Golang SDK,它的主要功能包括:
-
查詢 osqueryd 進程,執行 SQL 查詢
-
註冊擴展,讓 osquery 識別新的查詢表
-
創建自定義插件,比如查詢 Kubernetes、Docker 等信息
我們可以使用 osquery-go 添加自己的查詢表,並將其註冊到 osquery,這樣就能在 osqueryi 交互式終端中執行 SQL 語句查詢我們的數據。
如何使用 osquery-go 自定義 osquery 擴展?
osquery 允許用戶通過**擴展(Extension)**機制添加新的 SQL 查詢表。
擴展的工作流程如下:
1.osqueryd 進程啓動,並監聽擴展連接請求。
2.Golang 編寫的 osquery-go 擴展進程連接 osqueryd。
-
擴展註冊新的 SQL 查詢表,並提供查詢邏輯。
-
用戶可以在 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 表,它包含兩個字段:
-
hostname:當前主機名
-
env_var:環境變量(HOME 目錄)
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
}
-
os.Hostname() 獲取主機名
-
os.Getenv("HOME") 獲取環境變量
3. 連接 osqueryd 並註冊擴展
server, err := osquery.NewExtensionManagerServer("custom_extension", "/var/osquery/osquery.em")
-
這裏 custom_extension 是擴展的名稱
-
/var/osquery/osquery.em 是 osqueryd 監聽擴展的通信 socket
測試並運行,前提必須確保 osquery 後臺程序是正常在運行的
go run main.go
or
go build .
./cosquery
查詢結果如下所示:
➜ osqueryi
> select * from custom_info;
+------------+------------+
| hostname | env_var |
+------------+------------+
| xxxxx | /home/xxxx/ |
+------------+------------+
osquery 的適用場景
osquery-go 適用於:
-
安全運維:檢測異常進程、文件修改等
-
系統監控:採集服務器狀態、網絡連接
-
運維管理:查詢進程、軟件安裝情況
-
日誌分析:解析系統日誌,提供 SQL 查詢能力
總結
本文介紹瞭如何使用 osquery-go 擴展 osquery,包括:
osquery-go 的基本原理
-
創建自定義 SQL 查詢表
-
編寫 Golang 代碼實現自定義 osquery 擴展
-
運行並測試了自定義的擴展程序
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/vw8GqodBDCaRDyfBZ1PJ6Q