摘要: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软件安全开发实践的更多相关文章

  1. Android软件安全开发实践(下)

    Android开发是当前最火的话题之一,但很少有人讨论这个领域的安全问题.本系列将分两期,探讨Android开发中常见的安全隐患和解决方案.第一期将从数据存储.网络通信.密码和认证策略这三个角度,带你 ...

  2. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  3. Android游戏开发实践(1)之NDK与JNI开发03

    Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...

  4. TFS 2015 敏捷开发实践 – 在Kanban上运行一个Sprint

    前言:在 上一篇 TFS2015敏捷开发实践 中,我们给大家介绍了TFS2015中看板的基本使用和功能,这一篇中我们来看一个具体的场景,如何使用看板来运行一个sprint.Sprint是Scrum对迭 ...

  5. Android游戏开发实践(1)之NDK与JNI开发01

    Android游戏开发实践(1)之NDK与JNI开发01 NDK是Native Developement Kit的缩写,顾名思义,NDK是Google提供的一套原生Java代码与本地C/C++代码&q ...

  6. Android游戏开发实践(1)之NDK与JNI开发02

    Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI开发01分享完JNI的基础和简要开发流程之后,再来分享下在Android环境下的JNI ...

  7. vue 2.0 开发实践总结之疑难篇

    续上一篇文章:vue2.0 开发实践总结之入门篇 ,如果没有看过的可以移步看一下. 本篇文章目录如下: 1.  vue 组件的说明和使用 2.  vuex在实际开发中的使用 3.  开发实践总结 1. ...

  8. Redis的Python实践,以及四中常用应用场景详解——学习董伟明老师的《Python Web开发实践》

    首先,简单介绍:Redis是一个基于内存的键值对存储系统,常用作数据库.缓存和消息代理. 支持:字符串,字典,列表,集合,有序集合,位图(bitmaps),地理位置,HyperLogLog等多种数据结 ...

  9. MVC5 网站开发实践 2.2、管理员身份验证

    上次完成了管理员的登录,这次要解决对管理员登录后的验证,采用AuthorizeAttribute属性的方式.之前还要解决几个问题,然后才重写验证类,最后稍微改一下界面. 目录 MVC5 网站开发实践  ...

  10. MVC5 网站开发实践 2.1、管理员登陆

    目录 MVC5 网站开发实践  概述 MVC5 网站开发实践  1.建立项目 MVC5 网站开发实践  2.后台管理   1. 创建SHA256加密方法. 在Data项目中添加文件夹[Security ...

随机推荐

  1. python 远程操作svn

    SVN操作脚本 安装模块 pip install pywinrm 脚本如下 #!/usr/bin/env python3 # coding=utf-8 # author:LJX # describe: ...

  2. 文心一言 VS 讯飞星火 VS chatgpt (125)-- 算法导论10.6 6题

    六.用go语言,任意有根树的左孩子右兄弟表示法中每个结点用到三个指针: leftchild.rightsibling 和parent.对于任何结点,都可以在常数时间到达其父结点,并在与其孩子数呈线性关 ...

  3. 微信小程序:音乐播放器

    音乐资源使用的是QQ音乐资源.图片资源使用的网易云音乐的专辑图片. HTML: <view class="container"> <div wx:for=&quo ...

  4. 视觉BEV基本原理和方案解析

    BEV(Bird's-Eye-View)是一种鸟瞰视图的传感器数据表示方法,它的相关技术在自动驾驶领域已经成了"标配",纷纷在新能源汽车.芯片设计等行业相继量产落地.BEV同样在高 ...

  5. XOR加密

    coding=utf-8 md5算法 import hashlib h_md5 = hashlib.md5() x = input("输入需要加密的数据:") print( &qu ...

  6. 龙芯发布 .NET 8 SDK 8.0.100-ea1(试用版)

    随着.NET 8的发布,国内的社区朋友们也很关心龙芯.NET 团队对于Loongarch .NET 8的发布时间,目前从龙芯.NET编译器团队已经在龙芯.NET 官网上发布龙芯.NET 8 SDK-8 ...

  7. 基于OpenAi通用特定领域的智能语音小助手

    无穷尽的Q&A 钉钉...钉钉... 双双同学刚到工位,报销答疑群的消息就万马纷沓而来.她只能咧嘴无奈的摇摇头.水都还没有喝一口就开始"人工智能"的去回复.原本很阳光心情开 ...

  8. win32 API 文件夹操作函数整理

    常用操作文件目录的函数 1. CreateDirectory 创建文件夹 原型: BOOL CreateDirectory( LPCTSTR lpPathName, LPSECURITY_ATTRIB ...

  9. [JVM] 应用诊断工具之Fastthread(在线诊断)

    0 序言 背景 近期生产系统遇到了一个线程方面的问题,目前根因已定位到.现将fastthread这一诊断工具做一小结,便于以后快速使用 博主我遇到的线程问题:java.lang.OutOfMemory ...

  10. Linux笔记03: Linux常用命令_3.1命令的基本格式

    3.1命令的基本格式 3.1.1 命令提示符 [root@localhost ~]# 这就是Linux系统的命令提示符.各部分含义如下: ●[]:这是提示符的分隔符号,没有特殊含义. ●root:显示 ...