持续集成管道
持续集成管道从应用程序的存储库构建可部署工件。
在构建工件之前,管道会以处理拉取请求的相同方式检查代码是否经过扫描和测试。 在 库存 中将已构建的工件标记为可供发布和部署之前,还会在管道中扫描这些工件以查找漏洞并对其进行签名。 与拉取请求管道不同,Continuous Integration 管道在构建的每个阶段 (例如测试,扫描和签名) 上收集证据和结果工件。 此数据与构建的工件相关,可通过部署过程和变更管理进行跟踪。
阶段和任务
下表列出了在 CI 管道中运行的任务。 此外,该表还提供了以下每个阶段的概述:
-
任务或阶段: 这是指在
.pipeline-config.yaml
配置文件中定义的阶段的名称。 -
简短描述: 提供阶段执行期间执行的操作的简明说明。
-
允许定制: 这指示用户是否具有通过在
.pipeline-config.yaml
文件中插入定制脚本来修改或替换阶段的缺省行为的灵活性。 -
默认参考实现:这表明DevSecOps管道带有该阶段的预定义或默认实现。 值得注意的是,对于某些阶段,例如
unit-tests
或者setup
,这DevSecOps管道不提供任何开箱即用的实现。 而是需要用户提供定制脚本或根据其应用程序需求定制的代码。 -
证据收集: 指示阶段是否执行标准证据收集。 什么时候DevSecOps管道为某个阶段提供参考实现,开箱即用地进行证据收集。 但是,如果 用户 选择修改或替换这些预定义阶段,那么他们必须确保其定制实现包含相应的证据收集。 对于以下阶段,用户也负有同样的责任:DevSecOps管道没有提供开箱即用的实现,因此需要他们进行证据收集。 该列指示负责执行证据收集的实体 (用户/管道)。
-
允许跳过 (适用于版本> = v10): 这指示用户是否可以通过在
.pipeline-config.yaml
中将 skip 属性设置为 true 来选择退出运行此阶段。 但是,使用此功能时请务必谨慎,尤其是对于旨在收集证据的阶段。 跳过此类阶段可能会导致缺少构建的基本证据。
任务或阶段 | 简短描述 | 在 .pipeline-config.yaml 中允许定制 |
缺省引用实现 | 证据收集 | 允许跳过 |
---|---|---|---|---|---|
start |
设置管道环境。 | 否 | 是 | 管道 | 否 |
setup |
设置构建和测试环境。 | 是 | 否 | 不适用 | 否 |
detect-secrets |
对应用程序代码运行检测密钥扫描。 | 是 | 是 | 管道 | 否 |
test |
对应用程序代码运行单元测试和应用程序测试。 | 是 | 否 | 用户 | 是 |
static-scan |
对应用程序代码运行静态扫描代码。 | 是 | 是 | 管道 | 是 |
compliance-checks |
对应用程序存储库运行 Code Risk Analyzer 扫描和其他合规性检查。 | 是 | 是 | 管道 | 是 |
containerize |
构建工件。 | 是 | 否 | 不适用 | 否 |
sign-artifact |
对构建的工件进行签名。 | 是 | 是 | 管道 | 否 |
deploy |
将构建的工件部署到开发环境。 | 是 | 否 | 不适用 | 否 |
dynamic-scan |
在应用程序上运行动态扫描。 | 是 | 是 | 管道 | 是 |
acceptance-test |
在开发环境上对已部署的已构建工件运行验收和集成测试。 | 是 | 否 | 用户 | 是 |
scan-artifact |
扫描构建的工件。 | 是 | 是 | 管道 | 是 |
release |
将构建的工件添加到库存。 | 是 | 否 | 不适用 | 是 |
finish |
收集,创建日志文件,工件和证据并将其上载到证据锁定程序。 | 是 | 是 | 不适用 | 是 |
有关如何使用 .pipeline-config.yaml
文件定制阶段的更多信息,请参阅 定制脚本 和 管道参数 列表。
阶段和证据
下表提供了各种类型的证据与收集这些证据的管道中的特定阶段之间的关系。
任务或阶段 | 证据类型 |
---|---|
start |
不适用 |
setup |
不适用 |
detect-secrets |
com.ibm.detect_secrets |
test |
com.ibm.unit_tests |
static-scan |
com.ibm.static_scan |
compliance-checks |
com.ibm.code_bom_check , com.ibm.code_cis_check , com.ibm.code_vulnerability_scan , com.ibm.branch_protection |
containerize |
不适用 |
sign-artifact |
com.ibm.cloud.image_signing |
deploy |
不适用 |
dynamic-scan |
com.ibm.dynamic_scan |
acceptance-test |
com.ibm.acceptance_tests |
scan-artifact |
com.ibm.cloud.image_vulnerability_scan |
release |
不适用 |
finish |
com.ibm.pipeline_logs , com.ibm.pipeline_run_data |
有关如何使用 collect-evidence
脚本在可定制用户阶段中收集证据的更多信息,请参阅 collect-evidence script。
检测私钥扫描
静态代码扫描
静态代码扫描阶段在指定的应用程序存储库上运行大量静态代码分析器工具。 将扫描 pipelinectl save_repo
命令提供的存储库和缺省应用程序存储库。
您可以使用以下任何方法向管道添加静态代码:
-
通过将 SonarQube 工具添加到工具链,提供已运行的 SonarQube 实例名称,URL 和凭证。 静态扫描任务在指定的存储库上运行扫描。
-
如果您没有自己的 SonarQube 实例,那么管道将在管道运行期间创建 SonarQube 实例。 在 static-scan 阶段成功运行后,您可以访问此实例。
-
通过使用
opt-in-gosec
参数来运行 gosec 扫描以执行 golang 安全性检查。 -
将您自己的静态扫描代码添加到
.pipeline-config.yaml
文件中的静态扫描定制阶段以用于定制实现。
将 SonarQube 扫描添加到管道
有关将 SonarQube 与持续集成管道集成的更多信息,请参阅 配置 SonarQube。
将 gosec 扫描集成添加到管道
使用 gosec 来检查扫描的存储库中的 golang 源代码。
要启用 gosec 扫描,请提供以下参数,并将值设置为 1
。
名称 | 类型 | 描述 | 必需或可选 |
---|---|---|---|
opt-in-gosec |
text | 用于启用 gosec 扫描的选项 | 可选 |
有关在持续集成管道中设置 gosec 扫描的更多信息,请参阅 配置 GoSec
使用其他静态扫描程序
如果要改为使用您自己的静态扫描实现,那么可以修改 .pipeline-config.yaml
文件并添加您自己的 [定制脚本](请参阅定制脚本 到 static-scan
阶段。
扫描并检查一致性检查
扫描或检查 | 描述 |
---|---|
Code Risk Analyzer 漏洞扫描 | 查找所有应用程序包依赖关系,容器基本映像和操作系统包的漏洞。 使用 Code Risk Analyzer 工具。 |
Code Risk Analyzer CIS 检查 | 在 Kubernetes 部署清单上运行 配置检查。 使用 Code Risk Analyzer 工具。 |
Code Risk Analyzer 材料清单 (BOM) 检查 | 用于捕获所有依赖关系的 pedigree 的指定存储库的 BOM。 将以不同的粒度收集此 BOM。 例如,BOM 捕获构建中使用的基本映像的列表,基本映像中的软件包的列表以及安装在基本映像上的应用程序软件包的列表。 BOM 充当分析结果的参考标准,并可能用于实施策略检测点。 使用 Code Risk Analyzer 工具。 |
存储库合规性检查 | 检查分支保护设置是否正确。 例如,主/主分支应始终限制强制推送。 有关更多信息,请参阅 配置 Git Repos and Issue Tracking 存储库。 |
Mend Unified Agent 漏洞扫描 | Mend Unified Agent 扫描工具 扫描应用程序存储库的开放式源代码组件以查找易受攻击的库和源文件。 有关更多信息,请参阅 配置 Mend Unified Agent 扫描。 |
这些脚本在管道感知的所有应用程序存储库上运行。 要向这些扫描添加存储库,请使用安装阶段中提供的 pipelinectl
界面。
有关用户脚本阶段的预期输出的更多信息,请参阅 定制脚本。
构建
在“构建”阶段中,您可以构建自己的工件。 虽然管道为 Docker 映像类型工件提供了一些缺省功能,但您可以在此阶段构建任何类型的工件。
使用 Pipeline UI 中的环境变量为构建提供凭证,私钥和参数。 您可以在此阶段以及所有定制阶段中访问这些环境变量。 有关如何访问定制脚本阶段中的参数和私钥的更多信息,请参阅 定制脚本。
工件扫描和签名
工件扫描和签名阶段通过可定制的步骤为 Docker 映像提供缺省行为:
- 使用 GPG 密钥进行映像签名。
- Container Registry Vulnerability Advisor 扫描。
要开始使用这些阶段,请提供工件以供管道使用 pipelinectl
接口。 您无需更新构建脚本和 .pipeline-config.yaml
配置。
要使用其他扫描或签名流程,或者要在 icr.io
中处理除 Docker 映像以外的工件,您可以使用项目中的 .pipeline-config.yaml
配置来定制这些阶段。
部署到开发
Deploy 阶段将已构建的工件部署到开发环境中。 您可以从 管道 UI 中的变量 和 管道触发器 Webhook 有效内容 提供此阶段的变量和凭证。
动态扫描
动态代码扫描是黑匣漏洞扫描的一种形式,允许软件团队扫描正在运行的应用程序并识别漏洞。
在成功部署到开发环境之后,Dynamic Scan 阶段将在 Deploy to dev
阶段之后立即运行。
缺省情况下,管道提供对运行 Zed Attack Proxy (ZAP) Scan 的支持,它是在 OWASP 的保护伞下维护的免费开放源码渗透测试工具。 它执行 API 和 UI 动态扫描,这两种扫描都可以在样本 hello-compliance-app 上运行。
要运行动态扫描,请将管道参数 opt-in-dynamic-scan
设置为非空值。 要禁止阶段运行动态扫描,请将管道参数 opt-in-dynamic-scan
设置为空。 有关设置管道参数的更多信息,请参阅 管道参数。
CI 管道根据严重性在问题存储库中创建问题。 附加到问题的标签指示漏洞的严重性。
ZAP API 扫描
ZAP API 会扫描应用程序端点以查找可能的数据泄漏,内容类型错误,外部重定向,代码注入,SQL 注入,远程操作系统命令注入以及应用程序所暴露的其他漏洞。 ZAP API 扫描通过在阶段或测试环境中检测这些漏洞并在应用程序部署到生产环境之前对其进行修复,帮助开发者保护应用程序。
ZAP API 扫描需要以下输入来扫描应用程序:
- Swagger 定义文件-描述应用程序公开的 HTTP API 及其关联参数。
- API 密钥-向 API 端点认证所需的认证令牌。
- API 端点-您希望 ZAP 扫描的 Swagger 定义中的端点。
- 排除的 URL-ZAP 扫描程序要忽略的 URL。
ZAP API 扫描程序使用提及的输入来运行扫描并生成报告。
将 opt-in-dynamic-api-scan
设置为要运行的 ZAP API 扫描的非空值。 要选择退出,请将此参数设置为空。
ZAP UI 扫描
ZAP UI 会扫描应用程序端点以查找 Web 页面本身的漏洞,例如正在设置的不安全 cookie,不正确的高速缓存头设置,跨域文件包含,不正确的 CORS 设置以及应用程序所暴露的其他漏洞。
UI 扫描的工作方式与 API 扫描类似,但它们使用 UI 测试脚本而不是 Swagger 文件。 UI 测试脚本将启动配置为通过 ZAP 扫描程序的代理进行代理的无头浏览器,并针对 UI 端点运行 UI 测试。 运行 ZAP UI 测试的过程如下所示:
- 将测试脚本复制到 ZAP 扫描程序容器。
- 运行 ZAP 代理。
- 运行 zap 测试脚本。
ZAP 代理记录流量并发现要扫描的端点。 扫描完成后,代理将生成报告,并以与 ZAP API 扫描相同的方式生成问题。
将 opt-in-dynamic-ui-scan
设置为要运行的 ZAP API 扫描的非空值。 要选择退出,请将此参数设置为空。
- 将您自己的动态扫描代码添加到
.pipeline-config.yaml
文件中的动态扫描定制阶段以用于定制实现。
有关 ZAP API 扫描和 ZAP UI 扫描的更多信息,请参阅 配置 ZAP 扫描。
发布到库存
使用“发布到库存”用户脚本阶段,通过 cocoa inventory add
CLI 命令将工件添加到库存。 有关此命令的更多信息,请参阅 cocoa inventory add 主题。
如果要在管道中存在问题时跳过库存更新,请使用以下环境变量来检查管道的状态。 在更新库存之前,请检查其状态:
skip-inventory-update-on-failure
来自管道的选择性加入环境变量,用于指定是否应执行库存更新。- 如果管道运行中存在任何阶段故障,那么
one-pipeline-status
设置为1
。
您可以使用 pipelinectl
界面通过 list_repos
,load_repo
,list_artifacts
和 load_artifact
命令来访问存储库和工件。 有关这些命令的更多信息,请参阅 pipelinectl 文档。
在构建时收集合规性数据
当管道成功运行时,您可以收集有关构建的信息。
在将所有检查,扫描,测试和工件签名到证据锁定程序时收集证据。 管道日志文件还将与管道数据本身 (包含 Tekton 定义) 一起保存到锁定程序。 在此步骤中还会收集有关同级复审的合规性数据。 管道使用 pipelinectl
来搜索具有自上次构建以来合并的拉取请求的存储库。 它还会检查其复审状态,将其保存为工件,并根据结果创建证据。
最终脚本是评估程序,根据证据状态将管道状态标记为绿色或红色。 如果它们包含任何故障,那么持续集成运行将标记为红色。