什么是机密?
在软件开发中,机密是用于对系统、服务、数据和 API 进行身份验证或授权访问的敏感信息。示例包括
- API 密钥 和 访问令牌,可让您与外部服务(例如 GitHub 的 REST API)交互。访问令牌还允许诸如 GitHub Actions 等服务执行需要身份验证的任务,我们将在后面进行实验。
- 数据库凭证,可授予对本地和外部数据库及存储的访问权限。
- 私钥,例如私有 SSH 和 PGP 密钥,可用于访问其他服务器和加密数据。
由于机密提供了大量访问权限,包括对关键系统的访问,我们可以理解为何保持 机密安全 如此重要。
机密泄露可能会导致什么?
- 攻击者可以获得对机密所允许访问的所有资源的 未授权访问。
- 黑客可以 窃取数据,包括敏感的用户数据。这可能导致隐私和法律风险,并损害对您和您应用的信任。
- 如果黑客在您的云服务提供商账户上运行未授权的工作负载,泄露的机密会 让您付出金钱代价。
- 黑客可以利用泄露的机密删除、修改和破坏服务器,从而导致 停机和数据丢失。
考虑机密授予的所有访问权限和能力,以及黑客可能的行为。例如,如果您的 GitHub 账户的个人访问令牌泄露,黑客就可以以您的身份在 GitHub 上发布和进行更改。
管理机密的最佳实践
为避免此类问题,请遵循最佳实践,防止泄漏并在机密泄露时将损失降至最低。
遵循 最小特权原则(PoLP)
在可能的情况下,仅限制机密的行为和可访问范围到必要的最小程度。例如
- 如果机密仅用于读取数据而不修改数据,请将其设为 只读。
- 如果您使用的 API 允许将机密限制在特定作用域或权限内,请仅选择 您实际需要的权限。例如,如果您只需要使用 GitHub 机密创建议题,就没有理由让机密访问仓库内容或其他任何内容。
- 如果机密会让攻击者获得其拥有者用户账户的全部权限,考虑创建服务账户来拥有该机密。
在应用程序中保护机密
- 永不将机密硬编码。始终使用 环境变量 或您平台的机密管理工具(例如 GitHub 的仓库机密)。
- 如果必须与他人共享机密,请使用专用工具,例如 密码管理器。切勿通过电子邮件或即时消息发送机密。
- 如果可能,请设置 过期日期 并定期 轮转机密;这可以降低旧机密被利用的风险。
- 如果您的应用产生日志,请确保 在写入日志前对机密进行脱敏处理。否则,活跃的机密可能会被保存为明文文件。
机密泄露时限制损失
- 即使仅泄露了一瞬,也应视机密已遭泄露,并 立即吊销该机密。随后生成新机密并安全保存。
- 检查任何可能显示使用受损机密进行的可疑活动的 活动日志。
- 思考机密是如何泄露的,并对流程进行更改,以防止此类情况再次发生。
GitHub 如何帮助保护您的机密安全
您可以采取许多措施来保障机密安全,GitHub 同样提供了大量功能帮助您保护机密。每个人都会犯错,我们提供的功能可以捕获您意外泄露的机密。
- 推送保护(我们稍后会进行实验)会阻止将机密推送到 GitHub 上的仓库。
- 机密扫描会扫描仓库并在发现机密时创建警报。对于某些机密,我们还会通知提供方,以便他们自动吊销该机密等。
练习安全存储机密
在本练习中,我们将创建一个个人访问令牌并安全存储,以便在 GitHub Actions 中使用。我们创建的 Action 是一个响应议题的简易工作流。
1. 创建练习仓库
我们先创建一个用于练习的仓库。new2code 账号提供了一个模板仓库,可帮助我们快速开始。
- 前往 新建仓库页面。点击此链接后,
new2code账号的模板会被预先选中。 - 在 “Owner” 下,确保选择了您的用户账户。
- 在 “Repository name” 字段中,输入
secret-action。 - 在描述字段下方,选择 Public 以设置仓库可见性。
- 点击 创建仓库。
2. 提交虚假令牌
每个人都会犯错,您在编码过程中也可能不小心提交机密。在本练习中,我们将故意提交一个 虚假令牌,以便熟悉并适应触发的警报。
-
前往您刚创建的仓库。
-
点击文件列表中的
.github/workflows,进入 YAML 工作流文件所在目录。 -
在文件列表中点击
comment.yml打开工作流文件。 -
要编辑工作流文件,请在右上角点击.
-
在第 13 行的
GH_TOKEN: ""中,将引号之间的内容替换为此虚假令牌。secret_scanning_ab85fc6f8d7638cf1c11da812da308d43_abcde最终效果应如下所示
GH_TOKEN: "secret_scanning_ab85fc6f8d7638cf1c11da812da308d43_abcde" -
尝试提交更改时,在右上角点击 Commit changes...,随后在弹窗中再次点击 Commit changes。
-
此时您应看到推送保护警报,提示 “Secret scanning 在第 13 行发现了 GitHub Secret Scanning 机密”。

