我有一个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
输入。
现在,如果以后在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注入的攻击。