跳至主要内容

安全存储您的机密

了解软件开发中的机密以及如何安全地管理它们。

什么是机密?

在软件开发中,机密是用于对系统、服务、数据和 API 进行身份验证或授权访问的敏感信息。示例包括

  • API 密钥访问令牌,可让您与外部服务(例如 GitHub 的 REST API)交互。访问令牌还允许诸如 GitHub Actions 等服务执行需要身份验证的任务,我们将在后面进行实验。
  • 数据库凭证,可授予对本地和外部数据库及存储的访问权限。
  • 私钥,例如私有 SSH 和 PGP 密钥,可用于访问其他服务器和加密数据。

由于机密提供了大量访问权限,包括对关键系统的访问,我们可以理解为何保持 机密安全 如此重要。

机密泄露可能会导致什么?

  • 攻击者可以获得对机密所允许访问的所有资源的 未授权访问
  • 黑客可以 窃取数据,包括敏感的用户数据。这可能导致隐私和法律风险,并损害对您和您应用的信任。
  • 如果黑客在您的云服务提供商账户上运行未授权的工作负载,泄露的机密会 让您付出金钱代价
  • 黑客可以利用泄露的机密删除、修改和破坏服务器,从而导致 停机和数据丢失

考虑机密授予的所有访问权限和能力,以及黑客可能的行为。例如,如果您的 GitHub 账户的个人访问令牌泄露,黑客就可以以您的身份在 GitHub 上发布和进行更改。

管理机密的最佳实践

为避免此类问题,请遵循最佳实践,防止泄漏并在机密泄露时将损失降至最低。

遵循 最小特权原则(PoLP)

在可能的情况下,仅限制机密的行为和可访问范围到必要的最小程度。例如

  • 如果机密仅用于读取数据而不修改数据,请将其设为 只读
  • 如果您使用的 API 允许将机密限制在特定作用域或权限内,请仅选择 您实际需要的权限。例如,如果您只需要使用 GitHub 机密创建议题,就没有理由让机密访问仓库内容或其他任何内容。
  • 如果机密会让攻击者获得其拥有者用户账户的全部权限,考虑创建服务账户来拥有该机密。

在应用程序中保护机密

  • 永不将机密硬编码。始终使用 环境变量 或您平台的机密管理工具(例如 GitHub 的仓库机密)。
  • 如果必须与他人共享机密,请使用专用工具,例如 密码管理器。切勿通过电子邮件或即时消息发送机密。
  • 如果可能,请设置 过期日期 并定期 轮转机密;这可以降低旧机密被利用的风险。
  • 如果您的应用产生日志,请确保 在写入日志前对机密进行脱敏处理。否则,活跃的机密可能会被保存为明文文件。

机密泄露时限制损失

  • 即使仅泄露了一瞬,也应视机密已遭泄露,并 立即吊销该机密。随后生成新机密并安全保存。
  • 检查任何可能显示使用受损机密进行的可疑活动的 活动日志
  • 思考机密是如何泄露的,并对流程进行更改,以防止此类情况再次发生。

GitHub 如何帮助保护您的机密安全

您可以采取许多措施来保障机密安全,GitHub 同样提供了大量功能帮助您保护机密。每个人都会犯错,我们提供的功能可以捕获您意外泄露的机密。

  • 推送保护(我们稍后会进行实验)会阻止将机密推送到 GitHub 上的仓库。
  • 机密扫描会扫描仓库并在发现机密时创建警报。对于某些机密,我们还会通知提供方,以便他们自动吊销该机密等。

练习安全存储机密

在本练习中,我们将创建一个个人访问令牌并安全存储,以便在 GitHub Actions 中使用。我们创建的 Action 是一个响应议题的简易工作流。

1. 创建练习仓库

我们先创建一个用于练习的仓库。new2code 账号提供了一个模板仓库,可帮助我们快速开始。

  1. 前往 新建仓库页面。点击此链接后,new2code 账号的模板会被预先选中。
  2. 在 “Owner” 下,确保选择了您的用户账户。
  3. 在 “Repository name” 字段中,输入 secret-action
  4. 在描述字段下方,选择 Public 以设置仓库可见性。
  5. 点击 创建仓库

2. 提交虚假令牌

