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 集合是无序的,其余的次要标识符充当用于分组漏洞的元数据(例外情况请参见下面的 分析器漏洞翻译)。
每当主要标识符更改并重新运行项目流水线时,新报告的摄取将"孤立"之前的数据库记录。 因为我们的处理逻辑依赖于生成两个不同漏洞的差异,最终可能会显得相当混乱。例如:
在 合并 后,之前的漏洞被列为"已修复",而新引入的漏洞被标记为“已检测”。
确保主要标识符稳定性的指导原则
- 除非有充分的理由,否则主要标识符不应更改。
- 支持漏洞翻译的分析器必须在次要位置包含旧版主要标识符,以防止结果"孤立"。
- 除了主要标识符外,次要标识符的顺序无关紧要。
- 标识符基于
Type和Value字段的组合是唯一的(参见 标识符指纹)。 - 如果我们更改主要标识符,将分析器回滚到之前的版本不会修复孤立的结果。先前摄取到我们数据库中的数据是先前作业的产物,很少有自动化数据迁移的方法。
分析器漏洞翻译
在 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 文档中的 包元数据同步指南。