在DevSecOps CI/CD Pipelines中集成软件供应链安全战略

admin 2024年7月15日14:36:46评论61 views字数 6086阅读20分17秒阅读模式

关于NIST SP 800-204D

本出版物隶属于NIST SP 800-204系列,是截止目前该系列的收官之作。主要提供了如何在DevSecOps中集成软件供应链(SSC)安全的指导。如果读者对微服务安全感兴趣,不妨回顾一下我之前撰写的本系列其它文章来获取更多的信息。
由于指南篇幅较长,笔者重点将与Pipelines相关的部分内容摘录出来,感兴趣的读者可以参阅原始文档以了解更多内容。
摘要

800-204D为云原生应用的DevSecOps CI/CD流程提供了集成软件供应链安全战略的指导,包括定义软件供应链、识别风险因素和提出缓解措施;它强调了在软件开发生命周期中采取安全措施的重要性,并提供了这些安全措施与NIST SSDF(安全软件开发框架)高级实践的对应关系,以确保安全措施的有效性。

该出版物适用于软件行业的广大从业人员,包括站点可靠性工程师、软件工程师、项目和产品经理以及安全架构师和安全工程师。

SSC安全 - 定义

SSC中的大多数活动会对最终的软件产品产生重大影响。因此,每个单独活动的安全性对于最终结果的安全性至关重要。这包括活动本身的完整性,以及确保所有活动都已执行完成,反之亦然,确保没有未经授权的活动被注入到链中。
虽然软件组合(例如,依赖管理)属于软件供应链活动的范畴,但其它常被忽视的活动也对软件供应链至关重要。这包括编写源代码;构建、打包和交付应用程序;以及重新打包和容器化。
SSC攻击有多种形式,例如:
- 破坏、删除或在SSC中引入一个步骤,以恶意修改或破坏最终的软件产品。
- 从构建系统中窃取凭证,以制作和签署未经授权的恶意软件。
- 引发命名冲突。
常见的SSC攻击包含三个阶段:
  1. 入侵工件(artifact)、步骤或参与者:攻击者入侵了供应链中的一个元素(如下图),以修改工件或信息。
  2. 传播:攻击在整个链中传播。
  3. 利用:攻击者利用目标实现他们的目标(例如,数据泄露,加密劫持)。
    在DevSecOps CI/CD Pipelines中集成软件供应链安全战略
SSC攻击可能会产生一系列后果,影响软件产品的准确性、完整性或可用性(例如,使上游依赖项不可用)。实际上,攻击者经常以上述活动为目标,植入后门,随后破坏目标(即最终产品)或在应用程序交付后窃取敏感信息。

SSC安全还应考虑发现和跟踪软件安全缺陷,而不仅仅是缓解攻击。为此,必须与最终用户共享软件物料清单(SBOM),以便他们可以构建软件组件清单。然而,虽然SBOM能够识别组件和来源,但它们没有提供足够的信息来解决漏洞或缺陷。因此,SBOM本身不能用于漏洞管理,它们只是提供了在解决软件漏洞或缺陷时需要关注的组件列表。

SSC安全 - 风险因素和缓解措施

SSC中的风险因素通常包括:
  • 开发环境中的漏洞:开发人员的终端及其环境对SSC的安全性构成了基本风险,并且不应当作为构建过程的一部分而被信任,因为它们有被破坏的可能性。
  • 威胁行为者:包括寻求对SSC进行特权访问的外部攻击者和可能制造内部威胁的不满员工或承包商。
  • 攻击向量:包括但不限于恶意软件、代码重用或库和依赖项提取(SSC污染)、社会工程学、基于网络的攻击和物理攻击。
  • 攻击目标(即资产):例如源代码、凭证、敏感数据、内部操作和构建系统。
  • 漏洞利用类型:包括将易受攻击或恶意的依赖项注入SSC、窃取凭证以获得对其他系统的访问权限、将恶意或易受攻击的代码注入代码仓库、通过提交合并请求来窃取秘密。
