GitHub Actions库秘密没有正确传递到可重用的工作流



我有一个GitHub Actions存储库秘密,我可以使用它来验证进入GCP。当我在与密钥相同的存储库中的工作流中使用密钥时,这会像预期的那样工作。例如,以下工作流成功运行:

name: Auth to Google Cloud
on:
push:
branches: [ master ]
jobs:
build:
env:
SERVICE_ACCOUNT: 'some-account.iam.gserviceaccount.com'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- id: auth
name: Authenticate to Google Cloud
uses: google-github-actions/auth@v1
with:
service_account: $SERVICE_ACCOUNT
credentials_json:  ${{ secrets.GCP_SA_KEY }}

然而,当我试图通过文档中描述的可重用工作流来完成相同的工作时,可重用工作流中的auth步骤失败了:

Error: google-github-actions/auth failed with: retry function failed after 1 attempt: failed to parse service account key JSON credentials: unexpected token  in JSON at position 0

这是我的调用者工作流程:

name: Re-usable Demo
on:
push:
branches: [ master ]
workflow_dispatch:
jobs:
call-reusable-workflow:
uses: my-organization/reusable-workflows/.github/workflows/reusable-workflow.yml@master
with:
service-account: 'some-account.iam.gserviceaccount.com'
secrets:
gcp-sa-key: ${{ secrets.GCP_SA_KEY  }}

这是可重用的工作流本身(在不同的repo中):

name: Re-usable Workflow
on: 
workflow_call:
inputs:
service-account:
required: true
type: string
secrets:
gcp-sa-key:
required: true
jobs:
build:
env:
SERVICE_ACCOUNT:  ${{ inputs.service-account }}
GCP_SA_KEY:  ${{ secrets.gcp-sa-key }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- id: auth
name: Authenticate to Google Cloud
uses: google-github-actions/auth@v1
with:
service_account: $SERVICE_ACCOUNT
credentials_json: $GCP_SA_KEY

请注意,服务帐户已正确传递。我在可重复使用的工作流程中打印了它。只有秘密是行不通的。我该如何解决这个问题?

我已经尝试将它作为输入传递,以及直接使用它而不为它创建变量,两者都无济于事。

使用

env:
GCP_SA_KEY: ${{ secrets.gcp-sa-key }}
with:
credentials_json: $GCP_SA_KEY

然后GitHub Actions不为您扩展任何内容,但将文字字符串$GCP_SA_KEY分配给credentials_json输入。

1

现在,如果以后在shell脚本中使用,它可能会被展开,并暗示变量总是被展开——但我们只是不知道(也不应该依赖它)。可以使用在环境中访问该值的表达式:

env:
GCP_SA_KEY: ${{ secrets.gcp-sa-key }}
with:
credentials_json: ${{ env.GCP_SA_KEY }}

现在,动作运行器在动作看到值之前进行展开。

此时,即使先将其赋值给环境变量也没有价值(当然,除非操作依赖于环境中的特定值),因此可以简化为
with:
credentials_json: ${{ secrets.gcp-sa-key }}

1更准确地说,如果它有效,这实际上是一个信号,表明该操作容易受到shell注入的攻击。

相关内容

  • 没有找到相关文章

最新更新