信息安全听白帽子给你讲安全系统运维专家

没有钱的安全部之资产安全

2017-06-20  本文已影响2208人  SuperFace

0x01 对资产安全的探索

说到资产安全,估计脑海中就会浮现巡风。使用巡风大半年,感觉巡风特别好用,特别适合中小型企业,最关键的是不用钱就能把握内网资产情况。但是,使用巡风多少会遇到一些问题(最新版的巡风解决这些问题没有我不清楚,我使用的是2017年1月份的版本),比如:

以上问题,是针对本安全部使用巡风遇到的水土不服。

在这个数据的时代,动不动就是大数据,数据收集至关重要。相信大部分企业都有使用或者了解过ELK,那么把巡风与ELK结合使用也许不错,探索巡风与ELK结合使用的方案:

架构.png

0x02 选择开源项目

nmap

思考:

部署:

Celery

之前看到有文章提到考虑使用celery,最后却未选择Celery。

Celery文档

使用Celery思路

思考:

小试牛刀

部署:

Celery分布式架构:

celery-worker.png

创建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
<br />
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界面工具

部署:

启动Flower:

flower --broker=redis://localhost:6379/0 --address=localhost --port=5555

Flower的任务监控界面如下:

flower.png

可以通过Flower监控界面灵活调整任务速率,worker队列等。

ELK

具体部署可以参考:没钱的安全部之日志安全

0x03 解决方案

开源项目选择完毕,开始动手实现。

Celery节点文件结构:

celerynode
|
|-- vuldb 漏洞扫描脚本库
|
|-- api.py 提供server调用tasks
|
|-- tasks.py 芹菜任务列表
|
|-- common.py 公用函数库
|
|-- Config.py 芹菜配置

Server端文件结构:

server
|
|-- lib 
|
|-- static 静态文件
|
|-- templates html页面
|
|-- vul 漏洞扫描引擎
    |
    |-- vuldb 漏洞扫描脚本库
    |
    |-- vulScan.py 漏洞扫描脚本引擎
|
|-- monitor 周期验证引擎
    |
    |-- index.py 周期nmap扫描
    |
    |-- verify.py 周期探测port

遇到的问题

周期执行问题:

开始,希望选择使用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

这里本人简单实现了一下以上想法:

界面.png

将任务结果压到ELK以后,便可以通过kibana可视化查看目前状况,这里放一个测试数据的面板:

kibana.png

最终粗糙的轮子出来了,希望能给有需要的人提供帮助吧。

最后还是上个码,有兴趣部署探讨来吧来吧:

https://github.com/superhuahua/xunfengES

上一篇下一篇

猜你喜欢

热点阅读