以下通用缓解措施适用于整个SDLC,但与SSC特别相关:
  • 补丁管理
  • 依赖管理
  • 身份验证和授权
  • 恶意软件保护
  • 安全SDLC
  • 数据保护
  • 物理安全
  • 审计和监控
  • 遵守适用的安全标准(例如,监管要求)

SSC安全 - CI/CD Pipelines
在CI/CD Pipelines中应用SSC安全措施或实践时,有两个安全目标:
  • 积极防御CI/CD Pipelines和构建流程。
  • 确保上游来源和工件(例如,仓库)的完整性。

实现SSC安全的常见方法是尽可能多地生成provenance data。Provenance data与系统或系统组件的起源、开发、所有权、位置和更改的时间顺序相关,包括促成这些更改或修改的人员和流程。这些数据的生成应伴随相应的机制,以在策略决策中验证、认证和利用这些数据。

将SSC安全集成到CI/CD Pipelines
下面给出了一些安全建议,这些建议旨在将SSC安全性无缝集成到CI/CD Pipelines中,并且还提供了与NIST SSDF实践的对应关系。
标题 CI/CD Pipelines推荐的安全任务 SSDF推荐的高级实践
安全构建 - 构建过程中的策略和策略执行机制
指定有关构建的策略。
策略包括(a)使用安全隔离的平台执行构建,(b)对用于执行构建的工具,以及(c)执行构建过程的开发人员进行身份验证和授权。
使用代理或其他方式和策略执行引擎来执行这些构建策略。

定义软件开发的安全要求(PO.1):

确保始终了解软件开发的安全要求,以便在整个SDLC过程中考虑这些要求,并尽量减少重复工作。这包括来自内部来源(例如组织的政策、业务目标和风险管理策略)和外部来源(例如适用法律和法规)的要求。

保护CD Pipelines中的工作流

DEPLOY-REQ-1:对于已在仓库中并准备部署的代码,应调用安全扫描子功能来检测代码中是否存在机密信息,例如密钥和访问令牌。在许多情况下,甚至在填充代码之前,就应该扫描仓库以检查机密是否存在,因为它们在仓库中的存在可能意味着凭据已被泄露,具体取决于仓库的可见性。

DEPLOY-REQ-2:在合并PULL请求之前,应该能够通过依赖关系审查的形式查看任何易受攻击的版本的详细信息。

DEPLOY-REQ-3:如果已经建立了安全的构建环境和相关流程,应该能够指定要部署的工件(即容器镜像)必须由该构建流程生成,才能批准部署。

DEPLOY-REQ-4:检查容器镜像是否已扫描漏洞并提供存在漏洞的证据。

漏洞扫描的一个重要因素是运行时间。由于用于扫描工件的工具会不断更新以检测新出现的漏洞,因此最近的扫描结果更准确,并且比过去的结果更有保证。

这种技术使DevOps团队能够实施主动的容器安全态势监控,确保只有经过验证的容器镜像才能进入环境并在运行时保持可信。具体来说,应该能够根据组织定义的策略允许或阻止镜像部署。

DEPLOY-REQ-5:定期检查发布构建脚本中是否存在恶意代码。要执行的任务包括:

• 容器在构建后应立即扫描漏洞,甚至在将其推送到注册表之前就要扫描。早期扫描功能也可以内置到本地工作流中。

• 用于与包含容器镜像和语言包的仓库交互的工具应该能够与CD工具集成,从而使所有活动成为自动化CD Pipelines中不可或缺的一部分。

定义软件开发的安全要求(PO.1):

确保始终了解软件开发的安全要求,以便在整个SDLC过程中考虑这些要求,并尽量减少重复工作。这包括来自内部来源(例如组织的政策、业务目标和风险管理策略)和外部来源(例如适用法律和法规)的要求。

在CI/CD Pipelines中集成SSC安全性

激活CI/CD Pipelines的先决条件:

• 为操作各种CI/CD Pipelines的参与者(例如,应用程序更新程序、包管理器、部署专家)定义角色。

• 确定执行各种任务的细粒度授权,例如生成代码并将其提交给SCM、生成构建和包以及将各种工件(例如,构建和包)签入和签出仓库。

实施角色和职责(PO.2):

