机密信息与安全

网络安全Beginner
立即练习

简介

在上一个实验中,我们的机器人助手自动登录了仓库。但它从哪里获取的密码?

在实际的自动化场景中,工作流通常需要 API 密钥、密码或令牌等敏感数据。绝不能将这些值硬编码到仓库文件中。

GitHub 提供了 Secrets,用于保护工作流所使用的敏感值。这是 CI/CD 安全实践的核心内容,因为流水线通常需要特权访问权限。

这是自动化安全中最重要的边界之一。流水线需要凭据,但这些凭据应当在运行时从受保护的存储中注入,而不是提交到版本控制系统中。

在本实验中,你将:

  • 在保险库中创建一个机密密码。
  • 教机器人如何获取这个密码。
  • 验证即使机器人尝试打印密码,GitHub 也会将其隐藏。

前置条件

我们将继续使用 github-actions-basics 仓库。

创建机密信息

假设我们的应用需要连接数据库。我们需要安全地存储数据库密码。

我们将创建一个名为 DB_PASSWORD 的机密信息。

  1. 在 GitHub 上打开你的 github-actions-basics 仓库。
  2. 点击 Settings 选项卡。
  3. 在左侧边栏中找到 Secrets and variables 菜单项,并点击展开。
  4. 选择 Actions。
  5. 点击绿色的 New repository secret 按钮。

New repository secret

你将看到一个简单的表单:

  • Name:输入 DB_PASSWORD。(机密信息名称通常使用全大写字母。)
  • Secret:输入 SuperSafePassword123!。

点击 Add secret。

现在应该可以看到列出的 DB_PASSWORD。注意,你之后无法再看到它的值。机密信息保存后,就会被永久锁定。你可以更新或删除它,但你和其他任何人都无法再次查看它的值。

使用机密信息

密码已经存入保险库,现在编写一个工作流来使用它。

这里的关键模式是间接引用:工作流通过名称引用机密信息,GitHub 会在执行期间安全地解析其值。

在工作流文件中,你可以使用 ${{ secrets.YOUR_SECRET_NAME }} 语法访问任意机密信息。

进入项目目录。

cd ~/project
git clone https://github.com/your-username/github-actions-basics.git
cd github-actions-basics

注意:将 your-username 替换为你的实际 GitHub 用户名。

在 .github/workflows 文件夹中创建一个名为 security-test.yml 的新工作流文件。

touch .github/workflows/security-test.yml

使用 nano 打开它。

nano .github/workflows/security-test.yml

添加以下内容:

name: Security Test

on: [push]

jobs:
  test-secret:
    runs-on: ubuntu-latest
    steps:
      - name: Try to print secret
        env:
          MY_PASSWORD: ${{ secrets.DB_PASSWORD }}
        run: echo "The password is $MY_PASSWORD"

这里有一个值得注意的操作:我们将机密信息从 GitHub 保险库传入名为 MY_PASSWORD 的环境变量,然后使用 echo 尝试打印它。

等等!把密码打印到日志中不是非常糟糕的做法吗?确实如此!但我们这样做是为了演示 GitHub Actions 的一项强大安全功能。

保存文件并退出 nano。

验证脱敏效果

运行这个工作流,看看尝试泄露机密信息时会发生什么。

提交并推送你的更改。

git add .
git commit -m "Test secret masking"
git push

在 GitHub 上进入仓库的 Actions 页面。

  1. 点击名为「Security Test」的工作流运行记录。
  2. 点击 test-secret 作业。
  3. 展开「Try to print secret」步骤。

查看输出。你应该会看到类似以下内容:

The password is ***

Secret masked

GitHub Actions 会自动识别 $MY_PASSWORD 的值来自机密信息。在将内容打印到日志之前,它会扫描该敏感值,并将其替换为 ***。

脱敏可以减少日志意外泄露造成的损害,但最佳实践仍然是完全不要打印机密信息。安全功能是安全网,不能成为粗心处理机密信息的借口。

这项「Masking」功能可以保护你。即使你意外尝试打印机密信息,或者使用的工具输出过于详细,GitHub 也会捕获并从日志中清除敏感数据。

关于 GITHUB_TOKEN 的说明:还记得上一个实验中使用的 ${{ secrets.GITHUB_TOKEN }} 吗?它的工作方式完全相同。这是 GitHub 为每次运行自动创建的机密信息,其值也会在日志中被隐藏。

总结

在本实验中,你学习了自动化安全的基础知识。

  • 保险库:使用 GitHub Secrets 存储密码等敏感数据。
  • 访问:使用 ${{ secrets.NAME }} 让机器人通过密钥卡访问这些数据。
  • 脱敏:验证 GitHub 会自动从日志中隐藏机密信息(***),防止意外泄露。

现在你已经拥有了一条安全的自动化流水线。在最后一个实验中,我们将学习 DevOps 的最终目标:持续部署。你将学习如何让机器人把代码部署到运行中的服务器上!