如何使用 GitHub Actions 提取机密?

Sta*_*tan 37 ssh github-actions secretsmanager

我有一个相当基本的场景。为此,我制作了一个专用的 ssh 密钥并将其添加到我的存储库机密中。

  1. 代码被推送到 master

  2. GitHub 操作ssh通过执行将其上传到服务器echo "${{ secrets.SSH_KEY }}" > key

  3. 之后,我可以使用此密钥连接到我的服务器,例如 ssh -i key devops@myserver.com lsb_release -a

问题是由于某种原因,GitHub 操作无法将其写入文件,而是将字符***而不是实际的秘密值写入文件。因此显然我无法连接到我的服务器。

如何使用此密钥与 ssh 连接?有没有不使用文件就可以连接的方法?使用 GitHub 操作完成此常见场景的人能否解释一下?

bk2*_*204 56

GitHub Actions 应该能够以这种方式将机密写入文件。您看到星星的原因是日志被过滤了,所以如果要记录一个秘密,它会在日志中替换为三个星号。这是一种防止意外泄露机密的安全措施,因为日志通常是公开可用的。

但是,如果可能的话,无论如何都避免将机密写入日志是个好主意。你可以这样写你的命令,这样你就不会将秘密写入日志:

    - run: 'echo "$SSH_KEY" > key'
      shell: bash
      env:
        SSH_KEY: ${{secrets.SSH_KEY}}
Run Code Online (Sandbox Code Playgroud)

您将在日志中看到的只是echo "$SSH_KEY" > key,而不是秘密或任何星号。

请注意,这里确实需要引号,因为该>字符是 YAML 的特殊字符。

如果这无法登录您的服务器,则可能是另一个问题;在一般情况下,这种技术确实适用于编写秘密。

  • 我挣扎了一段时间,发现我缺少双引号。`回显“$SSH_KEY”`。转义多行字符很重要。 (6认同)
  • 我无法验证这一点。我将 `run` 更新为 `'echo "$SSH_KEY" > key && tail key'` 并且它仍然显示 `***`。操作运行程序如何知道文件仍应加密? (4认同)

Mor*_*oro 7

您可以secret通过使用 python shell 循环遍历 a 来解码 a,如下所示:

    - name: Set env as secret
      env:
        MY_VAL: ${{ secrets.SUPER_SECRET }}
      run: |
        import os
        data = open("file", "w")
        for q in (os.getenv("MY_VAL")):
          print(q)
          data.write(q)
      shell: python
Run Code Online (Sandbox Code Playgroud)

这会将每个字符打印到标准输出并将它们存储在名为file. stdout将有这样的输出,而文件中应该保存有秘密字符串。

s
e
c
r
e
t
Run Code Online (Sandbox Code Playgroud)

它每天在我的存储库上运行,以检查它是否仍在工作:此处


Dan*_*rov 6

我找到了一种方法来做到这一点。我们在一个项目中使用了 GatsbyJS,它依赖 .env.production 文件作为 env 变量。我试图将它们传递 env:给 github 操作,但这不起作用,它们被忽略了。

这是我所做的。我对 .env.production 文件进行了 base 64 编码:

base64 -i .env.production
Run Code Online (Sandbox Code Playgroud)

将输出添加到 github 操作中的 env 变量。然后在我的行动中,我这样做:

echo ${{ secrets.ENV_PRODUCTION_FILE }} | base64 -d > .env.production
Run Code Online (Sandbox Code Playgroud)

这样,我的 .env.production 文件的内容最终会被写入执行 github 操作的机器。


Sta*_*tan -1

好的解决方案是使用 gpg 加密密钥,将其添加到存储库并使用密码在服务器上解密。当然,passprase 应该存储为 github 项目机密。

更多信息我是如何做到的:https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets

  • 就像链接页面上提到的那样,这只是为了解决大型秘密的问题,并不能保护您免于暴露日志中的秘密。恕我直言,@bk2204 应该是可接受的答案。 (2认同)