测试 (Open Source)

组织 → 资产 → 测试活动 → 测试 → 发现项

概述

测试是一个或多个扫描执行的容器,用于发现产品中的缺陷。测试是 DefectDojo 产品层级结构中最末端、最细粒度的组成部分,作为安全工具执行或人工评估所产生的发现项的容器,同时还添加了发现这些发现项所处的上下文(即报告该发现项的工具、该工具上次运行的时间等)。

测试的示例包括:

  • 静态应用程序安全测试
  • 动态应用程序安全测试
  • 软件成分分析
  • 容器安全扫描
  • 基础设施/网络扫描
  • 人工渗透测试
  • CI/CD 流水线扫描

测试类型

在 DefectDojo 中创建测试主要有两种方式:

  1. 特定厂商解析器(例如 Burp、OWASP ZAP、Acunetix、Invicti)
  2. 通用发现项导入

根据配置和去重策略的不同,每种方法都可以创建新测试,或将发现项重新导入到现有测试中。

虽然这两种方法的主要区别在于扫描数据的解析和接收方式,但它们最终都会使发现项与某个测试相关联。

解析器

解析器是处理特定扫描输出格式(例如 XML、JSON、CSV)并将其映射到 DefectDojo 内部发现项模型的组件。导入扫描结果时,DefectDojo 会使用所选的解析器提取发现项,并将其附加到新创建的测试或现有测试中。

通用发现项导入

当某个工具没有原生解析器时,通用发现项导入允许您使用标准化的 JSON 或 CSV 模式导入发现项,而无需考虑原始数据来源。

DefectDojo 会解析所提供的数据,创建一个新测试(或将数据导入到现有测试中),并附加发现项。系统还会根据报告中可选的 type 字段创建相应的测试类型:当省略 type(或其值等于扫描类型)时,测试类型为 “Generic Findings Import”;当提供了 type 时,测试类型将变为 “{type} Scan (Generic Findings Import)”(如果 type 本身已经以 “(Generic Findings Import)” 结尾,则按原样使用)。

原生解析器通用发现项导入
主要用途接收受支持工具的输出通过固定模式接收不受支持的/自定义数据
输入格式特定于工具(例如 ZAP XML、SARIF)严格的 JSON/CSV 模式
由谁处理规范化DefectDojo(内置解析器)用户(必须符合模式规范)
测试创建触发方式手动上传或 API 导入手动上传或 API 导入
测试类型预定义(例如 “ZAP Scan”)自动创建的 “Generic” 类型
配置成本中(需要进行数据转换)
灵活性低(仅限受支持的工具)
自动化程度低至中低至中
典型使用场景标准扫描器(SAST、DAST、SCA)自定义脚本、不受支持的工具

无论采用哪种接收方式,DefectDojo 中的所有扫描数据最终都会以附加到某个测试上的发现项形式呈现,该测试则作为执行单元和生命周期跟踪的单位。

测试数据

测试会存储各种元数据,以帮助记录每次测试工作的各个组成部分,例如:

  • 测试标题/名称
  • 测试类型
  • 测试描述/备注
  • 开始和结束日期
  • 运行测试的环境(例如开发、预发布、准生产、生产等)
  • 版本/分支/构建 ID/提交哈希值
  • API 扫描配置
  • 可用于后续审计或重新导入的其他文件
  • 上级测试活动、资产和组织
  • 导入和重新导入的历史记录

每个测试都会维护一份导入历史记录,用于记录与该测试相关的所有扫描导入和重新导入操作,其中包括扫描日期、版本、分支、提交哈希值和构建 ID 等元数据。

这份历史记录为同一测试内的多次扫描执行提供了可追溯性。

权限

单个测试活动内可以存储多个测试,而测试活动则存储在产品内。因此,对某个产品的访问权限会自动授予对该产品内所有测试(及测试活动)的访问权限。测试没有独立的访问控制列表。

访问测试

