GitHub Actions是GitHub内置的持续集成和持续交付(CI/CD)平台,使开发团队能够实现工作流程的自动化,包括构建、测试和部署管道。
使用GitHub Actions的一个缺点是,你的日志是公开的,任何人都可以通过必要的权限访问它们。
为了防止敏感数据暴露在GitHub Actions的日志中,你应该使用加密的环境变量来安全存储敏感数据。这些加密的环境变量被称为GitHub Actions Secrets。
本文告诉你如何使用GitHub Actions Secrets来防止敏感信息出现在GitHub Actions日志中。
先决条件
要学习本教程:
如何保持GitHub操作日志的安全性
当你使用GitHub Actions构建工作流程时,任何访问你仓库的人都可以查看日志,所以它们不应该包括敏感信息。然而,你不能就这样删除你的令牌、密码和其他敏感信息–你需要它们来进行测试和让你的应用程序正常运行。
解决方案是用 ::add-mask::
工作流命令来隐藏它们,该命令将星号(*)放在它所应用的敏感数据的位置上。
下面的部分向你展示了如何屏蔽日志。
如何屏蔽日志
首先,在你的文本编辑器中打开克隆的版本库。
在版本库的根部创建.github/workflows/目录,以存储你的工作流文件。然后,在.github/workflows目录中创建一个名为hide-secrets.yml的新文件,并在其中添加以下代码:
name: Hide Sensitive Information on: push jobs: print-secret-token: runs-on: ubuntu-latest steps: - name: echo a secret run: echo "your secret token is verySecretToken"
提交修改并推送到你的GitHub仓库。更新后的GitHub操作工作流程是激活的,每当你推送一个新的改动时,就会触发。
在GitHub上打开你的仓库,选择Actions标签来查看日志。你的工作流程应该显示如下:
预览你的工作流程
检查工作流程的日志,你会发现打印在日志上的 verySecretToken
字符串。点击你的工作流程,然后点击任务名称(print-secret-token)来查看日志。它应该看起来像这样:
检查你的GitHub动作日志
要隐藏它,使用 ::add-mask::
命令,编辑hide-secrets.yml文件,并在 print-secret-token
工作中添加一个新步骤:
name: Hide Sensitive Information on: push jobs: print-secret-token: runs-on: ubuntu-latest steps: - name: Add Mask run: echo "::add-mask::verySecretToken" - name: echo a secret run: echo "your secret token is verySecretToken"
你应该在顶部添加 Add Mask
的步骤,因为掩码只在 ::add-mask::
运行后适用。如果你把Secret的 verySecretToken
放在 Add Mask
步骤之前,它仍然会出现未被掩码。因此,为了确保该值被屏蔽,必须尽快使用 ::add-mask::
。
一旦你提交并发布你的修改到你的GitHub仓库,字符串 verySecretToken
将被星号(*)取代,无论它出现在你的日志中:
制作普通文本
虽然这解决了屏蔽的问题,但却引入了一个新的问题。你的 verySecretToken
仍然在工作流文件中,所以任何能够访问源代码的人都可以看到它。
屏蔽纯文本的另一个缺点是,只屏蔽一个词的一部分会隐藏它的所有实例。例如,以下面的句子为例: “Programming is great, but my most productive days are those when I do not write a program”。如果你屏蔽了 “program” 这个词,它不仅会屏蔽句子末尾的这个词,还会屏蔽它出现的任何地方,比如 “programming” 中。
如果你试图屏蔽纯文本,你会得到这样的结果:
屏蔽纯文本的问题
在GitHub动作日志中隐藏敏感数据的更好方法是使用GitHub Actions Secrets,如下节所示。
如何使用GitHub Actions Secrets
你可以使用GitHub Actions Secrets来存储任何你想在GitHub操作工作流程中使用的私人数据。Secret是在仓库或组织层面以键/值对的形式创建的。
仓库只能访问在仓库级别创建的Secret,而在组织级别创建的Secret则由组织内的所有仓库共享。
在存储库级别创建的Secret可供任何有合作者角色权限的人在操作中使用。你可以在任何时候改变你的Secret的值。然而,Secret不能被用于分支版本库的工作流。
以下准则适用于命名Secret:
- Secret名称不能包含空格。
- Secret名称不区分大小写。
- Secret名称不能以数字开头。
- Secret名称不能以前缀
GITHUB_
开头。 - Secret名称必须是唯一的 – 具有相同名称的秘密不能存在于同一级别。
你可以在GitHub操作的工作流程中使用这些Secret,只需在Secret名称前添加 secrets
作为YML变量,如下所示:
${{ secrets.MY_SECRET_TOKEN }}
你也可以掩盖Secret,以获得更多的安全性,如下所示。
如何屏蔽secret
首先,创建一个GitHub secret。在你的 GitHub 仓库中,点击设置标签,从左边的侧边栏中选择Secrets > Actions,然后点击New repository secret来添加一个新的secret:
创建一个新的版本库secret
给你的secret一个名字和一个secret值,然后点击Add secret:
添加一个新的GitHub Secret
现在你已经创建了你的secret,并给了它 verySecretToken
值,你可以在你的工作流文件中使用它。打开你的 hide-secrets.yml 文件,做如下修改:
name: Hide Sensitive Information on: push jobs: print-secret-token: runs-on: ubuntu-latest steps: - name: Add Mask run: echo "::add-mask::${{ secrets.MY_SECRET_TOKEN }}" - name: Echo a secret run: echo "your secret token is ${{ secrets.MY_SECRET_TOKEN }}"
这与之前的代码唯一的区别是,你用新创建的GitHub secret ” ${{secrets.MY_SECRET_TOKEN }}
” 替换了Secret令牌。
一旦你提交了代码并将修改推送到你的GitHub仓库,你的Secret就被屏蔽了:
屏蔽的GitHub操作私钥
小结
你不能在你的GitHub操作日志中泄露任何敏感信息。纯文本屏蔽是隐藏数据的一种方式,但任何访问工作流文件的人都可以看到你试图隐藏的信息。
正如本教程所展示的,GitHub Actions Secret是一种更安全的方法,可以保护你的敏感数据,然后将其屏蔽。
评论留言