0x01 拓荒時(shí)期
最早期設(shè)計(jì)調(diào)度器的原因基于當(dāng)前環(huán)境有個(gè)需求,需要使用調(diào)度器通過(guò)安全平臺(tái)API將任務(wù)全部拉取下來(lái),并根據(jù)平臺(tái)的掃描參數(shù)進(jìn)行任務(wù)的下發(fā)、執(zhí)行、狀態(tài)的判斷、結(jié)果拉取。

當(dāng)時(shí)沒(méi)有特別多的想法,只想一路往前跑,不管結(jié)果如何,先上,畢竟安全團(tuán)隊(duì)屬于剛起步階段,在創(chuàng)業(yè)公司,如果沒(méi)有創(chuàng)造足夠的價(jià)值,隨時(shí)都有可能被干掉,這種危機(jī)感逼迫著自己前進(jìn)。

由于時(shí)間有限,我們需要在極短的時(shí)間將工具鏈條輸出,讓運(yùn)維人員和安全人員上手,并且大幅度的提高整個(gè)自動(dòng)化的能力,所以,在設(shè)計(jì)上比較粗糙,并沒(méi)有做過(guò)多的深入。當(dāng)時(shí)想的是,能夠滿(mǎn)足一個(gè)小階段的需求,就ok,畢竟內(nèi)部安全產(chǎn)品是需要不斷的迭代和打磨,才能真正的走向業(yè)務(wù)。

千萬(wàn)別小看它,在前面任職的公司也曾用它,現(xiàn)在的公司也在用它雖然版本更新了,fix了部分的bug。在線上跑的時(shí)候,遇到各種問(wèn)題,首先最大的問(wèn)題就是用戶(hù)的輸入無(wú)法掌控,明明特別好的東西,到用戶(hù)手里可能就變了。針對(duì)這些坑讓人實(shí)在頭大,且之前的架構(gòu)由于著急上線,沒(méi)有做完整的梳理,導(dǎo)致問(wèn)題越發(fā)嚴(yán)重,初步列了下這個(gè)版本出現(xiàn)的問(wèn)題:
- 守護(hù)進(jìn)程down掉,沒(méi)有任何的提醒。
- 用戶(hù)輸入異常,調(diào)度器在讀取數(shù)據(jù)的時(shí)候沒(méi)有做容錯(cuò),導(dǎo)致調(diào)度器死亡。
- 日志記錄不清晰,只記錄了關(guān)鍵代碼以及關(guān)鍵位置,但是針對(duì)一些高頻的動(dòng)作沒(méi)有做記錄。
- 封包依賴(lài)太多,導(dǎo)致安裝過(guò)程困難,運(yùn)維成本提升。
- 邏輯耦合太多,沒(méi)有做線點(diǎn)拆分。
- 數(shù)據(jù)沒(méi)有統(tǒng)一化管理,多點(diǎn)、多文件,定位故障困難。
0x02 革命時(shí)期
針對(duì)這些問(wèn)題,做了一些梳理,跟內(nèi)部的安全、運(yùn)維的小伙碰了下,決定將調(diào)度器改了,把這些坑先滅了再說(shuō)。舊的先讓業(yè)務(wù)跑著,不中斷。新的在后面盡快開(kāi)發(fā)、測(cè)試上線。
我們先把整個(gè)架構(gòu)梳理了一遍,把我現(xiàn)在有的或者準(zhǔn)備整合的業(yè)務(wù)做全面的梳理,看看調(diào)度器具體要管的節(jié)點(diǎn)有哪些,根據(jù)這些節(jié)點(diǎn),設(shè)計(jì)不同的微服務(wù),并且將服務(wù)和schedule進(jìn)行全面的耦合。

這會(huì)正好Bingli在順豐過(guò)得不太happy,毅然決定加入拉勾安全團(tuán)隊(duì)。(<code>對(duì)于有想法有能力的小伙,老板重來(lái)不看學(xué)歷,只看輸出,這里給我們@侯老板點(diǎn)個(gè)贊。</code>)我們開(kāi)始謀劃著這個(gè)調(diào)度器的設(shè)計(jì),不斷碰撞,不斷把思路捋順,這次沒(méi)有著急動(dòng)手,原因是想規(guī)避之前的錯(cuò)誤。
新的調(diào)度器技術(shù)選型用的是nodejs來(lái)做整個(gè)調(diào)度器,在剛接觸這個(gè)語(yǔ)言的時(shí)候,我就深深的愛(ài)上了它,node這個(gè)輕量舒服的語(yǔ)言簡(jiǎn)直就是為調(diào)度器量身定做的,同時(shí),在國(guó)內(nèi)有專(zhuān)業(yè)的社區(qū)支撐以及安裝配置簡(jiǎn)單,毫無(wú)壓力,版本差異化沒(méi)有特別大的問(wèn)題,就這點(diǎn),我相信這就是運(yùn)維的福音,果斷的就選擇它。
- 開(kāi)發(fā): node.js v6.3.0
- DB: mysql/redis
0x03 摸索到的問(wèn)題
新的調(diào)度器開(kāi)發(fā)的過(guò)程特別順利,花了短短兩天多點(diǎn)的時(shí)間,我就把整個(gè)調(diào)度器都改寫(xiě)一遍。


我們這個(gè)階段解決的問(wèn)題:
- 調(diào)度器需要多緯度的支持,不管新接入的是什么設(shè)備,什么工具,都需要以配置化,活體動(dòng)態(tài)加載;
- 針對(duì)抓取的數(shù)據(jù),做雙層檢測(cè),確保數(shù)據(jù)是正確的,同時(shí)在重要的功能部位加入埋點(diǎn),確保數(shù)據(jù)可控;
- 調(diào)度器需要設(shè)置失敗的監(jiān)控,錯(cuò)誤重試,并且上報(bào)異常等動(dòng)作,確保重要感知;
0x04 線上running
在調(diào)度器竣工后,我們直接用在新的環(huán)境上,在后續(xù),我們只需要專(zhuān)注掃描節(jié)點(diǎn)的開(kāi)發(fā)即可,當(dāng)然,為了滿(mǎn)足短期的需求,web上的功能我們也已經(jīng)完成,研發(fā)可以在上線之前自動(dòng)開(kāi)啟一個(gè)掃描來(lái)確認(rèn)風(fēng)險(xiǎn)是否存在。


0x04 寫(xiě)在最后
每個(gè)迭代打磨都是對(duì)技術(shù)的錘煉和感悟,所有的菜鳥(niǎo)都是從這個(gè)階段過(guò)來(lái)的,感謝機(jī)會(huì),感謝身邊的人。