没有钱的安全部之资产安全
0x01 对资产安全的探索
说到资产安全,估计脑海中就会浮现巡风。使用巡风大半年,感觉巡风特别好用,特别适合中小型企业,最关键的是不用钱就能把握内网资产情况。但是,使用巡风多少会遇到一些问题(最新版的巡风解决这些问题没有我不清楚,我使用的是2017年1月份的版本),比如:
- 跨网段,巡风部署的位置访问不到怎么办?
- 无法可视化巡风扫描任务状态,无法对任务进行单次扫描,立即开始扫描等。
- 巡风独立数据库,无法把数据做好看给老板看。
- 单点部署的巡风,往往IP会被拉入黑名单。
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
创建run.py
(producer)
from tasks import hostScan
queue="master"
host="localhost"
ports="22,80"
arguments="-Pn -sV"
hostScan.apply_async(args=[host, ports, arguments], queue=queue)
运行run.py,即可调度worker执行任务,这里worker执行的是主机扫描任务。
Flower
Flower是Celery的一个实时监控和管理Web界面工具
部署:
安装python库:sudo pip install flower
启动Flower:
flower --broker=redis://localhost:6379/0 --address=localhost --port=5555
Flower的任务监控界面如下:
可以通过Flower监控界面灵活调整任务速率,worker队列等。
ELK
具体部署可以参考:没钱的安全部之日志安全
0x03 解决方案
开源项目选择完毕,开始动手实现。
Celery节点文件结构:
celerynode
|
|-- vuldb 漏洞扫描脚本库
|
|-- api.py 提供server调用tasks
|
|-- tasks.py 芹菜任务列表
|
|-- common.py 公用函数库
|
|-- Config.py 芹菜配置
大量部署Celery节点,启动worker实现分布式。
通过Celery节点执行主机扫描以及漏洞扫描任务,考虑到安全性,不采纳直接把数据压到ES中,而是将所有的数据全部压到Redis,通过logstash来写入ES,最终便可以汇总数据。这里存在的安全问题是Celery拥有Redis的密码,所以对Reids的加固是必然的。
Server端文件结构:
server
|
|-- lib
|
|-- static 静态文件
|
|-- templates html页面
|
|-- vul 漏洞扫描引擎
|
|-- vuldb 漏洞扫描脚本库
|
|-- vulScan.py 漏洞扫描脚本引擎
|
|-- monitor 周期验证引擎
|
|-- index.py 周期nmap扫描
|
|-- verify.py 周期探测port
- Server主要是web界面,可视化执行任务,周期扫描配置等。
- vuldb漏洞库,依旧使用巡风漏洞库,毕竟大牛更高产,更新poc速度迅猛。
遇到的问题
周期执行问题: 开始,希望选择使用Celery Beat方式来做周期任务,发现无法动态修改,必须重启Celery Beat。最后只能选择开启一条新的线程来监听周期任务。 漏洞库更新问题: 这里与单点部署有些不同的是采用分布式,当需要上传新的漏洞文件时,各个节点如何获得新的文件?这里使用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频道推给各个节点,完成更新。
0x04
这里本人简单实现了一下以上想法:
将任务结果压到ELK以后,便可以通过kibana可视化查看目前状况,这里放一个测试数据的面板:
最终粗糙的轮子出来了,希望能给有需要的人提供帮助吧。
最后还是上个码,有兴趣部署探讨来吧来吧:
https://github.com/superhuahua/xunfengES
来源:SuperFace的简书关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号
随时掌握互联网精彩
随时掌握互联网精彩
赞助链接
排名
热点
搜索指数
- 1 澳门是伟大祖国的一方宝地 7982411
- 2 上海地铁又现致歉信专用章 7955003
- 3 星巴克大罢工 7883926
- 4 2024 向上的中国 7792058
- 5 向佐 我一踢腿就会走光 7611744
- 6 韩国南部金海市某部队发生爆炸 7548434
- 7 特朗普:马斯克不会成为总统 7413737
- 8 张雨绮 为了讨大家喜欢才穿成这样 7309693
- 9 80岁顶级富豪再婚娶33岁华裔妻子 7286500
- 10 大S老公具俊晔站C位跳女团舞 7167013