攻防两端对外网资产的安全风险都很关注,在资源有限的情况下,怎么低成本地实现性能、扩展性都不错的、易运维的漏扫平台呢?
本篇站在白帽子的视角,聊一聊我的思路和实践。
本文会涉及到以下内容:
任务编排是什么?为什么需要任务编排?
任务编排在各公司的实践
我的方案?技术选型时的考量
我们可以通过粘合现有的工具做成一个扫描器,比如通过以下工具可以粗略完成资产收集、漏洞扫描
但是这里存在几个问题:
运维上的问题:想一想重新部署这种扫描器所需要的工作量,比如在新机器上你是否需要安装很多程序的依赖、修改很多程序配置;怎么知道扫描任务是否按照预期运行?能否统计出来任务执行中哪个环节最慢?
扩展性上的问题:当有一个效果更好的子域名发现工具时,无论它是什么语言写的,是否能够很方便地集成?是否能够方便地和公司 cmdb、工单平台集成?
性能上的问题:当有一个应急类的任务需要你在一天内对百万机器全端口做漏洞探测时,是否可以完成?能否自动扩容?
可用性上的问题:服务挂掉了是否能感知、自动恢复?某个扫描任务失败时能否感知、自动重试?
针对上面问题,下面我想向你介绍我的解决方法和思考过程。
我们可以想一下代码中集成工具,碰到技术栈不同怎么办?比如我们扫描引擎是 python 语言编写的,我们可以通过子命令调用 nmap,通过函数调用 oneforall,但如果某个工具(比如爬虫)是 nodejs 写的,这个时候怎么跨语言调用?而且我们还需要考虑到在部署时,我们还需要安装 c、go 程序依赖的系统动态库,python、java 程序依赖的解释器、lib 库,这些环节可能会出现意想不到的问题。
我们可以把程序构建成镜像,然后以命令行或者 api 服务的形式,向外部提供服务。这样工具无论是什么语言编写的,只要打包成镜像,就能以相同的方式被调用,也不用操心依赖的事情。
与此同时应用升级也会变得简单一点,我们可以用 github workflow 做镜像构建和推送、镜像 tag 管理应用版本。当然,我们也可以基于 kubernetes 生态来编排、管理服务。
基于 kubernetes 的 service 机制,我们很容易能够提供可用性、性能更好的服务,比如把 xray 打包成镜像后,以 service 形式暴露代理和漏扫功能。
基于 kubernetes 的健康检查机制、deployment 对象,也很方便地实现服务故障的感知和自动恢复。
kubernetes 生态也提供很大的便利。比如,基于 helm 很容易部署和升级服务,基于 kubesphere 可视化地管理集群和服务。
到这里有一个问题要考虑,子域名收集工具(oneforall/subfinder)、poc 扫描工具(nulei)这些能力应该以什么样的形式提供服务?它们本身能以命令行的方式被调用,那么有必要封装成 api 服务的形式吗?
如果要封装成 api 服务,就需要编写 api,这个 api 输入参数和命令行参数的映射关系也需要考虑,这里会有一些工作量,而且会让工具变得不灵活。
不论怎么样,调用方想要完成一次扫描,就需要调用各个能力,把整个工作流串起来。这个时候可以选择编写代码调用,但是更好的做法是基于任务编排来做这件事。下面向你介绍任务编排、它怎么应用在漏扫中。
任务编排是什么呢?按照我的理解,我们用 dsl 语言去描述任务,提交任务后,编排引擎最终可以完成任务。kubernetes、nuclei workflow[1]、github action 都有提供这种能力。
为什么我们需要任务编排呢?任务编排能够让我们以声明配置的方式,而不是写代码的方式去实现任务,这里最大的好处我理解是节省了工作量,很多相似的业务需求抽象出来让编排引擎统一实现了。
在前期调研阶段,我也发现有一些厂商漏扫平台是以任务编排为核心构建的,比如 潮汐开源社区[2],也了解到 soar、bas 产品的核心也在于任务编排,比如华云安的漏洞管理之自动化(Automation)[3]、腾讯 SOAR 的安全运营探索[4]、安全运营之 SOAR:架构雏形[5]。甲方厂商中也有以任务编排为核心的安全服务架构设计,见 宜信分布式安全服务编排实践[6]。
针对漏扫会有的需求:
支持定时任务,支持手动执行任务:定时任务可以用来实现日常巡检,手动执行任务可以应对应急类扫描、单次测试某个任务的场景
支持任务管理,包括任务启动、停止、恢复、删除、执行记录(包括程序日志、运行时间)、执行进度、失败任务记录和自动重试
支持多个业务逻辑单元的组合:比如"子域名收集-指定端口 poc 扫描"、"子域名收集端口扫描-poc 扫描"、"子域名收集-爬虫-漏扫"
以前工作中,还遇到过业务方要求只能晚上扫描。还有某些信息收集阶段会有些误报,需要人工修改后才能继续后面的扫描。
面对这些需求,我调研了 argo-workflows[7]、w5 soar[8] 两个开源的编排引擎。编排引擎我觉得很重要的是怎么调用应用、怎么在应用间传递数据,可视化任务编排对我来说不重要。w5 soar 只支持调用 python 应用,而不支持调用容器应用,argo-workflows 基于 kubernetes 调度,提供 ui、api、sdk、cmd 等交互方式,非常满足我的需求。
你可以参考argo-workflows的文档,结合我下面的模板体验一把拼积木式的漏扫开发。
以下任务模板中,main 是一个"subfinder 子域名收集-nuclei 扫描-存储扫描结果"的工作流
spec: templates: - name: main inputs: parameters: - name: domain steps: - - name: subdomain template: subdomain arguments: parameters: - name: domain value: '{{inputs.parameters.domain}}' - - name: nuclei template: nuclei arguments: artifacts: - name: hosts raw: data: '{{steps.subdomain.outputs.result}}' - - name: save-nuclei template: save-nuclei arguments: artifacts: - name: result from: '{{steps.nuclei.outputs.artifacts.nuclei-result}}' - name: subdomain inputs: parameters: - name: domain container: name: main image: projectdiscovery/subfinder:v2.5.5 args: - '-d' - '{{inputs.parameters.domain}}' resources: {} - name: nuclei inputs: artifacts: - name: hosts path: /tmp/host container: image: projectdiscovery/nuclei:v2.8.3 command: - nuclei args: - '-l' - /tmp/host - '-t' - exposures,misconfiguration,cnvd,vulnerabilities,workflows,exposed-panels - '-es' - info - '-o' - /tmp/nuclei-result.json outputs: artifacts: - name: nuclei-result path: /tmp/nuclei-result.json - name: save-nuclei inputs: artifacts: - name: result path: /tmp/result container: image: leveryd/x-tool:v2022.12.14 args: - '-f' - /tmp/result - '-api' - 'http://192.168.0.110:30274' # todo:config
启动一个扫描任务实例
查看任务实例状态
基于开源的安全工具、argo-workflows 编排引擎可以低成本的实现性能和扩展性都还不错的漏扫功能,基于 helm、kubesphere、argo-workflows ui 可以方便运维漏扫服务。
argo-workflows 的社区感觉不是很活跃,欢迎加我微信 happy_leveryd 和我交流。
[1]
nuclei workflow: https://nuclei.projectdiscovery.io/templating-guide/workflows/
[2]
潮汐开源社区: https://lev.zone/
[3]
漏洞管理之自动化(Automation): https://www.freebuf.com/articles/security-management/246149.html
[4]
腾讯 SOAR 的安全运营探索: https://security.tencent.com/index.php/blog/msg/196
[5]
安全运营之 SOAR:架构雏形: https://www.freebuf.com/articles/es/256988.html
[6]
宜信分布式安全服务编排实践: https://www.infoq.cn/article/9bslvn96torgkjxxuc4n
[7]
argo-workflows: https://github.com/argoproj/argo-workflows
[8]
w5 soar: https://github.com/w5teams/w5