使用Go進行可擴展的操做系統分析

http://https://blog.kolide.com/using-go-for-scalable-operating-system-analytics-cb170d85b1c5linux


在Kolide,咱們所作的一部分工做是構建一個客戶端 - 服務器系統,以便管理一個名爲osquery的開源工具的大型孤立安裝。 儘管過去我已經寫了關於osquery的文章,可是在這篇文章中,我想集中討論如何使用Go來解決咱們爲osquery社區和內部分佈式系統構建軟件所面臨的許多挑戰。git

Osquery是一個操做系統分析工具,它容許你使用SQL查詢來表達操做系統狀態。 而後,您可使用您但願用於監視主機的查詢的聲明式配置來提供osquery。 對於每一個查詢,您使用選項來定義如何記錄這些查詢的結果(即:每當結果集更改時記錄日誌,以設定的時間間隔記錄數據集的快照等)。 而後運營商可使用這些數據來建立和註釋基礎架構的當前不斷髮展的數據模型。 您還能夠存儲這些原始數據(JSON)並將其加載到HDFS或BigQuery等數據倉庫中。 分析這些數據對於完成與安全性,操做,設備管理和合規性相關的目標是有用的。docker

因此在Kolide,咱們在osquery和管理osquery基礎架構方面有不少經驗。 爲了使您的機羣中的osquery部署成功,您須要擁有出色的打包工具:osquery提供了許多功能,可是爲了利用其功能,配置可能至關複雜。 從osquery版本2.10.1開始,有115個可配置的選項。 經過文件系統的配置最有效地提供了文件的目錄結構。 您可使用自定義擴展,這些擴展將做爲平臺特定的二進制可執行文件進行分發。 爲了實現您的具體目標,您必須具備良好的工具來打包和分發osquery 。
管理osquery還須要勤奮的更新衛生:爲了利用最可靠的軟件,使您可以監控緊急威脅,您應該真正保持osqueryd的最新。 Osquery是一個快速移動的項目,整個社區都有不少偉大的工做。 使用可以根據「更新通道」(即:「beta」,「stable」)自動更新和管理osquery的osquery管理器使得這個過程更容易,特別是在客戶端和包管理可能不可靠的環境中。安全

Osquery啓動器


在Kolide,咱們用來管理osquery實例的工具,autoupdating osquery和創建與指定服務器的遠程通訊被稱爲「Launcher」。 你能夠在咱們的網站和GitHub上閱讀Launcher。 Launcher是用Go編寫的,幷包含許多細節,使得擴展osquery部署變得更容易。 對於Go開發者來講,我最喜歡的代碼庫中的一些特性/部分包括: 一個osquery運行時 ,暴露了一個程序化的Go界面,它利用了Dave Cheney( 博客 , 視頻 )流行的功能選項API模式。 一旦@groob將我引入這種模式,我就愛上了它。 這絕對須要更多的時間和樣板,可是由此產生的API的美感和附加的類型安全性使其成爲這些API的必備品。
一個現代的,類型安全的gRPC服務器規範 。 由Google建立的CNCF項目gRPC是一個優秀的RPC框架,基本上是基於HTTP2 協議緩衝區 ,具備大量有趣的功能。 咱們編寫了不少啓動器服務器,因此有一個定義良好的,版本化的服務器規範是有用的。
使用「更新框架」的安全的osquery自動更新系統 。 由Docker建立的一個CNCF項目TUF是一個規範,概述了一個強大而完整的同行評審更新機制。 規範闡明瞭一個客戶/服務器模型。 Kolide使用公證工具託管TUF服務器。 公證人 ,由Docker建立的一個CNCF項目提供了一個TUF服務器,咱們在Kolide編寫了一個名爲Updater的專用的TUF客戶端(固然是在Go中)。
全部這些組件在Launcher存儲庫( cmd / launcher / launcher.go )主文件的Launcher項目中鏈接在一塊兒。服務器

Kolide艦隊


Launcher旨在與知足提供的gRPC服務器規範的服務器進行通訊。 包生成器能夠很容易地分發啓動器和Osquery,但一臺服務器是必要的,以完成運輸。 爲此,有一個開源的osquery艦隊經理Kolide Fleet 。 咱們之前在這個博客上寫過關於Fleet的內容,Fleet的一個很好的特性就是它支持現有的osquery TLS服務器API以及新的osquery gRPC服務器API。 這使得用戶能夠經過現有的osquery部署輕鬆進行轉換。架構

