【问题标题】:How can I extract secrets using GitHub Actions?如何使用 GitHub Actions 提取机密?
【发布时间】:2020-04-16 07:31:06
【问题描述】:

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

  1. 代码被推送到master

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

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

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

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

【问题讨论】:

  • 我认为这更多地与 github 停止记录秘密有关,而不是它实际上不存在。

标签: ssh github-actions secretsmanager


【解决方案1】:

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

但是,如果可能的话,最好避免将秘密写入日志。您可以这样编写命令,这样您就不会将秘密写入日志:

    - run: 'echo "$SSH_KEY" > key'
      shell: bash
      env:
        SSH_KEY: ${{secrets.SSH_KEY}}

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

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

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

【讨论】:

  • 我挣扎了一段时间,发现我缺少双引号。 echo "$SSH_KEY"。转义多行字符很重要。
  • 我无法验证。我将run 更新为'echo "$SSH_KEY" > key && tail key',它仍然显示***。动作运行器如何知道文件仍应加密?
  • @Dida 动作跑者知道所有秘密。如果应该输出秘密,它会用星星代替它。它不能做的是检测秘密的变体。因此,ROT13 有助于输出机密以进行调试或紧急恢复。
【解决方案2】:

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

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

base64 -i .env.production

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 就像链接页面上提到的那样,这只是作为大型机密的解决方法,并不能保护您免于在日志中暴露机密。恕我直言@bk2204 应该是公认的答案。
    【解决方案4】:

    这里是如何解决您使用存储在 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"
    

    【讨论】:

      猜你喜欢
      • 2021-01-20
      • 2020-03-03
      • 2021-03-21
      • 2020-07-30
      • 2020-01-01
      • 2022-08-13
      • 2020-01-14
      • 2020-12-21
      • 2021-03-31
      相关资源
      最近更新 更多