确保参与SDLC的组织内部和外部的每个人都准备好在整个SDLC过程中履行与SDLC相关的角色和职责。

在CI/CD Pipelines中集成SSC安全性

整个CI/CD Pipeline必须通过部署适当的工具来实现自动化,这是激活CI/CD Pipelines的先决条件。

CI和CD Pipelines的驱动工具处于更高级别,并调用一系列特定于功能的工具,例如用于从存储库中检出代码、编辑和编译、代码提交和测试的工具(例如,静态应用程序安全测试 [SAST]、动态应用程序安全测试 [DAST] 和软件成分分析 [SCA])。

通常,驱动工具或构建控制平面比单个功能步骤(例如构建)在更高的信任级别上执行。

实施支持工具链(PO.3):

使用自动化减少人力投入,提高整个SDLC中安全实践的准确性、可重复性、可用性和全面性,并提供一种方法来记录和展示这些实践的使用情况。

工具链和工具可能在组织的不同级别使用,例如整个组织或特定于项目,并且可能针对SDLC的特定部分,例如构建Pipeline。

安全代码提交

代码提交前应执行适当形式的测试,并满足以下要求:

• 应在CI/CD Pipelines中运行SAST和DAST工具(涵盖开发中使用的所有语言),并向开发人员和安全人员提供代码覆盖率报告。

• 如果使用开源模块和库,则必须枚举、理解和评估依赖关系以制定策略(可能使用适当的SCA工具),还必须测试它们应满足的安全条件。依赖文件检测器应检测所有依赖关系,包括传递依赖关系,最好对要分析的嵌套或传递依赖关系的深度没有限制。

定义和使用软件安全检查标准(PO.4):

通过定义和使用在开发过程中检查软件安全的标准,帮助确保SDLC产生的软件符合组织的期望。

构建过程的安全构建策略和策略执行机制

已涵盖在满足PO.1的要求中。

此外,环境认证涉及CI流程发生时的系统清单。它通常是指运行构建流程的平台。该平台必须经过加固、隔离和安全保护。

实施和维护软件开发的安全环境(PO.5):

确保SDLC环境的所有组件都受到强有力的保护,免受内部和外部威胁,以防止环境或其中的软件受到损害。

SDLC组件的示例包括开发、构建、测试和部署。

确保仓库中的PULL-PUSH操作安全

SDLC中使用的所有形式的代码都位于仓库中。授权开发人员使用PULL操作从这些仓库中提取代码,进行修改,然后使用PUSH操作将其放回存储库。

要授权这些PULL-PUSH操作,需要进行两种形式的检查:

1. 授权执行PULL-PUSH操作的开发人员所需的身份验证类型。开发人员提出的请求必须与其角色一致(例如,应用程序更新程序、包管理器)。具有“合并批准”权限的开发人员不能批准自己的合并。

2. 存储库中代码的完整性是可信的,以便可以将其用于进一步的更新。

保护所有形式的代码免遭未经授权的访问和篡改(PS.1):

帮助防止对代码进行未经授权的更改(无论是无意的还是有意的),这些更改可能会规避或否定软件的预期安全特性。

对于不打算公开访问的代码,这有助于防止盗窃,并可能使攻击者更难或更耗时地找到软件中的漏洞。

软件更新期间证据生成的完整性(为了向采购方保证获得的软件是合法的,需要采取措施保护证据生成任务的完整性)

1. 该框架应提供保护,从而防止所有已知的攻击,这些攻击针对软件更新系统执行的任务,例如元数据(哈希)生成、签名过程、签名密钥管理、执行签名的机构的完整性、密钥验证和签名验证。

2. 该框架应提供一种方法来最小化密钥泄露的影响,即支持具有多个密钥和阈值或法定信任的角色(设计为使用单个密钥的最低信任角色除外)。使用高度易受攻击的密钥的角色的泄露应将影响降至最低。因此,在线密钥(即以自动化方式使用的密钥)不得用于客户端最终信任的任何可能安装文件的角色。当密钥在线时,应格外小心地保管它们,例如将它们存储在HSM中,并且只有在签名的工件满足上文中定义的策略时才允许使用它们。

