在 2020 年 12 月,我写了公众号的第一篇文章 — “自动化安全工具平台 - 架构笔记”,文章介绍了前几年我在写个人自动化安全工具平台的过程中,关于架构方面的一些尝试和总结。也因这篇文章,在 2021 年 5 月,我有幸加入了长亭,负责红队自动化渗透测试平台项目。这篇笔记是近半年多来,我和团队师父们在平台架构方面的一些思考、尝试和总结,主要内容包括:
欢迎关注
关于平台,这里结合文章标题中包含的关键词来进行介绍。
关键词一:渗透测试平台
渗透测试平台相比于之前个人开发使用的安全工具平台,它主要的不同点在于:
关键词二:分布式
为了具备良好的扩展性,平台采用了分布式架构,利用消息队列解耦任务的发送和执行,通过增加消费者的数量,实现更高的扫描速度和并发支持。
关键词三:自动化
主要指渗透过程自动化,即如何减少渗透过程中的重复劳动,提高效率,让安全人员更专注于挖洞本身。广义上说,也包含研发、运维自动化,后续会在平台架构部分进行介绍。
关键词四:云化
即平台所有服务全部运行在云上。在上一篇架构笔记中,为了追求高可用,我曾自己搭建过 RabbitMQ 和 Postgresql 集群,机器成本相对于直接使用云厂商服务确实更低,但如服务升级、扩容、稳定性都需要自己来操作和保障,后期的运维成本更高。而全面上云后,大部分运维工作只需在页面上进行操作即可。通过借助云厂商更专业的服务,能够在提供高可用保障的同时,大幅减少运维成本。
目前平台架构如下图:
平台同样采用前后端分离,开发语言和框架为:
平台使用到的服务和组件信息如下:
序号 | 服务 | 说明 |
---|---|---|
1 | Gitlab | 代码托管,CI/CD 自动化构建 |
2 | Image Registry | Docker 镜像仓库 |
3 | Postgresql | 关系型数据库,存储平台数据 |
4 | Redis | 缓存服务 |
5 | ELK Stack | 存储/查询 Http 请求响应数据、业务日志 |
6 | Object Storage | 存储用户上传、导出数据、页面截图等 |
7 | Sentry | 代码错误监控和追踪 |
8 | Frontend | Nginx 反向代理、静态资源访问 |
9 | Backend | 后端 API Server,使用 DRF 框架 |
10 | Prometheus | 指标统计监控、告警 |
11 | RabbitMQ | 分布式消息代理 |
12 | Dramatiq | Python 异步任务框架 |
13 | Kubernates | 容器化部署管理 |
从列表信息看,核心组件与个人版基本相同,此外还增加了多个新服务来完善平台的各项能力,如自动化构建、错误追踪、监控告警等。
从架构图右侧,可以明显看到前一章节提到的 “云化” 特点。对于基础服务,如 Postgresql、Redis、ELK、对象存储等,都直接使用了云厂商提供的高可用集群版本,来保障平台的稳定性。
另一个改进点是,平台使用了 kubernates 来进行服务的容器化部署和管理,相比于个人版基于 docker、docker-compose 的方案,k8s 的功能更加强大。简单理解,你只需要通过 YAML 定义来声明需要的资源,如服务实例数量、机器资源、环境变量、启动命令等配置,k8s 会负责服务的启动、健康检查、故障迁移等剩余的工作。在 k8s 中,Pod 是最基础的运行单元,此外还提供了多种内置的应用类型(workload)来满足常用的业务场景,以下为平台中的一些应用例子:
在平台开发的过程中,也遇到过某些复杂功能,如实现为某个任务分配独享计算资源,需要能够自行控制节点(Pod)的创建过程,但内置的应用类型(workload)无法满足需求。此时,可通过 k8s 强大的扩展能力 Custom Resources 和 Operator pattern,来定义自己的资源类型,编写 controller 来进行管理。此外,k8s 还有如使用 Persistent Volumes 实现多个服务挂载和访问同一个存储磁盘、通过 kubectl scale 命令实现资源快速伸缩等功能,能极大的提升平台部署效率和扩展能力。
下一个不同点是,个人版在后端开发时主要使用 Python 语言,利用协程 gevent、asyncio 来缓解 GIL 带来的并发性能问题。而在新平台,我们对后端功能进行了拆分,使用 Golang 来进行安全引擎的开发,而业务层仍使用 Python,这样做的考虑主要有:
对于异步任务框架 Dramatiq,之前在个人版中遇到了一些问题:
聊完开发语言 和 Dramatiq,接下来再介绍一下其他研发流程相关的改进。在个人版的容器镜像主要依靠手工构建,在新平台则基于 Gitlab CI/CD,能够在每次代码变更和合并时自动进行构建打包,并推送至容器镜像仓库。为了方便功能测试和验证,平台拥有两套配置相同的环境 stg 和 prod,功能需在测试环境上验证通过后才会部署到线上环境。
此外,在功能上线后,不可避免的会遇到 bug,那么如何知道服务出现了问题?这里需要考虑两种场景:
关于平台架构部分,在探索过程中还遇到过其他很多问题,因篇幅关系,此次就先介绍到这里。
要想设计出一个好的平台架构,需要不断的尝试和改进,以及大量的时间去打磨优化细节。经过半年多的努力,虽然平台当前架构已经基本成型,但仍然还有很多的不足和优化之处,例如:
对于一个自动化渗透测试平台,良好的架构设计是基础,安全能力则是核心竞争力。在过去的半年多,平台的功能基本保持在每周更新上线,目前已经完成近两个大版本的开发,并投入使用。对于安全能力,在 2022 年,也将持续投入更多的精力进一步优化和提升效果。
不论是提升安全能力还是架构优化,都需要更多的人力投入。因此,下一章节是团队岗位招聘环节,感兴趣的师父可以看看
团队介绍
我们是长亭安全服务中心的协同创新团队,团队职责为将一线安全攻防经验,以平台和工具等形式赋能公司各业务,并通过安服业务的实践,快速获取反馈,不断改进和提升安全能力,构筑公司核心竞争力。
团队成员包含专业的产品经理、前后端研发、安全开发、攻防专家、运维。技术氛围好,不卷,老板重视。
目前团队负责项目包括但不限于:
关于岗位
目前招聘的岗位包括:安全研发、后端研发、红队攻防
如果你偏好安全,并具备一定的研发能力,可选择 安全研发 岗位,工作地点:北京
加入我们,你可以:
同时,我们希望你:
如果你偏好研发,可选择 后端研发 岗位,工作地点:北京
加入我们,你可以:
同时,我们希望你:
如果你偏好攻防实战,可以选择 红队攻防 岗位,工作地点:北京/上海/深圳/广州/成都
加入我们,你可以:
同时,我们希望你:
简历投递
有岗位问题咨询、技术交流,也可以通过以上方式联系
在这篇笔记完成时,2021 年已经过去了,在看完远在异国我佳和朋友圈各位师父的年终总结后,觉得自己也该做一个“总结”,因此就有了这篇笔记。文中介绍了我和团队在过去半年多在架构方面的尝试和总结。同第一篇笔记,文字较多,再次感谢大家耐心看完。希望能够为大家提供一些帮助,也希望能够借此机会帮助团队招到更多优秀的小伙伴。
最后,因个人能力和水平有限,文中可能会有描述错误或理解不到位的地方,欢迎各位指出和交流。
最最后,如果各位觉得文章对你有帮助,欢迎关注、点赞收藏和转发。
Workloads | Kubernetes https://kubernetes.io/docs/concepts/workloads/ |
Operator pattern | Kubernetes https://kubernetes.io/docs/concepts/extend-kubernetes/operator/ |