简介
在上一个实验中,我们的机器人助手自动登录了仓库。但它从哪里获取的密码?
在实际的自动化场景中,工作流通常需要 API 密钥、密码或令牌等敏感数据。绝不能将这些值硬编码到仓库文件中。
GitHub 提供了 Secrets,用于保护工作流所使用的敏感值。这是 CI/CD 安全实践的核心内容,因为流水线通常需要特权访问权限。
这是自动化安全中最重要的边界之一。流水线需要凭据,但这些凭据应当在运行时从受保护的存储中注入,而不是提交到版本控制系统中。
在本实验中,你将:
- 在保险库中创建一个机密密码。
- 教机器人如何获取这个密码。
- 验证即使机器人尝试打印密码,GitHub 也会将其隐藏。
前置条件
我们将继续使用 github-actions-basics 仓库。
创建机密信息
假设我们的应用需要连接数据库。我们需要安全地存储数据库密码。
我们将创建一个名为 DB_PASSWORD 的机密信息。
- 在 GitHub 上打开你的
github-actions-basics仓库。 - 点击 Settings 选项卡。
- 在左侧边栏中找到 Secrets and variables 菜单项,并点击展开。
- 选择 Actions。
- 点击绿色的 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 页面。
- 点击名为「Security Test」的工作流运行记录。
- 点击
test-secret作业。 - 展开「Try to print secret」步骤。
查看输出。你应该会看到类似以下内容:
The password is ***

GitHub Actions 会自动识别 $MY_PASSWORD 的值来自机密信息。在将内容打印到日志之前,它会扫描该敏感值,并将其替换为 ***。
脱敏可以减少日志意外泄露造成的损害,但最佳实践仍然是完全不要打印机密信息。安全功能是安全网,不能成为粗心处理机密信息的借口。
这项「Masking」功能可以保护你。即使你意外尝试打印机密信息,或者使用的工具输出过于详细,GitHub 也会捕获并从日志中清除敏感数据。
关于 GITHUB_TOKEN 的说明:还记得上一个实验中使用的 ${{ secrets.GITHUB_TOKEN }} 吗?它的工作方式完全相同。这是 GitHub 为每次运行自动创建的机密信息,其值也会在日志中被隐藏。
总结
在本实验中,你学习了自动化安全的基础知识。
- 保险库:使用 GitHub Secrets 存储密码等敏感数据。
- 访问:使用
${{ secrets.NAME }}让机器人通过密钥卡访问这些数据。 - 脱敏:验证 GitHub 会自动从日志中隐藏机密信息(
***),防止意外泄露。
现在你已经拥有了一条安全的自动化流水线。在最后一个实验中,我们将学习 DevOps 的最终目标:持续部署。你将学习如何让机器人把代码部署到运行中的服务器上!



