教程:使用流水线秘密检测保护你的项目
如果你的应用程序使用外部资源,通常需要使用秘密(如 token 或 key)来验证应用程序身份。如果秘密被推送到远程仓库,任何有权访问该仓库的人都可以冒充你或你的应用程序。
流水线秘密检测使用 CI/CD 作业来检查你的 GitLab 项目中是否存在秘密。在本教程中,你将创建一个项目、配置流水线秘密检测,并学习如何分析其结果:
开始之前
开始本教程前,请确保你具备以下条件:
- 一个 GitLab.com 账户。要充分利用流水线秘密检测的所有功能,如果你有 Ultimate 账户,应该使用该账户。
- 对 CI/CD 有一定了解。
创建项目
首先,创建一个项目并启用秘密检测:
- 在左侧边栏顶部,选择 Create new( )> New project/repository。
- 选择 Create blank project。
- 输入项目详情:
- 输入项目名称和项目 slug。
- 从 Project deployment target (optional) 下拉列表中选择 No deployment planned。
- 勾选 Initialize repository with a README 复选框。这为你之后向项目添加内容提供了一个位置。
- 勾选 Enable Secret Detection 复选框。
- 选择 Create project。
将创建一个新项目,并使用 README 和 .gitlab-ci.yml 文件进行初始化。
CI/CD 配置包含 Security/Secret-Detection.gitlab-ci.yml 模板,
该模板在项目中启用了流水线秘密检测。
检查作业输出
流水线秘密检测在一个名为 secret_detection 的 CI/CD 作业中运行。
扫描结果写入 CI/CD 作业日志。每次扫描还会生成一份完整的报告作为作业产物。
要检查最近一次扫描的结果:
- 在左侧边栏,选择 Build > Jobs。
- 选择最近的
secret_detection作业。如果你没有运行新的流水线,应该只有一个作业。 - 检查日志输出中的以下内容:
- 关于扫描的信息,包括分析器版本和规则集。你的项目使用默认规则集,因为你自动启用了秘密检测。
- 是否检测到任何秘密。你应该看到
no leaks found。
- 要下载完整报告,在 Job artifacts 下,选择 Download。
启用合并请求流水线
到目前为止,我们使用流水线秘密检测来扫描默认分支中的提交。但是要在将合并请求合并到默认分支之前分析其中的提交,你需要启用合并请求流水线。
为此:
-
将以下行添加到你的
.gitlab-ci.yml文件中:variables: AST_ENABLE_MR_PIPELINES: "true" -
保存更改并将其提交到项目的
main分支。
添加假秘密
接下来,让我们通过在合并请求中"泄露"一个假秘密来使作业输出变得复杂:
-
检出一个新分支:
git checkout -b pipeline-sd-tutorial -
编辑你的项目 README 并添加以下行。 确保删除
-前后的空格,以匹配个人访问令牌的确切格式:# 为使示例生效,请删除 # 破折号前后的空格: glpat - 12345678901234567890 -
提交并推送你的更改,然后打开一个合并请求将其合并到默认分支。
将自动运行合并请求流水线。
-
等待流水线完成,然后检查作业日志。你应该看到
WRN leaks found: 1。 -
下载作业产物并检查,确保它包含以下信息:
-
秘密类型。在本示例中,类型是
"GitLab personal access token"。 -
关于秘密用途的描述,以及一些可以采取的修复泄露的步骤。
-
泄露的严重性。因为个人访问令牌可用于冒充 GitLab.com 上的用户,所以此泄露为
Critical。 -
秘密的原始文本。
-
关于秘密位置的一些信息:
"file": "README.md", "line_start": 97, "line_end": 97,在本示例中,秘密位于文件
README.md的第 97 行。
-
使用合并请求安全小部件
- Tier: Ultimate
在非默认分支上检测到的秘密称为"发现项"(finding)。 当发现项被合并到默认分支时,它就变成了"漏洞"(vulnerability)。
合并请求安全小部件显示一个发现项列表,如果合并请求被合并,这些发现项可能会变成漏洞。
要查看小部件:
- 选择你在上一步中创建的合并请求。
- 找到合并请求安全小部件,它以 Security scanning 开头。
- 在小部件上,选择 Show details( )。
- 查看显示的信息。你应该看到 Secret detection detected 1 new potential vulnerability。
要查看合并请求中所有发现项的详细视图,选择 View all pipeline findings。
处理秘密
- Tier: Ultimate
在 GitLab Ultimate 上,作业输出还会写入:
- 流水线的 Security 选项卡。
- 如果发现项变成了漏洞,漏洞报告中。
为了演示如何通过 UI 处理秘密,让我们创建一个漏洞并在漏洞报告中更改其状态:
-
合并你在上一步中创建的 MR,然后等待流水线完成。
假秘密被添加到
main,这导致发现项变成漏洞。 -
在左侧边栏,选择 Secure > Vulnerability report。
-
选择漏洞的 Description 以查看:
- 关于秘密类型的详细信息。
- 修复指导。
- 关于漏洞检测时间和位置的信息。
-
选择 Edit vulnerability > Change status。
- 从 Status 下拉列表中选择 Dismiss as… Used in tests。
- 添加一条注释,解释你为什么向项目添加假秘密。
- 选择 Change status。
该漏洞不再出现在漏洞报告的首页上。
修复泄露
如果你将秘密添加到远程仓库,该秘密就不再安全,必须尽快撤销。即使秘密尚未合并到你的默认分支,你也应该撤销并替换它们。
你采取的具体修复步骤将取决于你组织的安全策略,但至少应该:
- 撤销秘密。当秘密被撤销后,它就不再有效,不能用于冒充合法活动。
- 从你的仓库中删除秘密。
具体的修复指导会写入 secret-detection 作业日志,并在漏洞报告详情页面上提供。