扫描结果策略

群组级扫描结果策略引入于 15.6 版本。

您可以使用扫描结果策略根据扫描结果采取行动。例如,一种类型的扫描结果策略是允许根据一个或多个安全扫描作业的 findings,要求批准的安全批准策略。在 CI 扫描作业完全执行后评估扫描结果策略。

扫描结果策略编辑器

引入于 14.8 版本,功能标志名为 scan_result_policy。默认禁用。

note只有项目所有者有权选择安全策略项目。

完成策略后,通过选择编辑器底部的 创建合并请求 来保存,将您重定向到项目的已配置安全策略项目的合并请求。 如果安全策略项目未关联到您的项目,系统会为您创建项目。 通过选择编辑器底部的 删除策略,也可以从编辑器界面中删除现有策略。

大多数策略更改会在合并请求合并后立即生效。未通过合并请求并直接提交到默认分支的任何更改,可能需要长达 10 分钟才能使策略更改生效。

策略编辑器支持 YAML 模式和规则模式。

note对于具有大量项目的群组创建的扫描结果策略,其传播将需要一段时间才能完成。

扫描结果策略 schema

带有扫描结果策略的 YAML 文件由一组与嵌套在 scan_result_policy 键下的扫描结果策略模式匹配的对象组成。您可以在 scan_result_policy 键下配置最多五个策略。

当您保存新策略时,GitLab 会根据此 JSON 模式 验证其内容。 如果您不熟悉如何阅读 JSON 模式,以下部分和表格提供另一种选择。

字段 类型 可能的值 描述
scan_result_policy 扫描结果策略的 array   扫描执行策略列表(最多 5 个)

扫描结果策略 schema

字段 类型 可能的值 描述
name string   策略名称。最多 255 个字符。
description(可选) string   策略的描述。
enabled boolean true, false 启用 (true) 或禁用 (false) 策略的标志。
rules 规则的 array   策略应用的规则列表。
actions 操作的 array   策略强制执行的操作列表。

scan_finding 规则类型

此规则根据提供的信息强制执行定义的操作。

字段 类型 可能的值 描述
type string scan_finding 规则的类型
branches stringarray [] 或分支名称 仅适用于受保护的目标分支。一个空数组 [] 可以将规则应用于所有受保护的目标分支。
scanners stringarray sastsecret_detectiondependency_scanningcontainer_scanningdastcoverage_fuzzingapi_fuzzing 此规则要考虑的安全扫描程序。
vulnerabilities_allowed integer 大于或等于零 在考虑此规则之前允许的漏洞数。
severity_levels stringarray infounknownlowmediumhighcritical 此规则要考虑的严重性级别。
vulnerability_states stringarray newly_detecteddetectedconfirmedresolveddismissed 所有漏洞分为两类:

新检测到的漏洞 - newly_detected 策略选项涵盖合并请求本身中的 DetectedDismissed 漏洞,这些漏洞目前在默认分支上不存在。此策略选项要求流水线在按规则评估之前完成,以便它知道是否新检测到漏洞。合并请求在流水线之前被阻止,并且必要的安全扫描已完成。

Detected
Dismissed

预先存在的漏洞 - 这些策略选项会立即进行评估,并且不需要完整的流水线,因为它们只考虑先前在默认分支中检测到的漏洞。

Detected - 该策寻找略在 Detected 状态下的漏洞。
Confirmed - 该策寻找略在 Confirmed 状态下的漏洞。
Dismissed - 该策寻找略在 Dismissed 状态下的漏洞。
Resolved - 该策寻找略在 Resolved 状态下的漏洞。

license_finding 规则类型

此规则根据许可证调查结果强制执行定义的操作。

字段 类型 可能的值 描述
type string license_finding 规则的类型
branches stringarray [] 或分支的名称 仅适用于受保护的目标分支。空数组 [] 将规则应用于所有受保护的目标分支。
match_on_inclusion boolean truefalse 该规则是否匹配包含或排除 license_types 中列出的许可证。
license_types stringarray 许可证类型 要匹配的许可证类型,例如 BSDMIT
license_states stringarray newly_detecteddetected 是否匹配新检测到的和/或以前检测到的许可证。

require_approval 操作类型

此操作设置在满足已定义策略中的至少一个规则的条件时,需要的批准规则。

字段 类型 可能的值 描述
type string require_approval 操作的类型。
approvals_required integer 大于或等于零 所需的 MR 批准数。
user_approvers array of string 一位或多位用户的用户名 被视为核准人的用户。用户必须有权访问该项目才有资格进行批准。
user_approvers_ids array of integer 一个或多个用户的 ID 被视为核准人的用户的 ID。用户必须有权访问该项目才有资格进行批准。
group_approvers array of string 一个或多个群组的路径 被视为核准人的群组。具有群组中直接成员资格的用户有资格进行批准。
group_approvers_ids array of integer 一个或多个群组的 ID 被视为核准人的群组的 ID。具有群组中直接成员资格的用户有资格进行批准。

要求和限制:

  • 您必须添加相应的安全扫描工具。否则,扫描结果策略将不起作用。
  • 策略的最大数量为五个。
  • 每个策略最多可以有五个规则。

示例安全扫描结果策略项目

您可以在 .gitlab/security-policies/policy.yml 中使用此示例,如安全策略项目中所述: yaml --- scan_result_policy: - name: critical vulnerability CS approvals description: critical severity level only for container scanning enabled: true rules: - type: scan_finding branches: - main scanners: - container_scanning vulnerabilities_allowed: 0 severity_levels: - critical vulnerability_states: - newly_detected actions: - type: require_approval approvals_required: 1 user_approvers: - adalberto.dare - name: secondary CS approvals description: secondary only for container scanning enabled: true rules: - type: scan_finding branches: - main scanners: - container_scanning vulnerabilities_allowed: 1 severity_levels: - low - unknown vulnerability_states: - newly_detected actions: - type: require_approval approvals_required: 1 user_approvers: - sam.white

在此例中:

  • 每个包含由容器扫描识别的新 critical 级别的漏洞的 MR,都需要 alberto.dare 的批准。
  • 每个 MR 都包含一个以上由容器扫描识别的新的 lowunknown 级别的漏洞,需要 sam.white 的一次批准。

扫描结果策略编辑器示例

您可以在扫描结果策略编辑器的 YAML 模式下使用此示例。 它对应于上一个示例中的单个对象:

- name: critical vulnerability CS approvals
  description: critical severity level only for container scanning
  enabled: true
  rules:
  - type: scan_finding
    branches:
    - main
    scanners:
    - container_scanning
    vulnerabilities_allowed: 1
    severity_levels:
    - critical
    vulnerability_states:
    - newly_detected
  actions:
  - type: require_approval
    approvals_required: 1
    user_approvers:
    - adalberto.dare

扫描结果策略需要额外批准的示例情况

在几种情况下,扫描结果策略需要额外的批准步骤。例如:

  • 工作分支中的安全作业数量减少,不再与目标分支中的安全作业数量匹配。用户无法通过从 CI 配置中删除扫描作业,来跳过扫描结果策略。
  • 有人停止了流水线安全作业,用户无法跳过安全扫描。
  • 合并请求中的作业失败并配置为 allow_failure: false,结果流水线处于阻塞状态。
  • 流水线有一个手动作业,必须成功运行才能使整个流水线通过。