DevSecOps软件安全开发实践
摘要:DevSecOps 的理念是将安全防护流程有机地融入传统的 DevOps 流程中,为研发安全提供强有力保证,安全工具支撑研发阶段安全要求落地。
本文分享自华为云社区《DevSecOps软件研发安全实践——开发篇》,作者: 敏捷小智 。
前言
随着DevOps的发展,DevOps大幅提升了企业应用迭代的速度。但同时,安全如果不能跟上步伐,不仅会抵消DevOps变革带来的提升,拖慢企业数字化转型进程,还会导致漏洞与风险不约而至。所以安全能力在全球范围内受到的重视越来越高, 软件开发内生的安全性成为评价企业DevOps成熟度水平的重要指标 。
一直以来,业界长期重视软件上线后的安全防护,而对研发阶段的安全投入不多。2012年,Gartner提出了DevSecOps的理念。DevSecOps 的理念是将安全防护流程有机地融入传统的 DevOps 流程中,为研发安全提供强有力保证,安全工具支撑研发阶段安全要求落地。
安全开发的重要性
安全与开发质量息息相关,如果开发过程控制良好,后期修补缺陷的费用会急剧减少。研发验证是安全前置实践的关键所在,研发阶段安全是整体安全左移实现关键,所以要做好关注代码程序安全,避免风险引入。
代码是软件应用服务开发的最初形态,其缺陷或漏洞是导致安全问题的直接根源,做好安全编码,尽早发现源码缺陷能够大大降低安全问题的修复成本。根据美国国家标准与技术研究所(NIST)统计,编码阶段的修复成本远远低于发布后执行代码修复的成本。具体数据如图所示。

