# DevSecOps 现状分析
DevSecOps 是"开发、安全和运维"的缩写,它的出现源于敏捷和 DevOps 实践下对软件开发需求的追求。
Shannon Lietz,"DevSecOps 宣言"的合著者,解释说:“DevSecOps 的目标是建立一种每个人都对安全负责的理念,旨在快速、安全、大规模地将安全决策分配给那些拥有最高背景级别的人,而不会牺牲必要的安全性。”
目前,开发人员、运维人员和安全人员的比例为 200:5:1。这意味着规模较小的安全团队需要审核由安全漏洞扫描工具发现的所有安全问题,甚至这个团队可能没有足够的技术知识。
通过将安全和测试服务编排到现有的 CI 工具中,在早期发现问题,有助于测试应用程序、微服务和 API 的安全漏洞或逻辑缺陷,从而减少下游的高成本和精力投入。随着越来越多的组织采用 DevOps 和 DevSecOps,自动化成为实现效率和速度的重要组成部分。
Zadig 具备管理软件开发全生命周期的能力,几乎支持市面上所有的安全工具和服务。借助强大的运行时环境和工作流能力,它为安全团队提供了强有力的支持。
Zadig 帮助安全团队将安全服务和能力向左移动到开发人员和运维团队,尽早发现安全问题,使其他角色也参与解决安全性和合规性问题,从而避免因修复此类问题而造成额外成本。
# DevSecOps 实践思路
在软件研发生命周期中,存在各种安全问题,但可以通过多种安全和合规性工具来解决。这些工具包括静态代码分析(Static Application Security Testing,SAST)、软件成分分析(Software Composition Analysis,SCA),以及用于测试代码漏洞的动态应用安全测试(Dynamic Application Security Testing,DAST)和交互式应用安全测试(Interactive Application Security Testing,IAST)等不同方法。此外,还有一些工具可以监控容器运行时,以保护生产环境中的二进制文件,防止攻击者利用您的代码或环境漏洞进行攻击。团队应根据实际情况,在整个软件研发生命周期(SDLC)中合理应用上述各种方法。
图片来源于[What is DevSecOps]
# 用 Zadig 落地 DevSecOps
Zadig 几乎支持市面上所有安全工具和服务,比如 Coverity、SonarQube、 CleanSource (清源) SCA 、DongTai 等。Zadig 可以很方便地将这些工具(产品)编排到整个交付链路中,通过强大的运行时环境和自定义工作流能力,为产研团队提供强有力的支撑。
该案例以 SAST 领域的代表工具 SonarQube 静态分析,以及 IAST 领域的代表洞态 DongTai 为例子,为大家呈现一个真实的 DevSecOps 实践案例,为企业带来看得到的 DevSecOps 实践落地。
# 资源准备与配置
管理员(比如:运维工程师)在 Zadig 中集成源码检测工具 Sonar,为服务注入洞态 Agent,配置研发、测试、运维不同角色日常工作所需的工作流和环境。
# 集成静态扫描工具 Sonar
系统管理员访问系统设置 > 系统集成 >
代码扫描,新增代码扫描配置。
- 访问地址:Sonar 系统的地址
- 系统标识: 自定义,方便在 Zadig 中识别
- Token:Sonar 系统的 API Token,获取方式可参考文档:Sonar API Token (opens new window)
# 设置质量门禁规则
访问 Sonar 系统 > Quality Gate
,添加新的质量门禁规则,按需设置门禁条件。
# 为服务安装洞态 Agent
修改服务的 YAML 配置内容,安装 DongTai IAST Agent,如何获取 Agent 可参考洞态官方文档:快速开始 (opens new window)。以 Java 技术栈的服务为例进行具体改动示范:
- 在服务配置中增加
initContainer
配置 - 修改服务启动命令,增加
-javaagent:/path/to/agent.jar
修改服务的 YAML 配置内容时可使用 Zadig 的服务变量能力,按需控制是否需要为服务安装 Agent 进行动态安全检测。
原始服务配置:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: service1
name: service1
spec:
selector:
matchLabels:
app: service1
template:
metadata:
labels:
app: service1
spec:
containers:
- name: service1
image: dongtai/dongtai-java-agent-demo:0.0.1
修改后的服务配置:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: service1
name: service1
spec:
selector:
matchLabels:
app: service1
template:
metadata:
labels:
app: service1
spec:
{{- if .iast }}
volumes:
- name: dongtai-iast-agent
emptyDir: {}
initContainers:
- name: agent-init-container
image: curlimages/curl
volumeMounts:
- name: dongtai-iast-agent
mountPath: /tmp
args:
- "-k"
- "-X"
- "GET"
- "从洞态管理后台获取到的 Agent 下载请求地址"
- "-H"
- "从洞态管理后台获取到的 Agent 下载请求的 Header 信息"
- "-o"
- "/tmp/agent.jar"
{{- end}}
containers:
- name: service1
image: dongtai/dongtai-java-agent-demo:0.0.1
{{- if .iast }}
volumeMounts:
- name: dongtai-iast-agent
mountPath: /agent
env:
- name: JAVA_TOOL_OPTIONS
value: "-javaagent:/agent/agent.jar"
{{- end}}
# 配置工作流、环境、代码扫描
平台(运维)工程师在 Zadig 中准备好三套环境、三条工作流和代码扫描,具体配置参考如下。
环境配置
- dev:开发环境,用于开发日常自测、联调
- sit:集成测试环境,用于日常测试验证和动态安全检测,创建环境时
iast
变量设置为 true - prod:生产环境,用于生产环境查看,该环境的变更需要经过严格的审批
工作流配置
- workflow-dev:包含步骤:
构建 > 部署 dev 环境 > IM 通知
+ 基于代码变更触发自动执行 - workflow-sit:包含步骤:
代码扫描 > 构建 > 部署 sit 环境 > 自动化测试 > IM 通知
+ 基于代码变更触发自动执行 - workflow-prod:包含步骤:
人工审批 > 部署 prod 环境 > 自动化测试 > IM 通知
+ 发布人员根据发布窗口触发执行
代码扫描配置
配置代码扫描,开启质量门禁检查并添加触发器,具体配置可参考文档:配置代码扫描 (opens new window)。
# DevSecOps 核心用户场景介绍
# 开发阶段静态安全注入
流程包含:代码提交 > 静态扫描 > 构建 > 部署> 自测联调
代码实现完毕提交代码变更 PR 后,会自动触发静态代码扫描执行。扫描结果会反馈在 PR 中,点击可跳转 Zadig 查看失败原因,在开发源头有效规避代码中的质量隐患、安全隐患。
在代码扫描中点击链接可跳转 Sonar 系统分析代码扫描的更多结果,有针对性的修复。修复完毕后执行 dev 工作流进行日常自测联调。
# 测试阶段组合安全策略
流程包含:静态扫描(开启质量门禁) > 构建 > 部署 > 自动化测试(业务测试 + 动态安全检测)
研发提测后,测试工程师基于代码分支 + PR 执行 sit 工作流,部署 sit 环境并对环境做自动化测试。工作流执行后会自动通知到 IM 中。登录洞态管理后台可查看动态安全检测漏洞详情,推进团队及时修复,尽早规避安全风险。
如果静态扫描任务执行失败,将会阻止后续的构建和部署任务运行。未通过验收的代码变更将被拒绝合并,以便从源代码层面捕获安全隐患,并建立有效的质量门禁措施。这种做法可以防止潜在问题进入到系统中。
# 发布阶段安全巡检审批
流程包含:安全委员会审核 > 分批次灰度发布 > 自动化测试
当测试验收通过后,执行 prod 工作流执行生产发布,审批通过后方可发布,建议几种配置策略:
- 建设发布门禁,通过自定义任务自动获取安全扫描、单元测试、回归测试等质量结果来判断是否允许上线,作为上线过程的卡点,确保版本验收通过并且符合企业安全要求后再做上线操作。
- 灵活编排蓝绿、金丝雀、分批次灰度、Istio 全链路等发布策略,以确保发布可靠性,可参考:工作流的发布策略 (opens new window)。
- 工作流增加安全团队人工审批,以确保业务流程上的发布合规性。
# 小结
Zadig 与主流安全工具结合,在软件开发生命周期 (SDLC) 中实现安全和合规性策略的自动化, 让 DevSecOps 不再停留在概念层面,为企业带来安全管理的新解法。