每个人都会犯错,您在编码过程中也可能不小心提交机密。在本练习中,我们将故意提交一个 虚假令牌,以便熟悉并适应触发的警报。

  1. 前往您刚创建的仓库。

  2. 点击文件列表中的 .github/workflows,进入 YAML 工作流文件所在目录。

  3. 在文件列表中点击 comment.yml 打开工作流文件。

  4. 要编辑工作流文件,请在右上角点击.

  5. 在第 13 行的 GH_TOKEN: "" 中,将引号之间的内容替换为此虚假令牌。

    secret_scanning_ab85fc6f8d7638cf1c11da812da308d43_abcde
    

    最终效果应如下所示

    GH_TOKEN: "secret_scanning_ab85fc6f8d7638cf1c11da812da308d43_abcde"
    
  6. 尝试提交更改时,在右上角点击 Commit changes...,随后在弹窗中再次点击 Commit changes

  7. 此时您应看到推送保护警报,提示 “Secret scanning 在第 13 行发现了 GitHub Secret Scanning 机密”。

    Screenshot of a push protection alert for Line 13 of the file we attempted to commit. The "Cancel" button is highlighted in an orange outline.

    如果我们没有使用虚假令牌,这个警报会提醒我们距离泄露真实令牌仅一步之遥。请查看警报中可供选择的选项。

  8. 若要停止提交并避免泄露机密,请点击 Cancel。在右上角点击 Cancel changes,随后根据提示放弃未保存的更改。

3. 创建真实令牌

现在,让我们按照最佳实践来操作。首先,创建一个个人访问令牌,使 Action 能以您的身份执行操作(它创建的评论将显示为来自您的用户账户)。

注意

请注意我们在每一步配置中均遵循最小特权原则。您的令牌将拥有最短的必要有效期,仅能访问所需的仓库,并且仅具备运行所需的最小权限。

  1. 前往 新建个人访问令牌页面
  2. 在 “Token name” 中为新令牌命名,例如 “Action token”。
  3. 在 “Expiration” 中选择 “7 days”。
  4. 在 “Repository access” 中选择 Only select repositories
  5. 在 “Select repositories” 下拉框中,仅勾选您之前创建的练习仓库。
  6. 在 “Permissions” 部分的 “Repository permissions” 右侧,点击以查看所有可用权限。
  7. 向下滚动到 “Issues”,在右侧的下拉框中选择 “Read and write”。
  8. 页面底部点击 Generate token。如弹出确认框,请再次点击 Generate token

从此刻起安全地处理生成的令牌至关重要。我们稍后会使用该令牌,您可以暂时将其复制到剪贴板。

4. 安全存储令牌

现在我们可以安全地将新令牌存储到仓库中。

  1. 前往练习开始时创建的仓库。

  2. 在仓库名称下,点击 设置。如果未看到 “Settings” 选项卡,请选择 下拉菜单,然后点击 Settings

    Screenshot of a repository header showing the tabs. The "Settings" tab is highlighted by a dark orange outline.

  3. 在侧边栏的 “Security” 部分,选择 机密和变量,随后点击 Actions

  4. 在 “Repository secrets” 下,点击 New repository secret

  5. Name 字段中输入机密名称。此练习我们使用 MY_TOKEN

  6. Secret 字段中粘贴之前生成的个人访问令牌。

  7. 点击 添加密钥

您的机密现已安全加密,可随时使用!

5. 在我们的 Action 中引用令牌

现在我们可以更新 YAML 工作流文件,使用该令牌并测试其是否工作。

  1. 返回您的仓库。如果当前位于仓库设置页面,可点击仓库名称下的 Code

  2. 点击文件列表中的 .github/workflows,进入 YAML 工作流文件所在目录。

  3. 在文件列表中点击 comment.yml 打开工作流文件。

  4. 要开始编辑工作流文件,请在右上角点击.

  5. 在第 13 行 GH_TOKEN: "" 中,将空引号替换为 ${{ secrets.MY_TOKEN }},以引用我们之前添加的仓库机密。

    GH_TOKEN: ${{ secrets.MY_TOKEN }}
    
  6. 要提交更改,请在右上角点击 Commit changes...

  7. 在 “Commit changes” 对话框中,编辑 “Commit message”,描述此次更改。例如,可输入 “Updating workflow to use repository secret”。

  8. 确保已选中 “Commit directly to the main branch”。

  9. 点击 Commit changes

6. 测试令牌和工作流

我们现在已经准备就绪!接下来测试工作流。

  1. 在仓库名称下,点击 议题

    Screenshot of the main page of a repository. In the horizontal navigation bar, a tab, labeled "Issues," is outlined in dark orange.

  2. 点击 New issue

  3. 在 “Add a title” 中,输入任意标题。

  4. 在 “Add a description” 文本框中,输入 Hello

  5. 在文本框下方,点击 Create

工作流完成后,您应看到新评论出现。该评论由您本人撰写(因为使用了您的令牌),并返回一条问候语。

后续步骤

若想更深入了解机密扫描和推送保护,可完成 GitHub Skills 中的 机密扫描简介 课程。

代码安全的另一重要方面是学习如何在项目中识别并修补代码漏洞。参见 发现并修复您的第一个代码漏洞

© . This site is unofficial and not affiliated with GitHub, Inc.