我该如何查看未加密的git secrets?

63

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

然而,现在我需要访问这些秘密信息来开发新功能,但我无法访问。每次我尝试查看这些值时,都会要求我更新密码。没有选项可以仅“查看”它们。

我不想更新任何内容,只想查看它们的值。

如何在项目中查看我的秘密信息的未加密值?


我怀疑你不能,因为涉及到安全问题。 - jonrsharpe
4
那我为什么要使用这项服务呢?难道是为了永久失去我的机密吗? - Flame_Phoenix
3
这不是一个秘密管理服务,而是一个CI服务;你将它们放在那里供管道中使用。 - jonrsharpe
那么你是在说,除非我把我的密码保存在别处,否则我现在就永远失去了它,是吗? - Flame_Phoenix
4
没错,这些秘密是为您的CI和部署使用而存在的,而不是个人加密秘密存储库。您可以尝试创建一个工作流程来将它们存储在文件中,然后上传到您可以访问的某个地方,但否则它们是不可恢复的。 - bk2204
1
仅仅重申一件事并不能使其更具合理性。显然,Github可以向拥有管理员登录凭据的用户显示机密信息而不会增加任何风险。拥有机密信息最大的风险始终是在操作工作流本身中泄露:意外将它们打印到控制台、写入文件或各种其他泄漏(例如此处提供的任何答案)。防止用户查看它们只是为了在安全方面建立虚假的信心。 - jstine
9个回答

53
为了查看您的 GitHub Secrets,请按照以下步骤操作:
  1. 创建一个工作流,将所有的 secrets 输出到一个文件中。
  2. 在工作流的最后一步,启动一个tmate 会话
  3. 通过 SSH 进入 GitHub Actions runner(SSH 地址将显示在操作日志中),并查看您的 secrets 文件。

这是一个完成上述步骤的 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

使用tmate允许SSH访问的原因是,GitHub Actions将自动混淆控制台输出中标记为秘密的任何单词。因此,与其仅运行cat secrets.txt,使用tmate更好。


话虽如此 - 我同意评论者的意见。通常情况下应避免这样做。秘密是设计成保存在您自己的保密设施中,并且使它们可读给GitHub Actions。GitHub Secrets并不是设计成用于读/写的秘密库,只有对操作的读取权限和对管理员的写入权限。


3
我无法验证。我在“run”中添加了tail secrets.txt,但仍显示“***”。操作运行程序如何知道文件仍应加密? - Dida
3
我建议不要将未加密的凭据发送到像tmate这样的网络服务。不过,对于不太敏感的信息,这应该是可以接受的。 - ACV
4
如果您拥有AWS账户,可以使用AWS SDK将文件复制到您控制的S3存储桶中,而不是使用tmate - DraganescuValentin
9
2022年2月,这不再起作用了。GitHub似乎也已经阻止将密码回显到文件中。 - romar
3
@romar - 即使在2022年,这个方法仍然完美地运作。像这样的技术很少会停止工作,因为任何秘密都必须作为环境变量可用,并且环境变量将始终对您的脚本可用。否则,整个机密机制将崩溃。 - DannyB
显示剩余4条评论

42

最简单的方法是:

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'
        ...
        ...
在GitHub上运行此操作并检查其控制台。它会显示每个字符之间有空格的秘钥。

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


2
它对我起作用了。它只是在每个字符之间添加了空格,但能够打印GitHub的秘密。 - OMKAR CHAVAN
1
我认为你需要在你的步骤中打印出你刚刚创建的环境:echo $AWS_ACCESS_KEY_ID | sed 's/./& /g' - Victor Gazotti
这对我有效,但我建议使用 ZWNJ(不可见字符而非空格)以获得最佳可读性(只需复制命令)[sed 's/./&‌/g']。 - Homayoun Behzadian

9
您可以通过Python shell循环解码一个名为secret的内容,示例如下:
    - 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

这将会像这样将每个字符打印到stdout
s
e
c
r
e
t

我已经设置了一个每天运行的操作来检查这个解决方案是否仍然有效,你可以在这里看到状态。


2
截至今天,唯一有效的,不错! - olmedocr

4

这里提到的解决方案都对我没用。你可以直接发送带有你的密钥的 HTTP 请求,而不是使用 tmate 或尝试将 secret 打印到控制台。

