【问题标题】:Why The Action Cannot Access Secrets?为什么 Action 无法访问 Secret?
【发布时间】:2020-08-02 03:10:55
【问题描述】:

我正在尝试创建一个工作流,以使用 Github Actions 将 Nuget 包部署到 Github 包存储库。

在这种情况下,

  • 存储库位于组织内部
  • 我是该组织的所有者
  • 我拥有存储库的管理员权限
  • 存储库列出了机密
  • 提交是我的
  • 提交是对分支的直接提交

但该操作无法访问机密

以下是我正在尝试执行的工作流程

name: Build and Publish
on:
push:
  branches:
    - gh-packages
jobs:
build_and_publish:
env:
  ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}
name: Publish Packages to NuGet
runs-on: ubuntu-latest
steps:
  - uses: actions/checkout@v2
  - uses: actions/setup-dotnet@v1
    with:
      dotnet-version: "3.0.100"
  - name: Dump Github Context
    env:
      CONTEXT: ${{ toJson(github) }}
      SECRETS: ${{ toJson(secrets) }}
      TOK: ${{ secrets.ACCESS_TOKEN }}
      TEST: ${{ secrets.TEST }
    run: |
      echo $ACCESS_TOKEN
      echo $TOK
      echo $TEST
      echo $GITHUB_TOKEN
      echo "$SECRETS"
      echo "$CONTEXT"
  - name: Setup Config
    run: sed "s/ACCESS_TOKEN/$ACCESS_TOKEN/g" .nuget.config > nuget.config
  - run: cat nuget.config
  - name: Build
    run: dotnet build -c Release
  - name: Publish
    run: chmod +x ./push.sh && ./push.sh

GITHUB_TOKEN 和 ACCESS_TOKEN 之类的自定义机密都不起作用。

加法01:

即使将环境变量名称设置为 GITHUB_TOKEN 也无法正常工作

name: Build and Publish
env:
   GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
...

【问题讨论】:

  • 任何秘密值(以及秘密值的某些编码,例如 Base64)都会从输出中清除,并在日志中替换为星号,这是最佳安全实践。无论您如何呈现它们都是如此:如果日志文本与秘密匹配,则将其清除。您的脚本和工作流程仍然可以访问它们,但无法查看它们。
  • 这是一个非常酷的功能,在文档中不是很清楚,但绝对是 Github 团队的一个很好的安全措施。我想你可以在每个字符后用空格打印秘密......再次更新我的答案

标签: github github-actions building-github-actions


【解决方案1】:

更新

是的,这是可能的,但这是一种非常糟糕的做法。如果必须的话可以使用下面的命令,它规避了 Github 防止机密泄露日志的安全措施

run: echo MYSECRET | sed -e 's/\(.\)/\1 /g'
# this will print "M Y S E C R E T"

只需将MYSECRET 替换为您要打印的秘密,例如$GITHUB_TOKEN.

旧答案

Checkout this other answer 这似乎是 Github 操作的预期行为。

如您所见,我可以获取(并使用)环境变量的值,但不会暴露秘密。

那是因为它们是秘密。 Actions 输出已明确清除机密信息,并且不会显示。

文件内容仍然包含秘密内容。

更新:

这是关于如何将秘密传递到行动步骤的常规惯例。

env: 
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

这就是我在行动中使用它的方式。

更新2

在此处查看有关如何打印您的秘密的详细说明,但强烈建议您不要这样做。

https://help.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets#limits-for-secrets

【讨论】:

  • 尝试通过设置环境变量来访问这些值也不起作用。请检查问题的最新更新。
  • 我也做过同样的事情。检查代码 sn -p
  • 尝试单独传递每个秘密,而不使用toJson 函数。也只需使用${{ secrets.GITHUB_TOKEN }} 无需将其重命名为顶部的 ACCESS_TOKEN。同样显然this question 表明,如果您不在命令中包含引号,您可能可以echo 每个秘密
  • 再次编辑我的答案,页面底部有官方方法(在我的答案底部的链接内)希望对您有所帮助
【解决方案2】:

出现这个问题是因为我的一个误解,我认为如果正确传递给操作,秘密值应该显示在日志中。

我将Ben Windingbk2204 的答案结合起来说清楚。

秘密值在操作日志中被清除。不要期望在操作日志中看到实际值。获取擦除后的文本意味着该值已传递给操作。您可以在脚本中使用该值,但在日志中看不到它们。查看Ben's Answer 了解如何查看这些值,但不建议这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 2014-04-06
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多