Github操作-如何将秘密保存到文件

时间:2019-12-25 21:21:35

标签: ssh github-actions

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

  1. 代码被推送到master

  2. GitHub动作通过ssh使用echo "${{ secrets.SSH_KEY }}" > key将其上传到服务器。

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

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

如何使用此密码与ssh连接?有没有不用文件就可以连接的方法吗?可以使用GitHub动作完成此常见场景的人可以阐明一些观点吗?

4 个答案:

答案 0 :(得分:4)

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

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

base64 -i .env.production

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

echo ${{ secrets.ENV_PRODUCTION_FILE }} | base64 -d > .env.production

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

答案 1 :(得分:1)

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

但是,最好尽可能避免将机密写入日志。您可以像这样编写命令,以免将秘密信息写入日志:

Humidity.objects.latest('id')

您在日志中只会看到 - run: 'echo "$SSH_KEY" > key' shell: bash env: SSH_KEY: ${{secrets.SSH_KEY}} ,而不是机密或任何星号。

请注意,由于echo "$SSH_KEY" > key字符是YAML的特殊字符,因此您确实希望在这里加上引号。

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

答案 2 :(得分:0)

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

更多信息如何在这里完成:https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets

答案 3 :(得分:0)

以下是如何使用存储在 GitHub Actions 中的名为 GITHUB_ACTIONS_DEPLOY 的机密来解决安全登录 SSH 服务器的实际问题。

我们称之为“哔”声,因为它会在您登录的服务器上引起响铃。当有人将代码推送到您的存储库时,您可能会直接使用它来 ping 您家中的服务器。

      - name: Beep    
        # if: github.ref == 'refs/heads/XXXX' # Maybe limit only this step to some branches
        run: |
          eval $(ssh-agent)
          ssh-add - <<< "$SSH_KEY"
          echo "* ssh-rsa XXX" >> /tmp/known_hosts # Get from your local ~/.ssh/known_hosts or from ssh-keyscan
          ssh -o UserKnownHostsFile=/tmp/known_hosts user@example.com "echo '\a'"
        env:
          SSH_KEY: ${{ secrets.PMT_GITHUB_ACTIONS_DEPLOY }}

如果您实际上将 SSH 用作 rsync 推送任务的一部分,请按以下方法操作:

      - name: Publish    
        if: github.ref == 'refs/heads/XXX'
        run: |
          eval $(ssh-agent)
          ssh-add - <<< "$SSH_KEY"
          echo "* ssh-rsa XXX" >> /tmp/known_hosts
          rsync $FROM user@server:
        env:
          SSH_KEY: ${{ secrets.GITHUB_ACTIONS_DEPLOY }}
          RSYNC_RSH: "ssh -o UserKnownHostsFile=/tmp/known_hosts"