安全配置
- Tier: Free, Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
您可以为单个项目配置安全扫描器,或创建多个项目共享的扫描器配置。手动配置每个项目可以提供最大的灵活性,但在大规模情况下难以维护。对于多个项目或组,共享扫描器配置提供了更简便的管理方式,同时仍允许在需要时进行一些自定义。
例如,如果您有 10 个项目手动应用了相同的安全扫描配置,那么单个更改必须执行 10 次。如果您创建共享的 CI/CD 配置,则单个更改只需执行一次。
配置单个项目
要在单个项目中配置安全扫描,可以:
- 编辑 CI/CD 配置文件。
- 在 UI 中编辑 CI/CD 配置。
使用 CI/CD 文件
要手动启用单个项目的安全扫描,可以:
- 启用单个安全扫描器。
- 使用 AutoDevOps 启用所有安全扫描器。
AutoDevOps 为启用大多数安全扫描器提供了最省力的路径。但是,与启用单个安全扫描器相比,自定义选项有限。
启用单个安全扫描器
要启用单个安全扫描工具并可以自定义设置,请将安全扫描器的模板包含到您的 .gitlab-ci.yml 文件中。
有关如何启用单个安全扫描器的说明,请参阅其文档。
使用 Auto DevOps 启用安全扫描
要使用默认设置启用以下安全扫描工具,请启用 Auto DevOps:
虽然您无法直接自定义 Auto DevOps,但可以 将 Auto DevOps 模板包含在项目的 .gitlab-ci.yml 文件中 并根据需要覆盖其设置。
使用 UI
使用 安全配置 页面来查看和配置项目的安全测试和漏洞管理设置。
安全测试 选项卡通过检查默认分支上最新提交的 CI/CD 管道来反映每个安全工具的状态。
- 已启用
- 在管道输出中找到了安全测试工具的产物。
- 未启用
- 要么不存在 CI/CD 管道,要么在管道输出中未找到安全测试工具的产物。
查看安全配置页面
要查看项目的安全配置:
- 在左侧边栏,选择 搜索或跳转 并找到您的项目。
- 选择 安全 > 安全配置。
要查看 CI/CD 配置文件更改的历史记录,请选择 配置历史。
编辑项目的安全配置
要编辑项目的安全配置:
- 在左侧边栏,选择 搜索或跳转 并找到您的项目。
- 选择 安全 > 安全配置。
- 选择要启用或配置的安全扫描器,然后按照说明操作。
有关如何启用和配置单个安全扫描器的更多详细信息,请参阅其文档。
创建共享配置
- Tier: Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
要将相同的安全扫描配置应用到多个项目,请使用以下方法之一:
这些方法都允许定义一次 CI/CD 配置(包括安全扫描)并将其应用到多个项目和组。这些方法相对于单独配置每个项目有几个优势,包括:
- 配置更改只需执行一次,而不是为每个项目执行。
- 配置更改的权限受到限制,实现了职责分离。
扫描执行策略与合规框架的比较
在决定使用扫描执行策略还是合规框架时,请考虑以下几点。
- 当需要使用 GitLab 模板的扫描器的扫描执行强制时,例如 SAST IaC、DAST、依赖项扫描、API 模糊测试或覆盖率引导的模糊测试,请使用 合规框架管道。
- 当需要对 GitLab 外部的扫描器进行扫描执行强制时,请使用 合规框架管道。
- 当需要对安全扫描之外的自定义作业进行扫描执行强制时,请使用 合规框架管道。
- 当需要对使用 DAST 站点或扫描配置文件的 DAST 进行扫描执行强制时,请使用 扫描执行策略。
- 当需要对 SAST、SAST IaC、秘密检测、依赖项扫描或容器扫描进行具有项目特定变量自定义的扫描执行强制时,请使用 扫描执行策略。为此,用户必须为每个项目创建单独的安全策略。
- 当扫描需要定期、按计划运行时,请使用 扫描执行策略。
- 当需要对没有项目特定变量自定义的容器扫描进行扫描执行强制时,两种解决方案都可以使用。
关于这些解决方案之间差异的更多详细信息如下所示:
| 合规框架管道 | 扫描执行策略 | |
|---|---|---|
| 灵活性 | 支持可以在 CI/CD 文件中完成的任何操作。 | 仅限于 GitLab 明确添加支持的项目。支持 DAST、SAST、SAST IaC、秘密检测、依赖项扫描和容器扫描。 |
| 可用性 | 需要了解 CI YAML。 | 遵循基于 rules 和 actions 的 YAML 结构。 |
| 包含在 CI 管道中 | 合规管道代替项目的 .gitlab-ci.yml 文件执行。要包含项目的 .gitlab-ci.yml 文件,请使用 include 语句。不允许被包含项目的 YAML 文件覆盖定义的变量。 |
强制将新作业包含到 CI 管道中。必须在每个项目基础上自定义的 DAST 作业可以定义项目级别的站点配置文件和扫描配置文件。为确保职责分离,这些配置文件在扫描执行策略中被引用时是不可变的。所有作业都可以作为安全策略本身的一部分进行自定义,使用通常可用于 CI 作业的相同变量。 |
| 可调度性 | 必须通过每个项目上的计划管道进行调度。 | 可以通过策略配置本身进行原生调度。 |
| 职责分离 | 只有组所有者可以创建合规框架标签。只有项目所有者可以将合规框架标签应用到项目。对合规管道定义进行更改或批准的能力仅限于明确获得包含合规管道的项目访问权限的个人。 | 只有项目所有者可以定义链接的安全策略项目。对安全策略进行更改或批准的能力仅限于明确获得安全策略项目访问权限的个人。 |
| 将一个标准应用于多个项目的能力 | 相同的合规框架标签可以应用于组内的多个项目。 | 相同的安全策略项目可以用于 GitLab 中的多个项目,无需位于同一组中。 |
欢迎您就我们统一这两个功能的用户体验愿景提供反馈:https://gitlab.com/groups/gitlab-org/-/epics/7312
自定义安全扫描
您可以根据您的需求和环境自定义安全扫描。有关如何自定义单个安全扫描器的详细信息,请参阅其文档。
最佳实践
在自定义安全扫描配置时:
- 在将更改合并到默认分支之前,使用合并请求测试所有安全扫描工具的自定义。如果不这样做,可能会导致意外结果,包括大量误报。
- 包含 扫描工具的 CI/CD 模板。不要复制模板的内容。
- 仅在需要时覆盖模板中的值。所有其他值都继承自模板。
- 对于生产工作流,使用每个模板的稳定版本。稳定版本的变化较少,破坏性更改仅在主要 GitLab 版本之间进行。最新版本包含最近的更改,但在次要 GitLab 版本之间可能有重大更改。
模板版本
GitLab 应用安全工具最多有两个模板版本:
- 稳定版:稳定版是默认版本。它提供可靠和一致的应用安全体验。对于大多数需要稳定性和可预测行为的 CI/CD 管道的用户和项目,您应该使用稳定版模板。
- 最新版:最新版适用于那些想要访问和测试前沿功能的用户。它通过模板名称中的
latest一词来标识。它不被认为是稳定的,并且可能包含计划在下一个主要版本中进行的破坏性更改。此模板允许您在功能成为稳定版本的一部分之前尝试新功能和更新。
不要在同一项目中混合使用安全模板。混合使用不同的安全模板版本可能会导致合并请求和分支管道都运行。
覆盖默认注册表基础地址
默认情况下,GitLab 安全扫描器使用 registry.gitlab.com/security-products 作为 Docker 镜像的基础地址。您可以通过将 CI/CD 变量 SECURE_ANALYZERS_PREFIX 设置为其他位置来覆盖大多数扫描器的此设置。这会影响所有扫描器。
容器扫描 分析器是一个例外,它不使用 SECURE_ANALYZERS_PREFIX 变量。要覆盖其 Docker 镜像,请参阅 在离线环境中运行容器扫描 的说明。
在合并请求管道中使用安全扫描工具
默认情况下,应用安全作业配置为仅对分支管道运行。要在 合并请求管道 中使用它们,可以:
- 将 CI/CD 变量
AST_ENABLE_MR_PIPELINES设置为"true"(在 18.0 中引入)(推荐) - 使用
latest版本模板,它默认启用合并请求管道。
例如,要同时启用 SAST 和依赖项扫描并启用合并请求管道,使用以下配置:
include:
- template: Jobs/Dependency-Scanning.gitlab-ci.yml
- template: Jobs/SAST.gitlab-ci.yml
variables:
AST_ENABLE_MR_PIPELINES: "true"使用自定义扫描阶段
安全扫描器模板默认使用预定义的 test 阶段。要让它们在不同的阶段运行,请将自定义阶段的名称添加到 .gitlab-ci.yml 文件的 stages: 部分。
有关覆盖安全作业的更多信息,请参阅:
故障排除
在配置安全扫描时,您可能会遇到以下问题。
错误:所选阶段 test 不存在
运行管道时,您可能会收到错误消息 chosen stage test does not exist。
当安全扫描作业使用的阶段未在 .gitlab-ci.yml 文件中声明时,会出现此问题。
要解决此问题,可以:
-
在您的
.gitlab-ci.yml中添加一个test阶段:include: - template: Jobs/Dependency-Scanning.gitlab-ci.yml - template: Jobs/SAST.gitlab-ci.yml - template: Jobs/Secret-Detection.gitlab-ci.yml stages: - test - unit-tests custom job: stage: unit-tests script: - echo "custom job" -
覆盖每个安全作业的默认阶段。例如,使用名为
unit-tests的预定义阶段:include: - template: Jobs/Dependency-Scanning.gitlab-ci.yml - template: Jobs/SAST.gitlab-ci.yml - template: Jobs/Secret-Detection.gitlab-ci.yml stages: - unit-tests dependency_scanning: stage: unit-tests sast: stage: unit-tests .secret-analyzer: stage: unit-tests custom job: stage: unit-tests script: - echo "custom job"