作者:Elkeid Team
公眾號:災難控制 局

此前我們已開源了自研的主機層入侵檢測系統Elkeid(原AgentSmith-HIDS)端上的能力(Agent/Driver/以及部分Agent插件)。本次為Elkeid開源計劃的第二部分:Server后臺模塊。

目前,Elkeid完整版本部署規模已達到100萬量級,其穩定性/性能/數據采集能力/檢測能力/溯源能力等均得到了實戰驗證,均有不俗表現。

我們希望通過開源的方式和大家分享我們踩過的坑,向優秀同行學習,回饋行業。

關于 Elkeid Server

Elkeid Server 需要配合端上的數據采集層(Elkeid Driver/Agent)一起使用,實現了對大規模Agent的監控,管理和策略更新。能適配各種復雜的網絡環境,可單機也可集群部署。具體部署方案,請移步Repo查看。

開源地址:https://github.com/bytedance/Elkeid/tree/main/server

開源協議:Apache-2.0

Elkeid Server 組件簡介

Elkeid Server 架構如下:

Elkeid Server 大體包含4個模塊:

  • AgentCenter:負責與Agent進行通信,采集Agent數據并簡單處理后匯總到消息隊列集群,同時也負責對Agent進行管理包括Agent的升級,配置修改,任務下發等。

  • ServiceDiscovery:后臺中的各個服務模塊都需要向ServiceDiscovery中心定時注冊、同步服務信息,從而保證各個服務模塊中的實例相互可見,便于直接通信。

  • Manager:負責對整個后臺進行管理并提供相關的查詢、管理接口。

  • 實時/離線計算模塊:消費server采集到消息隊列中的數據,進行實時和離線的分析與檢測。(此部分還未開源)

簡單來說就是:

  • AgentCenter收集Agent數據

  • Manager管理著AgentCenter和這些計算模塊

  • ServiceDiscovery把這些所有的服務、節點都串聯了起來

  • 實時/離線計算模塊對這些數據進行分析和檢測

本次開源部分是架構圖中的AgentCenter、ServiceDiscovery和Manager三部分。

產品優勢

  • 百萬級Agent的后臺架構解決方案

  • 分布式,去中心化,集群高可用

  • 部署簡單,依賴少,便于維護

資源需求參照表

技術細節

Elkeid AgentCenter(下面簡稱AC)

AC一方面需要從Agent采集數據并進行初步處理,然后把處理后數據寫入Kafka集群(供后續分析模塊消費),另一方面要向Agent下發指令,這個通信是雙向的。

同時AC也對外提供HTTP接口,Manager通過這些HTTP接口實現對AC和Agent的管理和監控。

示意圖:

相關技術介紹:

  • 通信效率:在百萬級Agent的情況下,如此大量級的數據對后端的壓力不容小覷。而通信和處理效率主要受通信協議和編碼方式的影響。對比各種通信方式,我們最終選擇使用gRPC雙向流的方式。

    • 一方面gRPC基于HTTP2協議標準設計開發,相對于其他RPC框架,gRPC帶來了更多強大功能,如雙向流、頭部壓縮等。這些都很好的符合我們現在的需求,同時通信效率也很高。

    • 另一方面我們采用Protobuf作為編碼方式。Protobuf具備了標準的IDL和IDL編譯器,同時序列化數據非常簡潔,緊湊;另外編解碼速度在眾多序列化協議中也處于領先。

  • 通信安全性:Agent是具備root權限的應用,Server具備對Agent下發指令的能力,如果通信鏈路被控制,將是災難性的。這里我們使用了雙向SSL校驗,一方面保證了Agent/Server不會與未知的對端通信,另一方面SSL也保證了通信過程數據都是加密的。

Elkeid Service Discovery(下面簡稱SD)

服務發現/負載均衡機制大致兩個設計思路,一個集中代理,一個是端代理。

集中代理方式例如F5、nginx,請求先發送到集中代理點,代理再根據一定的負載均衡算法進行轉發,服務的響應也會先到代理點,再轉發到請求端。這個方式雖然是最常見的,但有兩個問題,一個是經過代理來回轉發,請求響應的時延會增加,另一個是在大規模Agent請求下,代理點的負載壓力太大,因此在大規模部署的環境下不能使用這個方案。

端代理方式需要一個服務發現注冊中心的服務,如下:

示意圖:

相關技術介紹:

  • 服務提供方定時向SD發送注冊信息,包括服務名字,實例ip,端口,負載狀態等,這樣SD就維護著所有這個服務實例的狀態。

  • SD這個服務中的各個節點間需要進行數據同步,例如上面1中注冊信息發送到NodeA上,NodeA需要把這個信息同步給NodeB,這樣如果有請求訪問NodeB,NodeB也有對應的注冊信息。

  • 服務使用方通過服務名,請求服務發現/注冊中心,獲取對應服務名下能使用的實例IP、端口列表,進而可以直接訪問。

  • SD各個節點間的數據同步是以廣播的方式批量同步,保證了一定的性能。某個時間點節點間的數據并不是一致的,但最終能保持一致,滿足分布式CAP理論中的AP,在大規模Agent,AC場景下,并沒什么影響。此外也沒用到任何一致性中間件(etcd,zookeeper等),部署方便,維護簡單。

  • 由于SD維護了各個注冊服務的狀態信息,所以當服務使用方在請求服務發現時,SD會進行負載均衡。比如Agent請求獲取AC實例列表,SD直接返回負載壓力最小的AC實例。

Elkeid Manager

Manager管理整個后臺,并提供各種查詢、管理接口。包括管理AC集群,監控AC狀態,控制AC服務相關參數,并通過AC管理所有的Agent,收集Agent運行狀態,往Agent下發任務,同時manager也管理實時和離線計算集群。

鑒于Manager管理著后臺的各個集群,所以任何的管理操作都是對集群的操作,調用Manger的接口請求會通過Manager轉發給目標集群所有的節點,然后再收集所有節點的響應,再進行處理。為了提升這個過程的響應速度和穩定性,Manager內部實現了一個簡單的分布式任務管理系統。

示意圖:

相關技術介紹:

  • Manager向集群發送請求,為提高并發能力,會啟動多個協程同時下發。

  • Manager本身也是個集群,同一個任務Manager節點間也會進行同步,進一步提升任務下發的并發能力。例如,10個manager節點要操作一個1000個節點的集群,一個操作指令會同步到10個manager節點,每個節點可以啟動100個協程并發的向1000個節點下發操作命令。

  • 返回的結果會在全局的存儲和緩存里進行處理、匯總。

  • 當前支持的功能有:

    • Agent管理:Tags

    • Agent任務下發:分布式任務下發,并行處理,重試

    • AC負載均衡控制:根據AC負載,動態調整AC連接數

    • Agent狀態采集和統計

    • Agent任務查詢與對賬

Elkeid Agent版本更新

之前的Elkeid Agent受限于Server沒有開源,提供受限的數據傳輸能力(kafka),所以裁剪了較多功能(主要是與數據傳輸、指令下發、插件配置相關)。

在這次Server開源之后,Agent也一同進行了更新,在使用新版本Agent時請注意以下四點:

1.編譯Agent所需的Go編譯鏈升級到了1.16

在最新版本Agent中用到了1.16編譯鏈的go embed功能,另外優化了內存使用情況,詳情查看:https://golang.org/doc/go1.16

2.編譯前對通信相關的安全證書、參數進行配置

agent/transport/connection 目錄中的ca.crt、client.key、client.crt分別是自簽名的ca證書,客戶端私鑰,客戶端證書,請與Server生成證書時一同替換修改。product.go中可以配置與Server通信的地址,并支持復雜網絡情況下的通信配置,具體請查看Agent的readme。

3.功能插件的開啟與關閉不再依賴config.yaml,通過Manager API動態下發

每個Agent默認是空配置,不具備任何安全能力,只承載控制/通信/自身監控能力。如果需要開啟安全功能,需要通過相應API進行配置并下發插件,配置將會持久化存儲在后端,并在連接建立時自動下發。進一步,可以通過下發配置對Agent進行自升級(需要被守護拉起),或者升級指定功能插件。

4.請自行選用合適的守護/自保護方式,并置于后臺執行

推薦采用systemd托管服務,并加入cgroup限制資源使用,設置進程工作目錄等,否則可能會出現自升級等功能異常的情況。

后續計劃

Elkeid 會長期維護更新;且后續會陸續開源更多Agent Plugin以及RSAP。

我們計劃22年4月底/五月初在飛書群【 Elkeid 交流群】舉行一次線上的技術交流,主要內容是Elkeid Server開源版本的設計實現細節和代碼結構等,歡迎大家關注。

致謝及交流

非常感謝項目開發/推動過程中相關團隊/同學的支持與幫助。

歡迎大家通過GitHub或飛書群【 Elkeid 交流群】進行交流討論和建議反饋。

Elkeid項目地址: https://github.com/bytedance/Elkeid

飛書群二維碼:


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1566/