3. 该框架必须足够灵活,以满足各种软件更新系统的需求。

4. 该框架必须易于与软件更新系统集成。

提供验证软件发布完整性的机制(PS.2):

帮助软件采购方确保其采购的软件是合法的且未被篡改。

CD Pipeline安全 — 案例研究(GitOps)

在部署前创建配置数据、捕获与特定版本相关的所有数据、在运行时修改软件以及执行监控操作时,应应用以下SSC安全任务:

• GitOps-REQ-2:促进 GitOps的包管理器应保留已发布的包的所有数据,包括所有模块的版本号、所有相关配置文件以及适用于软件操作环境的其他元数据。

存档和保护每个软件版本(PS.3):

保留软件版本,以帮助识别、分析和消除发布后在软件中发现的漏洞。

确保仓库上的PULL-PUSH操作安全(实施安全编码和构建流程,通过PULL-PUSH操作期间的各种检查来提高安全性)

• PULL-PUSH-REQ-1:项目维护者应对PULL请求中涵盖的所有工件运行自动检查,例如单元测试、完整性测试、安全检查等。

• PULL-PUSH-REQ-2:CI Pipelines应仅在对源代码来源的可信度建立信心时才使用外部工具(例如Jenkins)。

• PULL-PUSH-REQ-3:仓库或源代码管理系统(例如GitHub、GitLab)应具有内置保护功能,该保护功能会延迟CI工作流程运行,直到获得具有写访问权限的维护者批准。当外部贡献者向公共仓库提交PULL请求时,此内置保护应生效。此保护的设置应处于最严格的级别,例如“要求所有外部合作者都获得批准”。

• PULL-PUSH-REQ-4:如果源代码管理系统中没有可用的内置保护,则需要具有以下功能的外部安全工具: 

o 评估和增强SCM系统安全态势的功能,无论是否有策略(例如OPA)来评估SCM帐户的安全设置并生成包含可操作建议的状态报告

o 通过检测和修复错误配置、安全漏洞和合规性问题来增强源代码管理系统的安全性的功能

遵守安全编码实践创建源代码(PW.5):

通过最大限度地减少源代码创建过程中引入的漏洞来减少软件中的安全漏洞数量并降低成本,这些漏洞符合或超过了组织定义的漏洞严重性标准。

安全构建(通过安全要求满足PW.6的要求)

环境认证:

环境认证涉及CI流程发生时的系统清单,通常指运行构建流程的平台。平台的组件(例如编译器、解释器)必须得到加固、隔离和安全保护。

配置编译、解释器和构建流程以提高可执行文件安全性(PW.6):

通过在测试之前消除漏洞来减少软件中的安全漏洞数量并降低成本。

安全代码提交

在代码提交之前应执行适当形式的测试,并且必须满足以下要求:

• CI/CD Pipelines中使用的SAST和DAST工具都必须覆盖云原生应用程序中使用的不同语言系统。

• 如果使用开源模块和库,则必须使用适当的SCA工具检测依赖项,并且还必须测试它们应满足的安全条件。

测试可执行代码以识别漏洞并验证是否符合安全要求(PW.8):

识别漏洞,以便在软件发布之前对其进行纠正。

使用自动化方法可以减少检测漏洞所需的工作量和资源,并提高可追溯性和可重复性。

可执行代码包括二进制文件、直接执行的字节码和源代码以及组织认为可执行的任何其他形式的代码。

在CI/CD Pipelines中集成SSC安全性 定义CI/CD Pipelines活动和相关的安全要求,以开发和部署应用程序代码;基础设施即代码,其中包含有关部署平台的详细信息;以及策略即代码和配置代码,指定运行时设置(例如YAML文件)。

将软件配置为默认安全设置(PW.9):

在安装时提高软件的安全性,以降低软件部署时安全设置较弱的可能性,从而避免其受到攻击的风险。

原文始发于微信公众号(安全攻防):在DevSecOps CI/CD Pipelines中集成软件供应链安全战略

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月15日14:36:46
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   在DevSecOps CI/CD Pipelines中集成软件供应链安全战略https://cn-sec.com/archives/2924790.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息