尽管测试在 DefectDojo OS 中作为独立对象存在,但界面中并没有专门用于展示测试的特定区域。因此,每个测试主要通过包含它的产品和/或测试活动来访问。

测试视图

测试视图承载了多种表格,包括上级测试活动、导入和重新导入历史记录、测试内包含的发现项列表以及任何发现项分组。

此外还有潜在发现项、文件和备注的表格,这些都可以手动添加。

测试设置

每个测试视图中都提供以下设置:

  • 编辑测试
    • 允许编辑测试数据,例如标题、计划安排、环境以及其他各种详细信息。
  • 复制测试
    • 复制某个测试及其所有相关元数据和发现项,并允许将其归属到不同的测试活动。
  • 重新上传扫描
    • 启动重新导入流程。有关重新导入的更多信息,请参阅本文后面的内容。
  • 添加备注
    • 允许用户添加备注。页面底部还有一个备注表格。
      • 备注可以切换为私密状态,此时该备注不会被推送到 Jira、报告以及发现项的导出内容中。
  • 报告
    • 启动生成报告的流程,您可以在其中应用多种筛选条件,从而仅针对筛选后的发现项生成报告。
  • 添加到日历
    • 下载所选测试的 .ics 文件,该文件可添加到您的第三方日历应用程序中。
  • 查看历史记录
    • 打开对该测试所做编辑的历史记录,用于跟踪、报告和审计目的。

使用测试

创建测试

当扫描数据被直接导入到某个测试活动中时,系统会自动创建测试,从而生成一个包含该扫描数据的新测试。测试也可以为规划未来的测试活动而预先创建,或用于需要跟踪和修复的手动录入安全发现项。

手动工作流

在 OS 版本中,有多种方式可以创建测试:

  • 选择一个产品,然后在导航栏的“发现项”菜单中点击“导入扫描结果”
    • 这将创建一个临时测试活动来包含该测试

image

  • 在产品内选择一个测试活动,点击“测试”子区域中的下拉菜单,然后点击“添加测试”或“导入扫描结果”
    • 这将直接在所选的测试活动内创建随之产生的测试

image

  • 在创建测试活动的过程中

image

使用上述第三种方法,您可以在创建测试活动的同时执行以下操作:

  • 立即导入扫描结果
  • 创建测试外壳(稍后可向其中导入扫描数据)
  • 两者都不做,只需点击“完成”来创建测试活动

无论是导入扫描数据还是创建测试外壳,您都可以借此机会添加元数据。任何元数据都会反映在测试视图的导入历史记录部分中。

自动化工作流

在自动化工作流中,测试可以作为扫描导入流程的一部分以编程方式创建,使流水线能够上传结果,而无需事先手动创建测试。

使用 API 导入扫描结果时,通过提供 engagement(而非 test)参数,系统可以自动创建一个新测试。

API

curl -X POST "https://<your-instance>/api/v2/import-scan/"
-H "Authorization: Token <api_key>"
-F "engagement=45"
-F "scan_type=ZAP Scan"
-F "file=@report.xml"

如上所示,系统会在指定的测试活动下创建一个新测试,并将扫描结果附加到该测试中。

如果改为提供 test ID,则扫描结果将被添加到现有测试中,这在重新导入工作流中很常见。

编辑测试

要编辑测试,可以在上级测试活动视图中的测试表格里点击 ⋮ 竖排菜单中的编辑测试,也可以在测试视图内的设置菜单中进行编辑。随后可编辑的所有字段,在创建测试时也同样可用。

image

image

手动向测试添加发现项

要将发现项手动添加到测试,可以在上级测试活动视图中,点击测试旁边 ⋮ 竖排菜单中的将发现项添加到测试,也可以在测试视图内发现项表格的设置中进行添加。

image

image

删除测试

要删除测试,可以在上级测试活动视图中,从测试旁边的 ⋮ 竖排菜单中选择删除测试,也可以在测试视图内的设置菜单中进行删除。此操作无法撤销。

删除测试还会删除该测试内包含的所有发现项。

image

image

重新导入