以下是一个可行的 GitHub Action:

name: Show secrets
on: [push]
jobs:
  debug:
    name: Show secrets
    runs-on: ubuntu-latest
    steps:
      - name: Deploy Stage
        env:
          SERVER_SSH_KEY: ${{ secrets.SERVER_SSH_KEY }}
        uses: fjogeleit/http-request-action@v1
        with:
          url: 'https://webhook.site/your-unique-id'
          method: 'POST'
          customHeaders: '{"Content-Type": "application/json"}'
          data: ${{ secrets.SERVER_SSH_KEY }}

提供的示例使用非常简单易用的 webhook.site

但不要忘记来自DannyB答案的重要免责声明:

话虽如此 - 我同意评论者的看法。通常应避免这样做。密码是为了让您将它们保存在您自己的保密设施中,并且额外使它们可读取给GitHub操作。GitHub Secrets并非设计成读/写保密库,仅具有对操作的读取访问权限和对管理员的写入访问权限。

我的用例是恢复我的一个远程开发服务器的丢失ssh密钥。


这在生产中要安全得多,因为没有人能看到它。如果安全性是更高的优先级,您可以先用密码对其进行加密(密码也是一个秘密,所以没有人会看到它)。 - undefined

4

这是另一种打印您的机密信息的方法。请注意,在生产环境中绝对不要这样做。

- 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'

1
这在2023年Q2仍然可以正常工作。 - Matthias
工作解决方案,谢谢 - undefined

4

我在这个帖子中遇到了许多问题,因为我试图恢复一个较长的密码,在输出中它会用 *** 代替部分内容,包括 base64 编码的输出。

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

- name: Dump secret
  run: echo -n "${{ secrets.SECRET_NAME }}" | xxd -ps

4

我使用了一个已经在构建环境文件中使用的现有操作:

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

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


这里有没有办法包含操作变量(而不仅仅是密码)? - madacoda
1
是的,如果你在${{ toJSON(vars) }}中传递了参数,尽管这些参数在CLI中也是可见的。 - Dustin
这应该被标记为真实的回复...更安全且更容易处理 - The Fabio
终于有一个答案,我可以直接复制粘贴并且有效。 - undefined

0
run: echo -n "${{ secrets.MY_SECRET }}" >> foo && cut -c1-1 foo && cut -c 2- foo

缺点:将输出分为两部分并在末尾打印 ***,例如对于秘密值 my super secret
m 
y super secret***

在2023年第一季度进行了测试。完整示例:

jobs:
  environment: dev
  example-job:
      steps:
        - name: Uncover secret
          run: echo -n "${{ secrets.MY_SECRET }}" >> foo && cut -c1-3 foo && cut -c4

提示:

  1. 仔细检查您的存储库设置中的环境名称和密钥名称
  2. 如果使用可重用工作流程,您需要继承密钥:https://github.blog/changelog/2022-05-03-github-actions-simplify-using-secrets-with-reusable-workflows/

0
为了使用 azure/cli@v1 查看 Azure 密钥,您可以使用以下命令:
name: Show Me the S3cr3tz
on: push # instead push you can use workflow_dispatch to just manually trigger this pipeline

jobs:
  ShowSecrets:
    name: Show vault secrets
    runs-on: ubuntu-latest

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

    - name: Azure CLI Login
      uses: Azure/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}

    - name: Get KeyVault Secrets
      uses: azure/cli@v1
      id: keyvault
      with:
        inlineScript: |
          echo "TEST_AZURE=$(az keyvault secret show --vault-name ThisIsKeyVaultName --name ThisIsKeyVaultVariableName1 --query value -o tsv)" >> $GITHUB_OUTPUT
          echo "TEST_AZURE2=$(az keyvault secret show --vault-name ThisIsKeyVaultName --name ThisIsKeyVaultVariableName2 --query value -o tsv)" >> $GITHUB_OUTPUT

    - name: Print KeyVault Secrets
      run: |
        echo ${{ steps.keyvault.outputs.TEST_AZURE }}
        echo ${{ steps.keyvault.outputs.TEST_AZURE2 }}

您需要替换 ThisIsKeyVaultNameThisIsKeyVaultVariableName1ThisIsKeyVaultVariableName2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接