关于NIST SP 800-204D
800-204D为云原生应用的DevSecOps CI/CD流程提供了集成软件供应链安全战略的指导,包括定义软件供应链、识别风险因素和提出缓解措施;它强调了在软件开发生命周期中采取安全措施的重要性,并提供了这些安全措施与NIST SSDF(安全软件开发框架)高级实践的对应关系,以确保安全措施的有效性。
SSC安全 - 定义
-
入侵工件(artifact)、步骤或参与者:攻击者入侵了供应链中的一个元素(如下图),以修改工件或信息。 -
传播:攻击在整个链中传播。 -
利用:攻击者利用目标实现他们的目标(例如,数据泄露,加密劫持)。
SSC安全还应考虑发现和跟踪软件安全缺陷,而不仅仅是缓解攻击。为此,必须与最终用户共享软件物料清单(SBOM),以便他们可以构建软件组件清单。然而,虽然SBOM能够识别组件和来源,但它们没有提供足够的信息来解决漏洞或缺陷。因此,SBOM本身不能用于漏洞管理,它们只是提供了在解决软件漏洞或缺陷时需要关注的组件列表。
SSC安全 - 风险因素和缓解措施
-
开发环境中的漏洞:开发人员的终端及其环境对SSC的安全性构成了基本风险,并且不应当作为构建过程的一部分而被信任,因为它们有被破坏的可能性。 -
威胁行为者:包括寻求对SSC进行特权访问的外部攻击者和可能制造内部威胁的不满员工或承包商。 -
攻击向量:包括但不限于恶意软件、代码重用或库和依赖项提取(SSC污染)、社会工程学、基于网络的攻击和物理攻击。 -
攻击目标(即资产):例如源代码、凭证、敏感数据、内部操作和构建系统。 -
漏洞利用类型:包括将易受攻击或恶意的依赖项注入SSC、窃取凭证以获得对其他系统的访问权限、将恶意或易受攻击的代码注入代码仓库、通过提交合并请求来窃取秘密。
-
补丁管理 -
依赖管理 -
身份验证和授权 -
恶意软件保护 -
安全SDLC -
数据保护 -
物理安全 -
审计和监控 -
遵守适用的安全标准(例如,监管要求)
-
积极防御CI/CD Pipelines和构建流程。 -
确保上游来源和工件(例如,仓库)的完整性。
实现SSC安全的常见方法是尽可能多地生成provenance data。Provenance data与系统或系统组件的起源、开发、所有权、位置和更改的时间顺序相关,包括促成这些更改或修改的人员和流程。这些数据的生成应伴随相应的机制,以在策略决策中验证、认证和利用这些数据。
标题 | 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中集成软件供应链安全战略
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论