在测试内重新导入扫描是实现有效去重的基础。当扫描结果被重新导入到同一测试中时:

  • 现有发现项可能会被更新
  • 重复的发现项可能会被抑制
  • 如果未找到匹配项,则可能会创建新的发现项

这一行为取决于所配置的去重规则和扫描类型。

创建新测试而非重新导入到现有测试中,可能会导致创建重复的发现项,而不是对其进行更新。

重新导入与导入的比较

重新导入通常适用于以下情况:

  • 针对同一目标运行周期性扫描
  • 跟踪发现项随时间的变化情况
  • 持续掌握应用程序的安全态势

相比之下,导入(创建新测试)更适用于一次性或独立的扫描执行。

重新导入扫描结果(界面操作)

要向现有测试添加新数据,可以在上级测试活动视图中,点击测试旁边 ⋮ 竖排菜单中的重新上传扫描结果,也可以在测试视图内的设置菜单中点击重新上传扫描

image

image

在填写“重新导入扫描”表单时,您可以选择更新正在重新导入的扫描的元数据,包括版本、分支标签、提交哈希值和构建 ID。

这些更改会反映在测试视图的导入历史记录部分中,该部分还会包含之前扫描导入的相同元数据。

例如,在下面的屏幕截图中,分支标签、构建 ID、提交哈希值和版本均在首次导入与后续重新导入之间被手动更新。

image

要编辑最近一次重新导入扫描的元数据,请按照上文“编辑测试”部分中的说明进行操作,并根据需要更新元数据。只有最近一次导入的元数据可以编辑。

重新导入扫描结果(API)

当测试通过 CI/CD 流水线创建或更新时,您可以纳入来自该流水线运行的元数据,以便将测试正确关联到其所扫描的代码。这使您能够:

  • 将扫描结果与特定的提交或分支相关联。
  • 跟踪发现项随代码变更的演变情况。
  • 通过了解两次扫描是否适用于相同或不同版本的代码,来改进去重效果。
  • 通过准确显示所扫描的代码内容及扫描时间,来支持可审计性。

DefectDojo 的 API 在导入或重新导入期间接受这些值,以便将其作为扫描导入的一部分进行存储,并反映在测试的导入历史记录中。此元数据可用于识别提交哈希值,或与 CI/CD 运行相关的任何相关代码仓库信息。

支持的元数据字段

API 支持一组明确定义的元数据字段,这些字段可以在重新导入期间包含。其中包括:

  • tags
  • version
  • build_id
  • branch_tag
  • commit_hash
  • scan_date
  • minimum_severity
  • active / verified 标志

这些字段是在重新导入操作期间附加上下文元数据的主要机制。

在自动化流水线中,最常提供的元数据包括:

  • build_id(CI 作业标识符)
  • commit_hash(源代码控制引用)
  • branch_tag(分支或环境上下文)
  • tags(例如 nightly、staging、production)

这些字段无需人工干预即可在各次扫描之间提供可追溯性。

尽管可以通过“重新导入扫描”表单手动更新元数据,但大多数自动化环境会通过直接调用 /api/v2/reimport-scan/ 端点来处理此事。这种方式使流水线能够在重新导入时自动附加元数据。

使用元数据进行 API 重新导入

curl -X POST "https://<your-instance>/api/v2/reimport-scan/"
-H "Authorization: Token <api_key>"
-F "test=123"
-F "scan_type=ZAP Scan"
-F "file=@report.xml"
-F "tags=nightly,api-scan"
-F "version=1.4.2"
-F "build_id=jenkins-842"
-F "branch_tag=main"
-F "commit_hash=a1b2c3d4"

元数据、重新导入与计划扫描

扫描也可以设置为按固定周期运行,例如由 cron 作业触发的扫描。计划扫描与代码仓库活动无关,因此提交哈希值或分支名称等元数据除非由脚本本身显式注入,否则并不适用。尽管如此,如果您希望在单个测试内保留安全态势的滚动记录,使用重新导入仍然会很有帮助。