Help us learn about your current experience with the documentation. Take the survey.

Sec 部门开发指南

Sec 部门负责 GitLab 应用安全功能,也就是 DevSecOps 中的 “Sec” 部分。这里列出了专门针对 Sec 部门的开发指南。

请参阅 术语表 了解我们共享的术语概述。

架构

概述

支持安全功能的架构分为两个主要部分:

  • 扫描
  • 处理、可视化和管理
flowchart LR
  subgraph G1[Scanning]
    Scanner
    Analyzer
    CI[CI Jobs]
  end
  subgraph G2[Processing, visualization, and management]
   Parsers
   Database
   Views
   Interactions
  end
  G1 --Report Artifact--> G2

扫描

扫描部分负责在给定资源中查找漏洞并导出结果。 扫描通过几个称为 分析器 的小型项目在 CI/CD 作业中执行,这些项目可以在我们的 分析器子组 中找到。 分析器是围绕称为 扫描器 的安全工具的包装器,这些工具由内部或外部开发,用于将它们集成到 GitLab 中。 分析器主要使用 Go 语言编写。

一些第三方集成商也通过遵循我们的 集成文档 提供额外的扫描器,该文档利用相同的架构。

扫描结果被导出为 JSON 报告,这些报告必须符合 安全报告格式,并作为 CI/CD 作业报告工件 上传,以便在流水线完成后进行处理。

处理、可视化和管理

当数据作为报告工件可用时,它可以由 GitLab Rails 应用程序处理以启用我们的安全功能,包括:

根据上下文,安全报告可以存储在数据库中,或者作为报告工件保留以便按需访问。

安全报告摄取概述

有关 GitLab 如何处理扫描器生成的报告的详细信息,请参阅 安全报告摄取概述

CI/CD 模板开发

虽然 CI/CD 模板由 Verify 部门负责,但许多模板对 Sec 部门的功能使用至关重要。 如果您正在使用 CI/CD 模板,请阅读 GitLab CI/CD 模板开发指南

主要标识符的重要性

在分析器 JSON 报告中,identifiers 字段 包含一个类型和类别集合,用于描述漏洞(即 CWE 家族)。 identifiers 集合中的第一项称为 主要标识符,它是描述和跟踪漏洞的关键组成部分。 在大多数其他情况下,identifiers 集合是无序的,其余的次要标识符充当用于分组漏洞的元数据(例外情况请参见下面的 分析器漏洞翻译)。

每当主要标识符更改并重新运行项目流水线时,新报告的摄取将"孤立"之前的数据库记录。 因为我们的处理逻辑依赖于生成两个不同漏洞的差异,最终可能会显得相当混乱。例如:

Screenshot of primary identifier mismatch in MR widget

合并 后,之前的漏洞被列为"已修复",而新引入的漏洞被标记为“已检测”

确保主要标识符稳定性的指导原则

  • 除非有充分的理由,否则主要标识符不应更改。
  • 支持漏洞翻译的分析器必须在次要位置包含旧版主要标识符,以防止结果"孤立"。
  • 除了主要标识符外,次要标识符的顺序无关紧要。
  • 标识符基于 TypeValue 字段的组合是唯一的(参见 标识符指纹)。
  • 如果我们更改主要标识符,将分析器回滚到之前的版本不会修复孤立的结果。先前摄取到我们数据库中的数据是先前作业的产物,很少有自动化数据迁移的方法。

分析器漏洞翻译

在 SAST Semgrep 分析器的情况下,有一个特别重要的次要标识符:将报告中的漏洞链接到旧版分析器(即 bandit 或 ESLint)的标识符。 为了 启用漏洞翻译,Semgrep 分析器依赖于一个与旧版分析器主要标识符完全匹配的次要标识符。

例如,当之前使用 eslint 生成漏洞记录时,semgrep 分析器必须生成一个包含原始 ESLint 主要标识符的标识符集合。

给定的原始 eslint 报告:

{
  "version": "14.0.4",
  "vulnerabilities": [
    {
      "identifiers": [
        {
          "type": "eslint_rule_id",
          "name": "ESLint rule ID security/detect-eval-with-expression",
          "value": "security/detect-eval-with-expression"
        }
      ]
    }
  ]
}

相应的 Semgrep 报告必须包含 eslint_rule_id

{
  "version": "14.0.4",
  "vulnerabilities": [
    {
      "identifiers": [
        {
          "type": "semgrep_id",
          "name": "eslint.detect-eval-with-expression",
          "value": "eslint.detect-eval-with-expression",
          "url": "https://semgrep.dev/r/gitlab.eslint.detect-eval-with-expression"
        },
        {
          "type": "eslint_rule_id",
          "name": "ESLint rule ID security/detect-eval-with-expression",
          "value": "security/detect-eval-with-expression"
        }
      ]
    }
  ]
}

漏洞跟踪 依赖于这两个标识符的组合,将先前使用旧版分析器生成的数据库记录重新映射到使用新的 semgrep 生成的记录。

开发设置:包元数据库同步

对于使用包元数据库 (PMDB) 的安全扫描和许可证合规功能,您需要在开发环境中设置 PMDB 同步。

有关详细的设置说明,请参阅 GDK 文档中的 包元数据同步指南