探索如何通过限制组织级密钥、将密钥专用于敏感数据以及实施最小权限访问来安全使用 GitHub Actions 密钥
引言
这是我们系列博客文章的第一篇"GitHub Actions 安全最佳实践(含检查清单)"的后续文章。在本文中,我们将深入探讨 GitHub Actions 密钥管理最佳实践。以下是本系列的其他博客文章,您可能会感兴趣:
5 项有效的第三方 GitHub Actions 治理最佳实践
GITHUB_TOKEN:工作原理及如何保护自动 GitHub Action 令牌
GitHub Action 工作流需要密钥来执行敏感操作,例如管理云资源、将构建的容器镜像推送到镜像仓库等。由于这些是具有提升访问权限的特权凭证,企业必须确保 GitHub Actions 密钥的安全性至关重要。
我们将在单独的博客文章中讨论使用 OpenID Connect (OIDC) 和最小权限访问令牌的问题。本文涵盖 GitHub Actions 密钥的所有其他安全最佳实践。
什么是 GitHub Actions 密钥?
GitHub Actions 密钥是使您能够将敏感信息存储在代码库中的变量。这些可以是管理员访问密钥、凭据或组织密钥——所有需要完全保护的敏感数据。这些密钥可以在组织、GitHub 代码库或代码库环境级别创建。虽然保护 GitHub Actions 密钥可能是一项相当棘手的工作,但我们提供了以下实用的易于遵循的技巧来实施 GitHub Actions 密钥最佳实践。
立即试用 StepSecurity
定期轮换密钥
定期轮换 GitHub Actions 密钥并使旧密钥失效以保持工作流中的密钥安全非常重要。
如何查看 Actions 密钥
要查看您的 Actions 密钥,您可以访问 GitHub 代码库设置页面。虽然您无法在一个地方查看所有 GitHub 密钥及其元数据,但有几种方法可以查看此清单。以下是其中一些方法:
- 为每个代码库访问代码库设置页面查看密钥。
- 使用 GitHub API 创建一个应用程序,在整个 GitHub 组织中编录所有密钥及其元数据。
仅将 Actions 密钥用于存储密钥而不用于非敏感信息,可以使组织更容易使用上述方法发现过时密钥并在不担心误报的情况下进行轮换。
您知道吗?StepSecurity 的 GitHub Actions 安全平台可以帮助您在整个 GitHub 组织中发现过时的 GitHub Actions 密钥?免费开始使用请点击此处。
显示密钥轮换天数的仪表板截图
将组织级密钥限制到特定代码库
只要可能,您应该避免使用组织级密钥,因为这些密钥可能会潜在地提供给组织中的所有代码库。如果您有一个希望在多个代码库中使用的通用 GitHub Actions 密钥,您应该创建一个组织级密钥并仅将其作用域限定为需要它的特定代码库。默认情况下,组织级密钥可供所有内部和私有代码库使用。在大型企业环境中,这可能意味着数百个代码库可以访问这些共享的组织级密钥。您应该改为将其作用域限定为组织中的特定代码库使用。
显示如何将代码库设置为私有和内部的屏幕截图
仅将 Actions 密钥用于存储密钥
这是一个实用的技巧,可以减少组织管理 GitHub Actions 密钥的运营负担。GitHub Actions 密钥必须仅用于存储密钥。对于非敏感数据,应使用 Actions 变量。与 GitHub Actions 密钥一样,Actions 变量可以在组织、代码库或代码库环境级别创建。
什么不应存储在 GitHub 密钥中
我们看到许多企业使用 GitHub 密钥存储配置值,例如环境类型(例如 dev、prod 等)、资源名称(例如 AWS 账户编号)等。这类非敏感信息必须迁移到 GitHub 变量。这将使企业能够将资源投入到真正保护 Actions 密钥上,而不必担心其 Actions 环境中的非敏感数据。
显示创建新 Action 变量的屏幕截图
使用最小权限密钥
与任何其他密钥一样,您必须在 GitHub Actions 中使用最小权限密钥。一个实际需要考虑的问题是,是跨多个工作流重用同一个密钥(例如 AWS 身份),还是为每个环境创建一个唯一的 GitHub Actions 密钥。
重用密钥与为每个工作流创建唯一密钥
从安全角度来看,为每个工作流作业提供一个唯一的 GitHub Actions 密钥是理想的。但是,对于可能在其环境中拥有数百/数千个 GitHub Actions 工作流作业的大型组织来说,这将是一场运营噩梦。一个实用的方法可以是按环境(例如 dev vs prod)或服务(例如支付服务 vs 服务健康监控服务)对 Action 工作流进行分段,而不是在属于多个分段的工作流中重用 Actions 密钥。
利用环境密钥和强制性审查保护生产密钥
您的 GitHub Actions 密钥很容易被不良行为者窃取和泄露。这可能包括敏感数据,如管理员云凭据、组织密钥或公钥。代码库中的所有工作流和分支都可以访问您的 GitHub Actions 密钥,并且可以通过更新工作流或创建新工作流并引用密钥来窃取。
保护 GitHub Actions 密钥的一种方法是利用环境密钥。这些在环境级别存储的密钥使您能够通过强制实施强制性审查来实施防护栏。这意味着它们只能由可以批准 GitHub Actions 工作流运行的授权审查员访问。未经审查员批准,任何作业都无法访问这些密钥。
环境密钥还允许您实施其他质量门禁,包括静态代码分析器,可以标记问题并确保 GitHub 工作流中不存在有漏洞的依赖项。
显示使用环境密钥保护生产密钥的屏幕截图
避免在 Actions 运行日志中打印密钥
当 GitHub Actions 在工作流运行日志中检测到密钥时,它默认会隐藏密钥。这意味着密钥的值将在日志中自动被遮盖。例如,在 GitHub Actions 中使用的名为 SECRET_API_KEY 的 GitHub Action 密钥。当此 GitHub 工作流执行时:
name: Secret Redaction In Logs
on:
workflow_dispatch:
jobs:
print-secret:
runs-on: ubuntu-latest
steps:
- name: Print Secret Value
run: |
echo "Secret API Key: ${{ secrets.SECRET_API_KEY }}"日志将显示 API 密钥的实际值被遮盖:
显示被遮盖的 API 密钥的屏幕截图
此功能仅限于 GitHub Actions 识别的密钥,这意味着只有明确链接到工作流的密钥才会被遮盖。
在运行时创建的密钥(例如完成 OAuth 握手后生成的授权令牌)如果出现在构建日志中,将不会被遮盖。完全避免记录密钥至关重要。这对于公共开源 GitHub 代码库尤其重要,因为此类代码库中 GitHub Actions 的日志对公众可见。截至目前,没有选项可以将这些日志设置为私有。
不要将结构化数据用作密钥
这是前一个最佳实践的延伸。如果您使用自定义结构化数据(如 JSON、XML 或 YAML 块)来封装 GitHub Action 密钥值,它将不会被编辑。此外,使用自定义数据结构存储密钥也会导致工程问题,例如标准开发工具无法正确识别密钥,因为它期望不同的格式。由于 GitHub Actions 没有提供便捷的方式来提取 GitHub Actions 密钥进行调试和故障排除,调试此类问题可能会变得复杂。
扫描 GitHub Actions 日志中的密钥
扫描您的 GitHub Actions 日志中的密钥可以帮助您检测构建工具和第三方组件中密钥的意外泄露。GitHub 不提供内置的方式来扫描 GitHub Actions 日志,您需要自己构建这样的系统。
构建扫描 Actions 日志的系统
实现此系统的一种方法是创建一个订阅 Actions 完成事件的 GitHub App。一旦 Action 作业完成,您可以使用 GitHub App 下载日志并使用密钥扫描器扫描它们。
结论
管理 GitHub Actions 密钥可能相当困难,但通过这些简单的最佳实践,您应该能够安全管理它们并增强您的 GitHub Actions 安全性。请继续关注我们的下一篇 GitHub Actions 安全博客文章,了解如何走在不断发展的威胁之前并保护您的工作流免受严重泄露和攻击。
常见问题
如何在 GitHub Actions 中访问代码库密钥?
要在 GitHub Actions 中访问代码库密钥,请按照以下步骤操作:
- 访问代码库设置页面。
- 直接在代码库设置页面上查看密钥。
- 逐个为每个代码库查看 GitHub Action 密钥及其元数据。
- 使用 GitHub API 开发一个应用程序,在整个 GitHub 组织中编录所有密钥及其元数据。这允许对密钥进行更全面的清单管理。
您可以通过在工作流中引用它来访问代码库密钥。
GitHub Actions 密钥用于什么?
GitHub Actions 密钥有助于安全地存储部署凭据和访问密钥等敏感信息。您可以在 GitHub Actions 工作流中访问这些密钥,但必须明确包含才能访问。
如何在 GitHub Actions 中添加密钥?
要在 GitHub Actions 中添加密钥,请按照以下步骤操作:
- 如果您要将密钥添加到个人 GitHub 账户的代码库,请确保您是代码库所有者。对于组织代码库,您需要管理员访问权限。如果使用 REST API,则需要协作者访问权限。
- 在 GitHub.com 上进入代码库主页,然后在代码库名称下点击"Settings"。如果您看不到它,请点击下拉菜单然后选择"Settings"。
- 在侧边栏中,在"Security"部分下,选择"Secrets and variables",然后点击"Actions"。
- 选择"Secrets"标签,然后点击"New repository secret"。
- 在"Name"字段中为您的 GitHub Action 密钥提供名称,在"Secret"字段中输入密钥的值。
- 最后,点击"Add secret"以保存您的更改。