如果我们没有使用虚假令牌,这个警报会提醒我们距离泄露真实令牌仅一步之遥。请查看警报中可供选择的选项。
-
若要停止提交并避免泄露机密,请点击 Cancel。在右上角点击 Cancel changes,随后根据提示放弃未保存的更改。
3. 创建真实令牌
现在,让我们按照最佳实践来操作。首先,创建一个个人访问令牌,使 Action 能以您的身份执行操作(它创建的评论将显示为来自您的用户账户)。
注意
请注意我们在每一步配置中均遵循最小特权原则。您的令牌将拥有最短的必要有效期,仅能访问所需的仓库,并且仅具备运行所需的最小权限。
- 前往 新建个人访问令牌页面。
- 在 “Token name” 中为新令牌命名,例如 “Action token”。
- 在 “Expiration” 中选择 “7 days”。
- 在 “Repository access” 中选择 Only select repositories。
- 在 “Select repositories” 下拉框中,仅勾选您之前创建的练习仓库。
- 在 “Permissions” 部分的 “Repository permissions” 右侧,点击以查看所有可用权限。
- 向下滚动到 “Issues”,在右侧的下拉框中选择 “Read and write”。
- 页面底部点击 Generate token。如弹出确认框,请再次点击 Generate token。
从此刻起安全地处理生成的令牌至关重要。我们稍后会使用该令牌,您可以暂时将其复制到剪贴板。
4. 安全存储令牌
现在我们可以安全地将新令牌存储到仓库中。
-
前往练习开始时创建的仓库。
-
在仓库名称下,点击 设置。如果未看到 “Settings” 选项卡,请选择 下拉菜单,然后点击 Settings。

-
在侧边栏的 “Security” 部分,选择 机密和变量,随后点击 Actions。
-
在 “Repository secrets” 下,点击 New repository secret。
-
在 Name 字段中输入机密名称。此练习我们使用
MY_TOKEN。 -
在 Secret 字段中粘贴之前生成的个人访问令牌。
-
点击 添加密钥。
您的机密现已安全加密,可随时使用!
5. 在我们的 Action 中引用令牌
现在我们可以更新 YAML 工作流文件,使用该令牌并测试其是否工作。
-
返回您的仓库。如果当前位于仓库设置页面,可点击仓库名称下的 Code。
-
点击文件列表中的
.github/workflows,进入 YAML 工作流文件所在目录。 -
在文件列表中点击
comment.yml打开工作流文件。 -
要开始编辑工作流文件,请在右上角点击.
-
在第 13 行
GH_TOKEN: ""中,将空引号替换为${{ secrets.MY_TOKEN }},以引用我们之前添加的仓库机密。GH_TOKEN: ${{ secrets.MY_TOKEN }} -
要提交更改,请在右上角点击 Commit changes...
-
在 “Commit changes” 对话框中,编辑 “Commit message”,描述此次更改。例如,可输入 “Updating workflow to use repository secret”。
-
确保已选中 “Commit directly to the
mainbranch”。 -
点击 Commit changes。
6. 测试令牌和工作流
我们现在已经准备就绪!接下来测试工作流。
-
在仓库名称下,点击 议题。

-
点击 New issue。
-
在 “Add a title” 中,输入任意标题。
-
在 “Add a description” 文本框中,输入
Hello。 -
在文本框下方,点击 Create。
工作流完成后,您应看到新评论出现。该评论由您本人撰写(因为使用了您的令牌),并返回一条问候语。
后续步骤
若想更深入了解机密扫描和推送保护,可完成 GitHub Skills 中的 机密扫描简介 课程。
代码安全的另一重要方面是学习如何在项目中识别并修补代码漏洞。参见 发现并修复您的第一个代码漏洞。