【问题标题】:GitHub Actions - empty env secretsGitHub Actions - 空环境机密
【发布时间】:2020-03-03 09:18:31
【问题描述】:

我已经开始使用 GitHub 操作,但在访问我作为 env 传递的存储库秘密方面遇到了困难。

我的工作流程文件:

name: Invite

on: 
  pull_request:
    branches: [master]
    types: [closed]
jobs:
  invite:
    runs-on: ubuntu-latest
    steps:
      - name: Hello world action
        uses: lekterable/inclusive-organization-action@master
        env:
          SECRET_TOKEN: ${{ secrets.SECRET_TOKEN }}
          organization: string
          SUPER_SECRET: ${{ secrets.SUPER_SECRET }}

动作索引文件

const core = require('@actions/core')
const github = require('@actions/github')

const run = async () => {
  try {
    ...
    console.log('env', process.env)
    const token = process.env.SECRET_TOKEN
    const secret = process.env.SUPER_SECRET
    const organization = process.env.organization
    console.log('organization', organization)
    console.log('token?', !!token)
    console.log('secret?', !!secret)
    console.log('token length', token.length)
    ...
  } catch (error) {
    core.setFailed(error.message)
  }
}

run()

如您所见,我传递了 3 个 env,值为 'string' 的组织按预期存在,但 SECRET_TOKEN 和 SUPER_SECRET 为空。

是的,我确实在运行该操作的存储库中设置了秘密:

是不是我做错了什么?

【问题讨论】:

  • 这就是如何在 bash 中使用它们,我使用的是 nodejs
  • 他们谈论的是分叉定义工作流的存储库,而不是分叉操作的存储库。在我的情况下,它将是'github-actions-test-repo',所以如果有人分叉它,他将无法访问这些秘密,这显然是有道理的,但我没有在分叉上工作,因为它是我的存储库。感谢您的尝试,谢谢;)
  • 您是否重新运行npm run build 来更新您的更改?到./dist/index.js,我基本上设置相同并且没有问题,github.com/lcherone/gh-actions/commit/… 秘密环境变量(process.env.foo)不会显示它的值,但它有 10 个字符长。我现在在想你只是在 ./dist 中有旧代码。
  • 您在提到分叉回购时实际上是对的,我只是理解他们的意思是当您在分叉回购中打开拉取请求时,动作不会得到秘密,但实际上当您打开 PR从分叉的 repo 到主要的 repo,action 仍然无法访问它们,感谢您的帮助:)

标签: javascript node.js github github-actions


【解决方案1】:

更新

虽然下面的原始答案仍然适用于 public 存储库,但有几个 new updates 可能对某些用例有所帮助。

  • 如果您的存储库是私有的,您现在可以从 forks 中 enable workflows

  • 如果您的存储库是公开的,则有一个不受任何令牌限制的新 pull_request_target 事件。

原答案

您遇到此行为的原因是 Invite 工作流是由来自分叉存储库的拉取请求触发的。

除了 GITHUB_TOKEN 之外,当从分叉存储库触发工作流时,机密不会传递给运行器。

发生这种情况时,工作流的actor 是打开拉取请求的用户。如果该用户对您的存储库没有写入权限,则他们无法使用机密(GITHUB_TOKEN 除外)。

对存储库具有写入权限的任何人都可以创建、读取和使用机密。

参考:https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets#using-encrypted-secrets-in-a-workflow

如果您在工作流程中运行此步骤,您会发现它与您的操作无关。 TEST_SECRET 密码在工作流中也将不可用。

      - name: Test
        env:
          TEST_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          TEST_SECRET: ${{ secrets.TEST_SECRET }}
        run: |
          echo ${#TEST_GITHUB_TOKEN}
          echo ${#TEST_SECRET}

检查 GitHub 上下文中的事件数据,您会看到 actor 是派生存储库并打开拉取请求的用户。

      - name: Dump GitHub context
        env:
          GITHUB_CONTEXT: ${{ toJson(github) }}
        run: echo "$GITHUB_CONTEXT"

This is a different but related issue 由 GitHub 工作人员回答,其中解释说对分叉存储库的这些限制是为了“防止恶意行为者使用操作来毒害上游或下游存储库。”

【讨论】:

  • 是的,你是对的,我只是认为在谈论分叉回购时,他们谈论的是在分叉回购中触发的工作流,我没想到由 PR 触发的操作合并到主存储库也是如此。你能想出一种方法吗?我的意思是我真的需要在由合并到主存储库的 PR 触发的操作中才能访问秘密
  • 我遇到了同样的问题,但用例略有不同。我尝试了几种方法来解决它,但不幸的是没有找到任何有效的方法。即使我找到了解决方法,我想 GitHub 也会找到关闭它的方法。这基本上是一个特权升级安全问题。使用机密的唯一方法是让具有写入权限的用户触发事件。
  • 你能想到任何其他可能发生这种情况的情况吗?我正在开发自己的存储库,但我遇到了这个确切的问题
【解决方案2】:

我找到了一个解决方案,解决它的方法不是在关闭 PR 时运行操作,而是在 master 上的新提交上运行它,这必须由具有“写权限”的人触发' 到 repo,因此,它可以访问 repo 机密。

检查提交是否是合并提交有点困难,我们必须显式获取有关 PR 的更多信息,但它有效。如果有人感兴趣,我正在尝试构建的操作的源代码:https://github.com/lekterable/inclusive-organization-action

【讨论】:

    【解决方案3】:

    我已实施https://stackoverflow.com/a/61450807/177275 中记录的解决方法来解决这些类型的问题。本质上,在 PR 上运行的操作会创建一些工件,然后每 5 分钟运行一次的 cron 作业会扫描这些工件并对其进行操作。我使用它将构建结果作为 cmets 发布到拉取请求页面,但您可以将相同的方法应用于其他用例。

    【讨论】:

      猜你喜欢
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 2021-01-20
      • 2020-04-16
      • 2021-04-29
      • 2022-10-23
      • 2022-11-20
      相关资源
      最近更新 更多