模式


啓動器和軟件包生成器和Fleet都遵循相似的模式,咱們喜歡在Kolide的全部Go項目中遵循:
最小的程序文件應該老是在cmd / program /中。
不管什麼時候須要將慣用程序接口映射到遠程傳輸(如gRPC或HTTP),均可以使用Go-Kit。
使用新的Go Dep工具來管理依賴關係。
使用Dave Cheney的錯誤包來包裝錯誤。
若是您的CLI不是很是複雜的話,可使用OKLog中的Peter Bourgon創建的命令解析模式,而不是命令解析庫。
不要使用init,也不要使用包級變量。 Peter Bourgon至關有說服力地寫了這個 。 彼得說:框架

魔法很差; 全球狀態是魔術→沒有包水平變量; 沒有func init。

在您的API中傳播一個context.Context 。 使用此上下文來傳遞請求UUID之類的東西,這在請求分佈式跟蹤時頗有用。
爲每一個項目提供一個Dockerfile以促進Cloud Native測試和部署策略。分佈式

Kolide套件和風格指南

咱們已經寫了關於這些模式和更多的在咱們的Go風格指南 ,在咱們保留許多圍繞咱們的項目常用的Go庫和助手的庫中: kolide / kit 。 咱們有許多實用程序和幫助程序,使得編寫現代TLS服務器變得更加簡單,在Go-Kit Logger之上還有更多幫手。 咱們認爲這些圖書館能夠是通常的有用的,咱們計劃在將來的博客更多。ide

一致的開發人員使用GNU Make的經驗

除了Fleet,Launcher,Updater和Kit以外,咱們在這個領域還有一些內部的項目。 明顯沒有走出monorepo的道路,在全部這些項目中保持必定的緊密關係確實增長了開發者的經驗。
每當Kolide的開發人員建立一個新的Go回購,他們將添加一個相似的Makefile
每一個Kolide項目使用的基本Makefile結構須要如下命令:工具

make deps
make test
make build
./build/template --help
./build/template version
#安裝依賴關係管理器並調用它 
  #如今全部的kolide項目都使用dep,可是咱們之前老是使用glide 
  #把這個隱藏在`make deps`以後,這個過渡是透明的 
 作出決定 
  #運行完整的測試套件 
  #這是(但願)只是一個輕包裝上去測試 
  #有時咱們也在這裏添加短毛絨和靜態分析儀 
 作測試 
  #爲您的平臺構建二進制文件 
  #你也能夠運行`make xp`來交叉編譯一個mac和linux二進制文件 
 使創建 
  ##如今你能夠運行程序,得到幫助和版本信息 
  ./build/template --help 
  ./build/template版本

這裏包含了一個實現上述功能的Makefile文件。 注意kolide/kit的version包的使用方法,用於將基於git的版本工具輕鬆添加到程序中。

此外,請考慮使用kolide / kit版本包和OKLog命令解析模式的該程序的最小主文件 。對於這個例子,這些文件應該在Makefile和cmd/template/template.go ,但顯然路徑和template字符串須要替換爲您的使用。

開發基礎設施:Docker Compose和Minikube

咱們的許多Go(和非Go)項目都須要某種基礎設施來實現有效的本地開發。 例如,Kolide Fleet須要MySQL和Redis 。 MailHog對測試SMTP功能也頗有用。 爲了解決這個本地開發的需求,咱們一般使用Docker Compose 。 例如,查看Fleet的docker-compose.yml 。 從此,我想開始將全部這些定義爲Kubernetes部署或ReplicaSet,並經過Minikube管理本地開發基礎架構。 因爲咱們在科裏德生產Kubernetes,因此這種與當地環境的平衡將是進一步縮小開發和生產之間差距的有趣途徑。

結論

在Kolide,咱們建立和管理客戶端 - 服務器軟件,使操做系統分析變得簡單,現代和可擴展。 這個領域很是適合Go擅長的領域。 咱們喜歡寫最好的Go,咱們能夠不斷嘗試改進。 若是你認爲你能夠幫助咱們寫出好的Go, 咱們正在招聘 !

相關文章
相關標籤/搜索