业界的相关安全开发实践
如何做好安全开发,我们先来参考下业界相关机构和企业的做法。
• 信息通信研究院的研发运营安全体系中提出,在开发阶段要做好安全编码,对开源及第三方组件进行风险管理,变更管理,搭配安全工具确保编码实际安全 。
• Gartner在2019年经过调研和分析之后给出了一个比较全面的实践清单,在编码阶段提出了IDE安全插件。各类的安全漏洞扫描、开源组件版本检查甚至是代码质量代码风格等的工具可以让研发人员在编码时就发现和消除一些潜在的安全风险。
• Baidu的DevSecOps工具链中提出,在开发阶段要做好源码漏洞安全检查,仓库安全检查,供应链安全检查,高危框架检查和安全编码规范检查。
• Vmware研发运营全生命周期安全管理中提出要明确产品中开源及第三方组件中的安全漏洞,在发布前期进行修复,通过静态代码分析与漏洞扫描等手段保证研发阶段的安全性。
• 思科研发运营全生命周期安全管理中提出,要利用工具了解潜在的第三方软件安全威胁,不断更新已知第三方软件威胁和漏洞列表,对于产品团队进行告警。建立内部的安全编码标准,维护经过审核的通用安全模块。
• 微软的研发运营全生命周期安全管理中提出,在开发阶段要做好第三方组件的安全管理,使用经过安全性检查,认可的工具,执行静态应用程序。
• 腾讯的DevSecOps工具链中提出,在开发编码环节使用的工具/机制有安全开发库,安全相关的基础设施&框架机制,IDE中的代码质量工具,代码review,安全加固的统一编译构建环境,安全加固的腾讯软件源。
其他更多内容不在一一列举,关于开发阶段的安全保障大家都有自己独有的特色,这里面我们重点从使用安全的工具,安全编码和对开源和第三方组件进行管理三个方面来看一下。
使用安全的工具
工欲善其事,必先利其器。工具的安全性是进行开发前首先要保证的关键一环,开发团队使用的编辑器、链接器等相关工具,可能会涉及一些安全相关的环节,因此在使用工具的版本上,需要提前与安全团队进行沟通,使用经过安全性检查,认可的工具,安全加固的编译构建环境,确保编码实际安全。
安全编码
安全编码对保证产品和服务的安全性至关重要,缺陷,错误和逻辑缺陷始终是导致可被普遍利用的软件漏洞的主要原因。安全编码是开发实践中重要的一环,通过遵循已建立的威胁模型可以降低与安全相关的脆弱性、漏洞数量和集成错误,防止意外引入安全漏洞。
建立内部的安全编码标准,维护经过审核的通用安全模块。提供安全编码规范,制定相关的基于安全基础库的安全编码规范,要求业务摒弃一些危险的编码习惯,比如各种拼接写法、调用不安全的默认API等,使用安全SDK中的API实现相关的功能,从而降低写出漏洞的风险。对全员做好安全编码规范的培训,逐渐培养大家的安全意识。
编码后执行代码Review和自动代码扫描,通过代码质量检查、代码风格检查,仓库安全检查,高危框架检查、静态代码分析与漏洞扫描等手段保证研发阶段的安全性。同时将编码规范检查也集成在研发工具链中,保证检查的高效高质量。
对开源和第三方组件进行管理
软件开源日趋盛行,开源软件成为现代软件开发最基础的原材料。混源软件开发已经成为现代应用主要软件开发交付方式,对它的全面风险审查应考虑从第三方开源组件缺陷及后门、自研代码通用漏洞、自研代码业务逻辑漏洞、潜藏恶意代码等维度综合审计。
要了解潜在的第三方软件安全威胁,不断更新已知第三方软件威胁和漏洞列表,对于产品团队进行告警,保证软件供应链的安全。
华为云安全开发实践
华为有20年研发安全积累,华为的研发安全能力是伴随业务中不断出现的问题逐步形成的。华为将已经开放的运维安全能力,和即将开放的研发安全能力与华为云DevCloud深度融合,为企业带来DevSecOps平台,让企业便捷的落地DevSecOps理念,在软件开发过程中就内置了安全保护,让软件“天生安全,健康成长”,成为企业的竞争力。
安全编码
华为有自己的有安全编码检查平台 SecSolar华为云严格遵从华为对内发布的安全编码规范,构建了安全编码知识库,安全编码缺陷库,安全编码能力库。为防止、检测和消除可能危及软件安全的错误,华为云服务研发和测试人员在上岗前均通过了对应规范的学习和考试。
为保证服务始终具备高安全性,华为云在安全编码的同时,引入了静态代码扫描工具每日检查,其结果数据进入云服务持续集成和持续部署(CI/CD – Continuous Integration, Continuous Deployment)工具链,通过质量门限进行控制,以评估云服务产品的质量。所有云产品、云服务在发布前,均需完成静态代码扫描的告警清零,有效降低上线时编码相关的安全问题。华为云研发的代码检查CodeCheck提供近2000条华为典型检查规则,支持多种主流开发语言,可以在开发阶段识别大部分安全问题,实现安全风险前置,有效管控代码质量。
第三方软件安全管理
华为云基于严进宽用的原则,保障开源及第三方软件的安全引入和使用。华为云对引入的开源及第三方软件制定了明确的安全要求和完善的流程控制方案,在选型分析、安全测试、代码安全、风险扫描、法务审核、软件申请、软件退出等环节,均实施严格的管控。例如在选型分析环节,增加开源软件选型阶段的网络安全评估要求,严管选型。在使用中,须将第三方软件作为服务或解决方案的一部分开展相应活动,并重点评估开源及第三方软件和自研软件的结合点,或解决方案中使用独立的第三方软件是否引入新的安全问题。
华为云将网络安全能力前置到社区,在出现开源漏洞问题时,依托华为云对开源社区的影响力,第一时间发现漏洞并修复。漏洞响应时,须将开源及第三方软件作为服务和解决方案的一部分开展测试,验证开源及第三方软件已知漏洞是否修复,并在服务的Release notes 里体现开源及第三方软件的漏洞修复列表。
后记
各类的安全漏洞扫描、开源组件版本检查甚至是代码质量代码风格等的工具,可以让研发人员在编码时就发现和消除一些潜在的安全风险。在DevSecOps时代,这个需要大力的投入,如果做的好,可以大大减轻后续环节的工作量。不过这里也面临一些挑战,比如针对源码静态分析的误报率问题,再比如某些安全漏洞准确的检测方案极度依赖编译或构建过程等等。由此可见,DevSecOps未来之路任重道远。
参考附录
1.《华为云安全白皮书》.华为技术有限公司
2.《研发运营安全白皮书》. 云计算开源产业联盟.
3. “安全需要每个工程师的参与”-DevSecOps理念及思考
4. DevSecOps in Baidu
5. 每天扫描超300亿行代码,DevSecOps在华为的落地与实践_DevOps
本文由DevSecOps专家服务团队出品,了解更多专家服务请戳
DevSecOps软件安全开发实践的更多相关文章
- Android软件安全开发实践(下)
Android开发是当前最火的话题之一,但很少有人讨论这个领域的安全问题.本系列将分两期,探讨Android开发中常见的安全隐患和解决方案.第一期将从数据存储.网络通信.密码和认证策略这三个角度,带你 ...
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- Android游戏开发实践(1)之NDK与JNI开发03
Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...
- TFS 2015 敏捷开发实践 – 在Kanban上运行一个Sprint
前言:在 上一篇 TFS2015敏捷开发实践 中,我们给大家介绍了TFS2015中看板的基本使用和功能,这一篇中我们来看一个具体的场景,如何使用看板来运行一个sprint.Sprint是Scrum对迭 ...
- Android游戏开发实践(1)之NDK与JNI开发01
Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...
- Android游戏开发实践(1)之NDK与JNI开发02
Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...
- vue 2.0 开发实践总结之疑难篇
续上一篇文章:vue2.0 开发实践总结之入门篇 ,如果没有看过的可以移步看一下. 本篇文章目录如下: 1. vue 组件的说明和使用 2. vuex在实际开发中的使用 3. 开发实践总结 1. ...
- Redis的Python实践,以及四中常用应用场景详解——学习董伟明老师的《Python Web开发实践》
首先,简单介绍:Redis是一个基于内存的键值对存储系统,常用作数据库.缓存和消息代理. 支持:字符串,字典,列表,集合,有序集合,位图(bitmaps),地理位置,HyperLogLog等多种数据结 ...
- MVC5 网站开发实践 2.2、管理员身份验证
上次完成了管理员的登录,这次要解决对管理员登录后的验证,采用AuthorizeAttribute属性的方式.之前还要解决几个问题,然后才重写验证类,最后稍微改一下界面. 目录 MVC5 网站开发实践 ...
- MVC5 网站开发实践 2.1、管理员登陆
目录 MVC5 网站开发实践 概述 MVC5 网站开发实践 1.建立项目 MVC5 网站开发实践 2.后台管理 1. 创建SHA256加密方法. 在Data项目中添加文件夹[Security ...
随机推荐
- js各种宽高的总结
1.clientWidth和clientHeight指元素的可视部分宽度和高度,就是padding+content如果没有滚动条,就是设定的宽度和高度 如果有滚动条,就是设定的宽度和高度减去滚动条的宽 ...
- FWT & FMT(位运算卷积)学习笔记
它们两个的全名叫 快速沃尔什变换(FWT) 和 快速莫比乌斯变换(FMT),用来在 \(O(n\log n)\) 时间复杂度内求位运算卷积. 因为 FMT 能解决的问题是 FWT 的子集,所以这里不讲 ...
- springcloud/springboot集成NACOS 做注册和配置中心以及nacos源码分析
一.SpringCloud 简介 Spring Cloud 是一系列框架的有序集合如服务发现注册.配置中心.消息总线.负载均衡.熔断器.数据监控等. SpringCloud 将多个服务框架组合起来,通 ...
- c#组合模式详解
基础介绍: 组合模式用于表示部分-整体的层次结构.适用于希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象的情况. 顾名思义,什么叫部分-整体,比如常见的前端UI,一个 ...
- DNS 服务 docker-bind 的部署使用
前言 前面使用 nginx 代理转发了几个域名到服务器,但是每次添加一个域名都需要在客户端添加一行 hosts 文件,无疑是繁琐的,其中也提到可以使用 DNS 来实现自动解析域名 到指定服务器的功能, ...
- 支持C#的开源免费、新手友好的数据结构与算法入门教程
前言 前段时间完成了C#经典十大排序算法(完结)然后有很多小伙伴问想要系统化的学习数据结构和算法,不知道该怎么入门,有无好的教程推荐的.今天给大家推荐一个支持C#的开源免费.新手友好的数据结构与算法入 ...
- 暴力+DP:买卖股票的最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润. 注意:你不能在买入股票前卖出股票. ...
- 【封装】Trie
#include<cstdio> const int N = 1e6 + 5; struct Trie{ int root, id; bool bit[32]; struct Node{ ...
- Java八股面试整理(3)
21.说一说hashCode()和equals()的关系 hashCode()用于获取哈希码(散列码),eauqls()用于比较两个对象是否相等,它们应遵守如下规定: 如果两个对象相等,则它们必须有相 ...
- [ABC328D] Take ABC 题解
题目翻译 题目描述 给你一个字符串 \(S\) 包含 A.B 和 C 三个不用的字符. 只要字符串 \(S\) 中包含连续的 ABC 就将 ABC 删除掉 再字符串 \(S\) 不能操作之后输出这个字 ...