淺析云時代下主機的安全防護系統(tǒng)
傳統(tǒng)企業(yè)上云往往從購買云主機資產(chǎn)開始, 而安全風(fēng)險也隨之而來。云主機自身面臨多種多樣的安全問題,如主機可能被嘗試暴力破解,被種植各種病毒木馬軟件,甚至被加密勒索。主機所承載的業(yè)務(wù),也可能成為攻擊目標(biāo),比如客戶網(wǎng)站可能被注入網(wǎng)站后門。即使沒有被攻擊,主機系統(tǒng)、系統(tǒng)應(yīng)用所存在的安全漏洞也構(gòu)成潛在的安全風(fēng)險。
為了保障客戶的主機安全,百度智能云構(gòu)建了主機安全防護系統(tǒng)(HOSTEYE)。HOSTEYE目前覆蓋大部分百度智能云虛擬主機,為客戶提供資產(chǎn)清點、安全基線檢查、登錄管理、惡意文件查殺、網(wǎng)站后門查殺等多項安全防護功能,有效保障客戶云主機安全。本文將與大家分享HOSTEYE系統(tǒng)在設(shè)計與實現(xiàn)過程中的一些思考。
在引入云端概念的基礎(chǔ)上,我們對系統(tǒng)的數(shù)據(jù)流動模型做了新的定義。系統(tǒng)的數(shù)據(jù)可以簡單分類為安全信息和安全策略。安全信息是從客戶端采集,向云端流動的。比如某個虛機在某個時刻被某個惡意IP嘗試爆破,某個虛機在某個時刻發(fā)現(xiàn)惡意木馬,又或者某個主機在某個時刻發(fā)現(xiàn)有弱密碼。這些都可以認為是安全信息。
主機安全客戶端(Hosteye Agent)部署于幾乎所有的百度智能云虛擬主機和部分物理機。伴隨著百度智能云的迅速成長,HOSTEYE需要解決容量問題。HOSTEYE系統(tǒng)采用事件驅(qū)動的高性能IO復(fù)用服務(wù)器 + 高可用消息隊列 + 云端邏輯處理 的模型來解決這個問題,這也是很多大型互聯(lián)網(wǎng)系統(tǒng)的基本模型。在具體的實現(xiàn)過程中,以下兩點值得注意:
第一,Agent與Server端的通信是經(jīng)過加密的。在Server端處理消息解密是個CPU密集型任務(wù),特別是在系統(tǒng)客戶端較多、消息較多的場景下,經(jīng)常會打滿服務(wù)端CPU。考慮到消息加解密任務(wù)與業(yè)務(wù)邏輯相對獨立,我們將加解密任務(wù)與業(yè)務(wù)邏輯剝離開來,抽成獨立的功能模塊,并將其單獨部署。這種方式,為使用硬件加速消息加解密也提供了可能。第二,保證Agent與Server的通信有序。安全事件往往帶有時間戳,定義了事件間的先后順序,對安全策略分析非常關(guān)鍵。
由于使用了消息隊列,消息被打散分發(fā)至多個隊列,而多個隊列的消費能力不同,可能導(dǎo)致安全事件歸檔時時間亂序。在使用消息隊列時,HOSTEYE系統(tǒng)通過一致哈希等算法,保證同一客戶端消息分發(fā)到指定隊列,并保證同一客戶端消息被同一消費者消費。
HOSTEYE系統(tǒng)的目標(biāo)是Agent在為客戶提供安全服務(wù)的同時,不干擾客戶業(yè)務(wù)的正常運行。這其中最首要的內(nèi)容,就是占用極少的主機資源,如CPU/內(nèi)存/磁盤IO等。另一方面,HOSTEYE系統(tǒng)為客戶提供豐富的主機安全防護功能,覆蓋主機風(fēng)險發(fā)現(xiàn)、入侵檢測、安全審計等各個方面。某些功能,比如惡意文件查殺,需要掃描客戶文件,是資源密集型任務(wù)。
那么,如何同時滿足功能豐富、資源占用少的需求呢?HOSTEYE系統(tǒng)從四方面考慮,構(gòu)建一個輕量級的客戶端Agent。首先是從整體設(shè)計的角度,將負載上移。系統(tǒng)將客戶端較重的任務(wù),如文件掃描等,從客戶端轉(zhuǎn)移到云端,將更多的計算任務(wù)放在云端處理。
其次是做到功能可伸縮。每一個功能點在客戶端實現(xiàn)為一個可動態(tài)加載/卸載的功能模塊,如登錄管理模塊、網(wǎng)站后門查殺模塊等??蛻艨梢酝ㄟ^配置功能策略,選擇適合于自己場景的功能集合;客戶端按照功能策略,加載不同的功能集合。通過這種方式,客戶端不必加載全部功能集合,負載進一步減小。
第三是主動型資源控制。在客戶端負載確定的情況下,通過主動控制資源消耗,將客戶端資源限定在一定范圍內(nèi),比如單核5%以內(nèi)。具體實現(xiàn)時,在客戶端實現(xiàn)一個資源主控線程,監(jiān)控其他任務(wù)線程的資源使用狀況,如果任務(wù)線程出現(xiàn)CPU占用過高,則主動發(fā)送命令讓任務(wù)線程暫停任務(wù),從而降低對系統(tǒng)CPU的占用??梢砸孕盘柫孔鳛槊畹膶崿F(xiàn)方式,主線程發(fā)送自定義信號量,而任務(wù)線程需要在初始化時注冊該信號量的回調(diào)函數(shù)。
第四則是被動型的資源控制。當(dāng)客戶端因為某些非預(yù)期的問題,導(dǎo)致客戶端進程CPU長時間100%或者內(nèi)存占用持續(xù)超過設(shè)定閾值,則可以將客戶端進程退出。這樣做的首要目的是保護客戶業(yè)務(wù)不被影響??蛻舳吮;?,指的是保證客戶端進程持續(xù)在線,從而能夠與后端正常通信,保證系統(tǒng)功能的正常運行。幾乎所有客戶端軟件,當(dāng)其運行于多種多樣的客戶主機環(huán)境時,都可能碰到各種問題導(dǎo)致客戶端進程退出,從服務(wù)端視角看就是客戶端離線。
HOSTEYE系統(tǒng)在運維過程中,多次碰到客戶主機環(huán)境異常導(dǎo)致的客戶端退出問題,也碰到過客戶誤操作導(dǎo)致誤殺客戶端進程??蛻舳艘部赡茏孕型顺觯热缟衔奶岬降囊蛸Y源使用超標(biāo)導(dǎo)致的退出。因為客戶端部署于客戶主機環(huán)境,當(dāng)客戶端離線時,運維同學(xué)很難及時得到客戶授權(quán)去登錄客戶主機查看問題;客戶端離線場景下,從后端恢復(fù)服務(wù)也非常困難。因此,客戶端?;罘浅V匾?。
常見的?;钏悸贩浅:唵?,就是重啟客戶端進程。但這種方案非常粗暴。假設(shè)某個客戶端軟件存在內(nèi)存泄露問題,當(dāng)它自行崩潰或者被系統(tǒng)主動殺掉后,若重復(fù)拉起,對系統(tǒng)還會造成影響。在很多場景下,簡單的無休止重啟進程并沒有什么收益,反而可能對客戶的業(yè)務(wù)造成持續(xù)性影響。