0x01 對資產(chǎn)安全的探索
說到資產(chǎn)安全蛮拔,估計腦海中就會浮現(xiàn)巡風。使用巡風大半年痹升,感覺巡風特別好用建炫,特別適合中小型企業(yè),最關(guān)鍵的是不用錢就能把握內(nèi)網(wǎng)資產(chǎn)情況疼蛾。但是肛跌,使用巡風多少會遇到一些問題(最新版的巡風解決這些問題沒有我不清楚,我使用的是2017年1月份的版本),比如:
跨網(wǎng)段衍慎,巡風部署的位置訪問不到怎么辦转唉?
無法可視化巡風掃描任務(wù)狀態(tài),無法對任務(wù)進行單次掃描稳捆,立即開始掃描等赠法。
巡風獨立數(shù)據(jù)庫,無法把數(shù)據(jù)做好看給老板看乔夯。
單點部署的巡風期虾,往往IP會被拉入黑名單。
以上問題驯嘱,是針對本安全部使用巡風遇到的水土不服。
在這個數(shù)據(jù)的時代喳坠,動不動就是大數(shù)據(jù)鞠评,數(shù)據(jù)收集至關(guān)重要。相信大部分企業(yè)都有使用或者了解過ELK壕鹉,那么把巡風與ELK結(jié)合使用也許不錯剃幌,探索巡風與ELK結(jié)合使用的方案:
0x02 選擇開源項目
nmap
思考:
- 使用nmap作為主機掃描引擎,python第三方庫調(diào)用nmap方便晾浴,nmap掃描的結(jié)果滿足需求负乡。
部署:
安裝nmap
安裝python庫:
sudo pip install python-nmap
Celery
之前看到有文章提到考慮使用celery,最后卻未選擇Celery脊凰。
使用Celery思路
思考:
Celery是Python開發(fā)的分布式任務(wù)調(diào)度模塊抖棘,實時處理的任務(wù)隊列,同時也支持任務(wù)調(diào)度狸涌。Celery本身不含消息服務(wù)切省,它使用第三方消息服務(wù)來傳遞任務(wù),Celery支持的消息服務(wù)有RabbitMQ帕胆、Redis朝捆,當然Redis應(yīng)該是最佳選擇。
解決跨網(wǎng)段問題懒豹,這里只需要把Celery節(jié)點部署到無法到達的網(wǎng)段芙盘,并協(xié)調(diào)開通Celery節(jié)點到Redis端口的網(wǎng)絡(luò)策略即可,所有的掃描任務(wù)全部通過Reids調(diào)度由Celery來執(zhí)行脸秽。
解決任務(wù)狀態(tài)可視化問題儒老,這里只需要部署Celery的好伙伴Flower就可以完美解決。
小試牛刀
部署:
- 安裝python庫:
sudo pip install redis celery celery[redis]
Celery分布式架構(gòu):
創(chuàng)建tasks.py
(決定worker能做什么)
import nmap
from celery import Celery
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task
def hostScan(host, ports, arguments):
nm = nmap.PortScanner()
nm.scan(hosts=host, ports=ports, arguments=arguments)
啟動Celery worker: celery -A tasks worker -Q master --loglevel=info
創(chuàng)建run.py
(producer)
from tasks import hostScan
<br />
queue="master"
host="localhost"
ports="22,80"
arguments="-Pn -sV"
hostScan.apply_async(args=[host, ports, arguments], queue=queue)
運行run.py
记餐,即可調(diào)度worker執(zhí)行任務(wù)贷盲,這里worker執(zhí)行的是主機掃描任務(wù)。
Flower
Flower是Celery的一個實時監(jiān)控和管理Web界面工具
部署:
- 安裝python庫:
sudo pip install flower
啟動Flower:
flower --broker=redis://localhost:6379/0 --address=localhost --port=5555
Flower的任務(wù)監(jiān)控界面如下:
可以通過Flower監(jiān)控界面靈活調(diào)整任務(wù)速率,worker隊列等巩剖。
ELK
具體部署可以參考:沒錢的安全部之日志安全
0x03 解決方案
開源項目選擇完畢铝穷,開始動手實現(xiàn)。
Celery節(jié)點文件結(jié)構(gòu):
celerynode
|
|-- vuldb 漏洞掃描腳本庫
|
|-- api.py 提供server調(diào)用tasks
|
|-- tasks.py 芹菜任務(wù)列表
|
|-- common.py 公用函數(shù)庫
|
|-- Config.py 芹菜配置
大量部署Celery節(jié)點佳魔,啟動worker實現(xiàn)分布式曙聂。
通過Celery節(jié)點執(zhí)行主機掃描以及漏洞掃描任務(wù),考慮到安全性鞠鲜,不采納直接把數(shù)據(jù)壓到ES中宁脊,而是將所有的數(shù)據(jù)全部壓到Redis,通過logstash來寫入ES贤姆,最終便可以匯總數(shù)據(jù)榆苞。這里存在的安全問題是Celery擁有Redis的密碼,所以對Reids的加固是必然的霞捡。
Server端文件結(jié)構(gòu):
server
|
|-- lib
|
|-- static 靜態(tài)文件
|
|-- templates html頁面
|
|-- vul 漏洞掃描引擎
|
|-- vuldb 漏洞掃描腳本庫
|
|-- vulScan.py 漏洞掃描腳本引擎
|
|-- monitor 周期驗證引擎
|
|-- index.py 周期nmap掃描
|
|-- verify.py 周期探測port
Server主要是web界面坐漏,可視化執(zhí)行任務(wù),周期掃描配置等碧信。
vuldb漏洞庫赊琳,依舊使用巡風漏洞庫,畢竟大牛更高產(chǎn)砰碴,更新poc速度迅猛躏筏。
遇到的問題
周期執(zhí)行問題:
開始,希望選擇使用Celery Beat方式來做周期任務(wù)呈枉,發(fā)現(xiàn)無法動態(tài)修改趁尼,必須重啟Celery Beat。最后只能選擇開啟一條新的線程來監(jiān)聽周期任務(wù)猖辫。
漏洞庫更新問題:
這里與單點部署有些不同的是采用分布式弱卡,當需要上傳新的漏洞文件時,各個節(jié)點如何獲得新的文件住册?這里使用Redis的訂閱功能解決這個問題婶博。
import time
import json
import os
from redispool import getStrictRedis
FILE_PATH = os.path.split(os.path.realpath(__file__))[0] + '/vuldb/'
if __name__ == '__main__':
r = getStrictRedis()
p = r.pubsub()
p.subscribe("updateplugins")
while True:
try:
message = p.get_message()
if message:
m = json.loads(message["data"])
filename = m["filename"]
content = m["content"]
f = open(FILE_PATH + filename, "w")
f.write(content)
f.close()
time.sleep(10)
except Exception as e:
pass
Server端上傳文件后,通過updateplugins頻道推給各個節(jié)點荧飞,完成更新凡人。
0x04
這里本人簡單實現(xiàn)了一下以上想法:
將任務(wù)結(jié)果壓到ELK以后,便可以通過kibana可視化查看目前狀況叹阔,這里放一個測試數(shù)據(jù)的面板:
最終粗糙的輪子出來了挠轴,希望能給有需要的人提供幫助吧。
最后還是上個碼耳幢,有興趣部署探討來吧來吧: