中国信息通信研究院 车昕
近几年,“客户隐私数据泄露”“恶意软件”“勒索病毒”“网络漏洞”等安全事件层出不穷,安全被推到了风口浪尖上,成为当前客户最关心的问题。网络攻击问题已经成为全球仅次于极端天气和自然灾害的全球性第三大威胁。
据统计,各类安全事故造成的经济损失高达数千亿美元,而且这个数字还在逐年上涨。如何将安全手段与DevOps相契合,使安全也能跟上持续交付的速度,成为当下企业最应重视的问题。
DevSecOps的由来
传统意义上的DevOps只是开发、测试和运维之间的协作,安全被排除在外。随着云计算和大数据的高速发展,频繁的交付变成了一把双刃剑,持续交付客户需求的同时也不可避免会带来更多的风险,许多安全和合规监测工具并未跟上快速迭代的步伐,安全性已然成为各大企业发展战略的关键部分。
Gartner于2012年的一份报告中首次提出DevSecOps的概念,在这份报告中,提倡信息安全专业人士需更主动地融入到DevOps的实践中。在后续的几年,他们持续将各类安全技术纳入其推崇的顶级技术之列,不断强调DevSecOps的重要性。
据DevSecOps社区2018年的调查显示,实践DevOps成熟度较高的企业在软件开发生命周期中集成安全的可能性是未实践DevOps企业的338%,在自动化应用程序安全分析的投资比2017年增加15%。调查还显示,有31%的被调查企业在过去的12个月中发现了与开源组件或依赖项有关的漏洞,但其中仅有不到一半的被调查企业对其使用的开源或第三方组件有明确完整的清单。
由此可见,实践DevOps成熟度较高的企业虽然已经开始集成部分安全监测,但仅有少数企业能够成功实施,如何着手将信息安全集成到软件开发的全生命周期中成为企业关注的重点。
SecDevOps、DevSecOps、DevOpsSec、Rugged DevOps傻傻分不清楚
将安全集成到DevOps中,从字面上有几种不同的解读方式,分别是SecDevOps、DevSecOps、DevOpsSec和Rugged DevOps,这几种解读方式到底有什么区别?
SecDevOps,信息安全被放在事前考虑,在项目开始之前并发考虑到安全要求,编码过程中同步完成漏洞筛查,将安全纳入到持续集成和持续部署的管道中,并在自动化测试套件中创建自动化安全测试集,以确保整个产品周期内的信息安全。
DevSecOps,由Gartner提出,从字面意思来看,信息安全被放在事中考虑,安全位于开发完成后和部署发布之间,开发阶段并没有添加足够的安全措施,更加依赖后续的自动化安全测试保证产品安全。
DevOpsSec,从字面意思看,指的是将安全放在事后考虑,整个产品开发周期结束后再进行安全检查,发现漏洞后及时修补。
Rugged DevOps是一种软件开发方法,优先考虑确保代码在软件开发生命周期内的安全,更常见于云环境中的软件开发。
笔者认为不必纠结于各种解读方式的字面意思,将安全开发最佳实践植入到开发过程的每个阶段,将安全解决方案作为核心开发过程的一部分,并通过自动化的方式集成到持续交付中,使软件开发生命周期中的每位成员都具备足够的安全意识,这才是安全的DevOps所关注的问题,目前网络搜索次数最多的解读方式是DevSecOps。
集成安全到DevOps中
目前大部分企业中开发、运营和安全的比例是100:10:1,安全人员仅占到开发人员的百分之一。相对于开发工程师、网络工程师、运维人员和QA等,安全人员的要求相对较高,需要跨专业并且有比较大的知识广度才能胜任。通过增大安全人员的配比来实现DevSecOps显然是不可能的,最重要的是让每个研发人员和运维人员都具备安全方面的意识,自己成为安全方面的专家,可以从以下几方面着手。
DevOps的成功离不开开发、测试和运维之间的协作,识别安全漏洞和潜在风险同样离不开所有参与者的协作。企业首先要改变DevOps潜在的文化,将安全集成到持续交付反馈环中,确保安全性和其他软件开发考虑因素一样紧密集成。
早在软件开发的源头就启动安全设计,将安全实践纳入到软件框架设计中,在功能或服务级别构建威胁模型,及时发现存在于系统的潜在威胁并寻求解决方案,并利用其应用程序框架和安全库中的功能来防止注入式攻击等漏洞。
DevSecOps社区2018年的调查显示,有48%的企业已经了解并关注安全在研发过程中的重要性,但却没有太多的时间和精力用于安全检查,由此可见自动化安全策略实施的重要性。自动化是实现DevOps持续交付流水线的必备条件,将安全策略集成到持续集成、持续交付管道中,并作为标准工作流的一部分,开发工程师无需在安全上花费额外的时间和精力,自动化运行所有的安全检查,比如自动化漏洞管理、自动化的合规性扫描等。
保证问题的透明度,确保团队每个成员都了解正在发生的事情,积极与团队分享个人所了解的安全知识、新的安全漏洞及安全工具的使用,提前预防类似问题的发生。
目前有很多开源工具用于从源代码分析到部署后持续监控的安全检查,覆盖了软件开发生命周期的全过程。比如使用静态应用程序安全分析工具,用于扫描源代码和二进制文件并提供及时反馈;使用动态应用程序安全测试工具,测试应用程序运行时是否存在已知的漏洞等。
随着安全攻击手段的发展,安全技术也在不断升级,需要安全的持续改进和针对变化的不断调整。DevOps的模型是一个从需求到产品上线的闭合性反馈环,持续监控并反馈生产过程中每一个缺陷和漏洞,并利用这些数据进行不断学习和改进,持续提供对安全隐患的洞察。
开展安全实践培训,提高团队成员的安全意识和安全文化,帮助他们更熟练地使用和运行安全工具;并赋予团队成员足够的自主权,确保团队成员能够根据问题做出必要的决策并持续改进。
实现DevSecOps的关键技术
将安全检查集成到持续交付之前,需要对以下几点有清晰的认知:目前的工作流程、DevOps持续交付流水线使用了哪些工具、源代码和组件的存储方式、代码提交之前和提交之后的步骤、代码如何从提交过渡到测试、代码如何部署到生产环境、产品经过哪些测试、目前已经在哪些环节集成了安全监测。
了解了以上内容,接下来需要分析在每个阶段如何集成安全检查和安全控制,通过将安全检查映射到设计、提交构建、测试、部署等工作流程中,以安全可靠的方式交付产品。
图 实现DevSecOps的工作流程
设计和编码阶段
安全向前期移动,更早地进入设计和编码阶段,将安全集成到框架设计中,以几乎不可见的方式对开发人员执行安全校验操作,让开发人员能够轻松地编写安全的代码。在编码阶段需要安全人员和开发人员之间的密切合作,通过使用强大的应用程序安全知识和软件设计技能,以安全和易用的方式为开发框架构建安全保护。
适合添加到设计和编码阶段的安全检查和控制包括以下内容:
一是构建默认安全的开发环境。使用参数化查询来阻止SQL注入,隐藏或保护应用程序免受XSS攻击所需的输出编码工作,实施安全的HTTP标头,并提供简单安全的身份验证等功能,这些安全功能都可以集成到默认的开发框架中。
二是建立轻量、迭代型威胁建模和风险评估,从攻击者的角度发现软件安全问题,预先进行风险评估,在软件设计阶段以内置的安全性来开发软件,更有效地识别应用程序设计和架构中的缺陷。
三是IaC(Infrastructure as Code),通过使用源代码定义基础架构的方式,把基础设施、工具及对基础设施的管理作为一个软件系统,将安全策略直接编程到配置中,通过相同类型的持续交付管道进行持续验证和变更,发现安全问题时能够快速安全地修复漏洞。
四是实施代码依赖项检查。如使用开源的检查工具进行依赖项检查,有助于安全漏洞的发现。
五是同行代码评审。在进行软件开发过程中的安全管理时,人们往往重点关注来自外部的安全威胁,如网络渗透、黑客攻击等,却忽略了来自内部的安全威胁。同行代码评审借助同行之间的丰富编程经验,以此发现防御性编码等常见错误,降低代码内部威胁的风险,提高代码整体质量。
提交阶段
提交阶段的安全检查集成在持续交付流水线中,一般由代码更新自动触发进行。代码提交构建后自动执行自动化测试,并快速反馈测试结果。适合在此阶段中包含的安全检查包括5种。
一是代码编译和构建检查,建立强力执行的质量门禁体系和组织级代码质量规约,确保这些常规步骤没有任何错误或告警,无任何新增阻断。
二是增加构建软件组件分析(SCA),自动识别第三方组件中可能带来的合规性问题和安全风险,除此之外,还可以识别出组件的版本,确认是否需要更新。
三是集成单元测试,至少保证80%以上的代码覆盖率。
四是对二进制文件进行签名并使用统一安全的存储库,保证文件的单一性。
五是运行静态应用程序安全测试和增量扫描,通过扫描源代码及二进制文件以发现可能的安全漏洞,通常SAST花费的时间较长,而增量扫描适合测试更改过的代码,扫描时间快,更加适合持续交付管道。
验收阶段
代码的成功提交将触发持续交付流水线下一阶段的自动化验收测试。代码被部署到验收测试环境中,执行自动化功能性和非功能性验收测试,这些测试通常会分布在不同的测试服务器上并行执行,验收阶段的后期集成少许手动测试和探索性测试等时间成本较高的测试。此阶段的安全检查和测试主要包括以下多方面内容:
•使用安全、可靠的配置管理工具和自动化测试运行维护平台,如Ansible、Chef、Puppet,Salt或Robot Framework等安全性较高的工具,确保测试环境的安全可靠。
•使用单一可信数据源,自动从安全的二进制工件存储库中部署最新的构建制品。
•动态应用程序安全测试(DAST),对运行中的应用程序进行实时的针对性安全扫描,限制代码易受攻击的引入。
•集成安全功能的自动化功能测试和集成测试。
•使用安全工具进行自动安全攻击,通过设置特定的条件设计攻击场景,编写攻击步骤,然后解析输出,检查返回值以确定通过或失败。
•模糊测试,介于渗透测试和自动化测试之间,通过向目标系统提供非预期的输入并监视异常结果,以此发现软件中隐藏的漏洞。
•安全测试,站在防护者和开发者的角度思考问题,通过分析系统架构,找出系统中所有可能被攻击的角度后进行的完备性测试,尽量发现所有可能被攻击者利用的安全隐患。
•渗透测试,良好的渗透测试具有探索性和创造性,与持续交付中的大多数自动化测试不同,渗透测试以攻击者的角度看待和思考问题,旨在捕捉设计、编码和配置中的相同类型的错误。
•故障注入测试,选择性地使软件的某部分失效并验证系统是不是会正确回复而且不会丢数据。
•增加交互式应用安全测试(IAST),在测试和质量保证阶段反馈漏洞信息并迅速提供补救方案。有效的交互式应用安全测试可以为DevOps团队提供识别安全漏洞的能力,并可以与持续集成、持续交付无缝衔接。
生产部署阶段
通过验收阶段的代码在手动或自动的审核批准后进入生产部署阶段,正式发布给用户之前需要额外的安全检查。
同样需要安全、可靠的配置管理工具和环境;使用已授权、可审计的自动部署和发布编排;集成安全功能的冒烟测试,保证代码的更改按预期执行,不会影响版本的稳定性;Monkey Testing,模拟用户操作,用毫无规律的操作使用被测系统,测试系统的稳定性;生产环境中的问题监控和积极反馈,运维人员在发现问题时迅速上报给开发人员,缩短故障修复时间。
采用灰度发布、蓝绿部署,在保证用户体验的前提下实现平滑发布;采用应用程序运行时的自我防护(Runtime application self-protection)技术,运行时利用软件内部的信息和网络信息来检测和阻止攻击,缩小安全测试和网络边界控制所留下的差距。
对DevSecOps未来发展的一些思考
持续且专注的自动化安全对DevSecOps的实现至关重要。将安全自动化融入到软件开发的生命周期中,通过自动化的方式减少安全漏洞检测和响应的时间,降低成本的同时也提高了应用程序的安全性,从而加速产品的交付速度。DevSecOps应将所有的安全检查自动化作为目标,最大程度消除人为干扰。目前市场已有很多开源的安全工具帮助企业实现安全自动化。
建立实时、持续的反馈环可以帮助开发人员快速、全面地了解产品安全方面的漏洞。通过将安全检查数据添加到持续测试中,促进从测试到开发人员的反馈循环,并在反馈中提供有关需要修复的实际问题的清晰描述,减少误报,确保有价值的反馈,有关安全的详细反馈信息可帮助开发人员了解威胁并确定修复优先级,以此减少平均故障检测时间(MTTD)。通过从生产环境到研发环境的反馈循环,让每一位研发人员都能了解到系统的实际运行情况,并利用反馈数据不断进行安全威胁的洞察和持续改进。
机器学习和人工智能将为研发人员提供强大的技术指导和实时反馈,有助安全漏洞的持续反馈和监测。将机器学习等人工智能技术纳入到研发中,通过提高漏洞识别速度和减少误报率来降低安全审核时间,迅速进行根因定位,还能深入了解其他机器的运作方式,以此帮助安全人员了解网络攻击者的心理,提高系统漏洞的预防。
版权归原作者所有,如若转载,请注明出处:https://www.ciocso.com/article/52.html