Github 秘密并没有真正得到保护,如何永久保护秘密

Github Secrets are not really secured, how to secure secrets permanently

我不知道为什么 Github secrets 真的被称为 secrets,因为它可以被任何在组织中工作的具有推送访问权限的人打印出来,即他们创建分支使用下面的技巧来打印 secret 然后删除分支,任何员工弹指一挥间就可以取出机密

如果有最佳解决方案,请指导我永久保护我的 github 操作秘密。

 steps:
      - name: 'Checkout'
        uses: actions/checkout@master
      - name: 'Print secrets'
        run: |
            echo ${{ secrets.SOME_SECRET }} | sed 's/./& /g'

首先,GitHub 有一篇关于 Security hardening for actions 的文章,其中包含一些一般性建议。


通常,您想区分 public 和 internal/private 存储库。

我接下来的大部分回答都针对 internal/private 存储库,但如果您担心 public 存储库:请记住,操作不是 运行 来自第三方的 PR直到他们被批准。

对于 internal/private 个存储库,您将不得不将一些秘密托付给您的同事。经历将所有秘密保密到不能被同事“提取”的程度的麻烦可能是不值得的。到那时,您可能还必须问自己,即使不知道这些秘密,恶意员工也会造成什么损害(也许他们了解您的业务,他们从事 IT 工作,因此他们可能能够使您的服务脱机,等等) ).所以你将不得不信任他们 一些 程度。

限制恶意同事可能造成的损害的一些措施:

环境秘密

您可以创建 secret for an environment and protect the environment.

例如,假设您希望防止同事窃取您的生产机密并从他们的计算机进行部署,而不是通过 GitHub 操作。

您可以创建如下工作:

jobs:
  prod:
    runs-on: ubuntu-latest
    environment: production
    steps:
      - run: ./deploy.sh --keys ${{ secrets.PROD_SECRET }}

步骤:

  • 将机密 PROD_SECRET 配置为 production
  • 的环境机密
  • 创建环境production并设置保护规则
    • 如果你真的想确保没有人做你不喜欢的事情,你可以将自己设置为审阅者,然后手动批准每个部署

代码所有者

您可以使用 codeowners 并保护 .github/workflows 中的文件。 more about codeowners

OIDC 和可重复使用的工作流程

如果您要部署到某些云环境,您可能应该使用 OpenID Connect. That, combined with reusable workflows, can give you an additional layer of security: You can specify which workflow is allowed to deploy to production

@rethab 回答很好,我将添加我在就类似问题联系他们后从 Github 支持人员那里得到的答案。

感谢您写信给 GitHub 支持。

请注意,GitHub 不会从日志中删除所有可能混淆的秘密,这不是预期的行为。

https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-secrets

To help prevent accidental disclosure, GitHub uses a mechanism that attempts to redact any secrets that appear in run logs. This redaction looks for exact matches of any configured secrets, as well as common encodings of the values, such as Base64. However, because there are multiple ways a secret value can be transformed, this redaction is not guaranteed.

https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#exfiltrating-data-from-a-runner

To help prevent accidental secret disclosure, GitHub Actions automatically redact secrets printed to the log, but this is not a true security boundary because secrets can be intentionally sent to the log. For example, obfuscated secrets can be exfiltrated using echo ${SOME_SECRET:0:4}; echo ${SOME_SECRET:4:200};

请注意,在这种情况下,日志中打印的不是存储在存储库中的秘密,而是对其进行混淆。此外,任何具有写入权限的用户都可以访问机密,而无需在日志中打印出来。他们可以 运行 工作流中的任意命令以通过 HTTP 发送秘密,甚至将秘密存储为工作流工件并下载工件。

您可以在下面阅读有关 GitHub 操作的安全强化的更多信息:

https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions