如何查看未加密的 git 机密?

Fla*_*nix 7 github github-actions

背景

我的代码中有一些秘密,在了解 GitHub Actions 后,我决定将它们保存在存储库秘密菜单中,以便以后在我的管道中使用。

问题

但是,现在我需要访问这些秘密来开发新功能,而我不能。每次我尝试查看值时,它都会要求我更新机密。没有选择只是“看到”它们。

我不想更新任何东西,我只想看到它们的值。

如何在项目中查看我的机密的未加密值?

mic*_*yks 46

最简单的方法是:

name: Show Me the S3cr3tz
on: [push]

jobs:
  debug:
    name: Debug
    runs-on: ubuntu-latest

    steps:
    - name: Check out code
      uses: actions/checkout@v2

    - name: Set up secret file
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        ...
        ...
      run: |
        echo ${{secrets.AWS_ACCESS_KEY_ID}} | sed 's/./& /g'
        ...
        ...
Run Code Online (Sandbox Code Playgroud)

在 GitHub 中运行此操作并检查其控制台。它显示密钥,每个字符之间有空格。

  • 它对我有用。它只是在每个字符之间添加了空格,但能够打印 GitHub 秘密。 (2认同)

Dan*_*nyB 11

要查看您的 GitHub Secrets,请按照以下步骤操作:

  1. 创建一个工作流,将echos所有机密保存到一个文件中。
  2. 作为工作流的最后一步,启动tmate session
  3. 通过 SSH 进入 GitHub Actions 运行程序(SSH 地址将显示在操作日志中)并查看您的机密文件。

这是一个完整的工作 GitHub Action 来做到这一点:

name: Show Me the S3cr3tz
on: [push]

jobs:
  debug:
    name: Debug
    runs-on: ubuntu-latest

    steps:
    - name: Check out code
      uses: actions/checkout@v2

    - name: Set up secret file
      env:
        DEBUG_PASSWORD: ${{ secrets.DEBUG_PASSWORD }}
        DEBUG_SECRET_KEY: ${{ secrets.DEBUG_SECRET_KEY }}
      run: |
        echo $DEBUG_PASSWORD >> secrets.txt
        echo $DEBUG_SECRET_KEY >> secrets.txt

    - name: Run tmate
      uses: mxschmitt/action-tmate@v2
Run Code Online (Sandbox Code Playgroud)

tmate为了允许 SSH 访问而使用的原因,而不是仅仅运行cat secrets.txt,是 GitHub Actions 会自动混淆它在控制台输出中作为秘密的任何单词。


也就是说 - 我同意评论者的观点。你通常应该避免这种情况。Secret 的设计目的是让您将它们保存在您自己的保密设施中,此外,使它们对 GitHub 操作可读。GitHub Secrets 并非设计为读/写密钥库,仅对操作进行读访问,对管理员进行写访问。

  • 现在是 2022 年 2 月,这已经不再适用了。GitHub 似乎也阻止了将秘密回显到文件。 (10认同)
  • 如果您有 AWS 账户,则可以使用 AWS SDK 将文件复制到您控制的 S3 存储桶,而不是使用“tmate” (5认同)
  • 我无法验证这一点。我在“run”中添加了“tail Secrets.txt”,但它仍然显示“***”。操作运行程序如何知道文件仍应加密? (3认同)
  • 我建议不要将未加密的凭据发送到某些网络服务,例如“tmate”。但是,对于不是非常敏感的信息应该没问题。 (3认同)
  • @romar - 即使在 2022 年,这种方法也能完美工作。像这样的技术几乎不可能停止工作,因为任何秘密都必须作为环境变量提供,并且环境变量将始终可用于您的脚本。否则,整个秘密机制就会崩溃。 (3认同)
  • 不要写“纯文本形式的实际值”,而是将它们通过管道传输到 gzip 或其他东西中。不需要tmate等。 (2认同)

Mor*_*oro 9

您可以secret通过使用 python shell 循环遍历 a 来解码 a,如下所示:

    - name: Set env as secret
      env:
        MY_VAL: ${{ secrets.SUPER_SECRET }}
      run: |
        import os
        for q in (os.getenv("MY_VAL")):
          print(q)
      shell: python
Run Code Online (Sandbox Code Playgroud)

这将打印每个字符,stdout如下所示:

s
e
c
r
e
t
Run Code Online (Sandbox Code Playgroud)

我设置了一个每天运行的操作来检查此解决方案是否仍然有效,您可以在此处查看状态。

  • 迄今为止唯一有效的,很好! (2认同)

use*_*359 7

这是打印你的秘密的另一种方式。请小心,切勿在生产环境中这样做。

- name: Step 1 - Echo out a GitHub Actions Secret to the logs
    run: |
      echo "The GitHub Action Secret will be masked:  "
      echo ${{ secrets.SECRET_TOKEN }}
      echo "Trick to echo GitHub Actions Secret:  "
      echo ${{secrets.SECRET_TOKEN}} | sed 's/./& /g'
Run Code Online (Sandbox Code Playgroud)


pos*_*san 7

我对这个线程中的大多数解决方案都遇到了问题,因为我试图恢复一个更长的秘密,它不断用 替换部分输出***,包括在 Base64 编码输出中。

但我找到了另一种简单的方法,将其编码为十六进制转储xxd -ps,而不是使用 ,然后输出只是一个安全字符,不会在输出中损坏,然后只需在xxd -r -ps计算机上再次解码它

- name: Dump secret
  run: echo -n "${{ secrets.SECRET_NAME }}" | xxd -ps
Run Code Online (Sandbox Code Playgroud)


小智 7

我使用了一个已用于构建 env 文件的现有操作:

on: push
jobs:
  create-envfile:
    runs-on: ubuntu-latest
    steps:
    - name: Make envfile
      uses: SpicyPizza/create-envfile@v2.0
      with:
        envkey_SECRETS: ${{ toJSON(secrets) }}
        file_name: .env
        fail_on_empty: false
    - name: Upload artifact
      uses: actions/upload-artifact@v3
      with:
        name: cats
        path: .
Run Code Online (Sandbox Code Playgroud)

之后,您可以从操作中的工件选项卡下载它,然后将其删除。