如何让 GitHub Actions 安全地访问从分叉创建的 PR 的 Secrets?

Sas*_*ota 6 continuous-integration github github-actions github-secret cicd

我有一个运行端到端测试的公共存储库。这些测试需要存储在 GitHub 中的机密。

相应的工作流程yaml文件有如下pull_request条目:

on:
  pull_request:
  ....
Run Code Online (Sandbox Code Playgroud)

问题:如果我(所有者)自己创建拉取请求,工作流程将正确运行并访问机密。如果有人从分叉创建 PR,GitHub 会要求我批准运行,但是一旦我批准,工作流程将看不到这些秘密的值,并且测试将失败。

如果我更改pull_requestpull_request_target,它将正确访问秘密。然而,这样,在运行工作流程之前它不会征求我的批准(因此秘密很容易泄露)。

pull_request_target:
  branches:
    - main
Run Code Online (Sandbox Code Playgroud)

问题:当从分叉上运行 PR 时,如何使 GitHub 操作访问机密,同时仍需要批准运行?

Guy*_*Guy 1

与 不同的是pull_requestpull_request_target在目标存储库的上下文中运行工作流,以便您可以访问机密。您可以通过添加来减少此漏洞labeled,但这并不能真正使其成为一种安全的方法

\n

来自确保 GitHub 操作和工作流程的安全

\n
\n

因此,此方法只能用作临时解决方案,\n直到应用上述选项中的正确修复为止。由于外部用户无权分配标签,这实际上需要存储库所有者首先手动检查更改,并且还容易出现人为错误。

\n

请注意,对于针对易受攻击的工作流程进行的任何修复,都有一个重要的 \xe2\x80\x9cgotcha\xe2\x80\x9d。在对易受攻击的工作流进行修复之前打开的所有 PR 将使用打开 PR 时存在的工作流版本。这意味着\n如果有待处理的 PR,对该 PR 的任何更新仍可能滥用\n易受攻击的工作流程。如果在修复易受攻击的工作流后可能会添加不受信任的提交,建议关闭或重新设置此类 PR。

\n

您可能会问自己:如果 pull_request_target 工作流程仅检查并构建 PR,即运行不受信任的代码,但不引用任何秘密,那么它是否仍然容易受到攻击?

\n

是的,因为在 pull_request_target 上触发的工作流仍然\n在内存中\n具有读/写存储库令牌,该令牌\n可能可供任何正在运行的程序使用。如果工作流程使用\nactions/checkout 并且不将可选参数\npersist-credentials 作为 false 传递,则情况会变得更糟。该参数的默认值为 true。这意味着在任何后续步骤中,任何运行的代码都可以简单地从磁盘读取存储的存储库令牌。如果您不需要存储库写入权限或机密,只需坚持使用 pull_request 触发器即可。

\n
\n

如果您仍然想这样做,请添加pull_request_target带有labeledtype 的触发器

\n
on:\n  pull_request_target:\n    types: [labeled]\n
Run Code Online (Sandbox Code Playgroud)\n

当您准备好合并 PR 时,通过创建一个标签Pull requests -> Labels -> new label并将其应用于右侧菜单中“标签”部分的拉取请求,这将触发工作流程。

\n