发布于 2026-01-06 2 阅读
0

在 GitHub Actions CI 中配置 AWS 账户的身份验证

在 GitHub Actions CI 中配置 AWS 账户的身份验证

简而言之,本文旨在解决配置 AWS 账户安全身份验证的难题,从而简化您的 GitHub Actions CI 工作流程。本文提供简明扼要的指南,帮助您在确保无缝集成的同时,维持最高的安全标准。

最近,我将我开发的开源 AWS 技术栈审计工具SLS-mentor打包成了一个GitHub Action。由此,我遇到了一个问题:如何在远程 CI/CD 作业中可复现地配置 AWS 身份验证。本文将向您解释如何实现这一目标。

我们将使用符合 OIDC 标准的短期凭证身份验证,在 GitHub Actions CI 工作流中配置 AWS 账户的身份验证。当您希望将 AWS 基础设施即代码的部署委托给 GitHub Actions 时,此功能尤为有用。与 AWS IAM 用户访问密钥等长期凭证相比,使用 OIDC 等短期 IAM 凭证能够缩短暴露窗口并增强身份验证过程的整体弹性,从而提供更安全的替代方案。

我将首先简要介绍认证协议的基本原理。如果您只想查找实用教程,可以直接跳到下一节。

深入了解 GH OIDC 协议

现在您可能想知道,当您设置此身份验证方法时,其底层发生了什么。

我们配置的 OIDC 协议是基于 OAuth 2.0 协议的标准,可提供安全的身份认证。

模式

您需要在 GitHub OIDC 提供商(也称为身份提供商 IdP)和 AWS IAM 之间建立信任关系。请注意,GitHub Actions 的身份验证由独立于 GitHub 的第三方机构 Digicert 提供。当您在设置过程中点击“获取指纹”时,系统会执行此操作。作为响应,授权服务器会返回一个公钥(用于 RS256 协议)。云提供商可以使用该公钥来验证(且仅验证)给定 JWT 令牌的有效性。当您在 IAM 和 OIDC 身份提供商之间建立信任关系时,您就信任了由该 IdP 认证的身份(通过其网站 URL 或 DNS 进行标识)可以访问特定范围的 AWS 账户。每个 CI 作业(即每个 GitHub 虚拟机 CI/CD 运行器实例)都会向 GitHub 的身份提供商请求 OIDC 令牌,身份提供商会返回一个唯一的、自动生成的 JSON Web 令牌 (JWT)。作业运行时,OIDC 令牌会被提交给云提供商(在本例中,提交给 STS 服务,我们向其申请短期凭证以担任 GitHub 运行器角色)。为了验证令牌,云提供商首先检查其真实性,其次检查 OIDC 令牌的主题和其他声明是否与云角色 OIDC 信任定义中预配置的条件匹配。例如,令牌会检查我们在信任策略中设置的受众和主题。

要使用 AWS 账户完全验证您的 GitHub Action Runner,我们将遵循以下 3 个主要步骤:

  1. 配置 AWS IAM 和 GitHub Actions 之间的 OIDC 信任关系
  2. 为 CI 工作流创建一个最小的 IAM 角色。
  3. 在您的 CI 工作流程中配置身份验证。

配置 AWS IAM 和 GitHub Actions 之间的 OIDC 信任关系

首先,您需要告诉 AWS IAM 将 Github 身份提供商确认为安全的身份证书颁发机构,即身份提供商 (IdP)。

  • 前往 AWS IAM 控制台,在身份提供商下单击“添加提供商”,在提供商类型下指定 OIDC(最新一代,基于 JSON,而 SAML 基于 XML)。
  • 对于提供商 URL,请输入此解决方案的 GitHub OIDC IdP 的 URL:https://token.actions.githubusercontent.com
  • 点击“获取指纹”
  • 观众朋友们,请输入sts.amazonaws.com

教程1

为 CI 工作流创建一个最小的 IAM 角色。

  • 点击新创建的身份提供程序
  • 点击“分配角色”
  • 创建新角色
  • 在“受众”列表中,选择sts.amazonaws.com
  • 填写 Github 组织(请注意,AWS 已推断我们将在那里配置 GitHub)。

在下一页,您需要选择 CI/CD 流程需要承担的最小角色。AWS IAM 中的最小权限原则强调为特定任务分配必要的最小权限,以防止过度授权。这种做法通过减少攻击面和最大限度地降低凭证泄露的潜在影响来增强安全性。

  • 了解这一点后,请选择您希望 CI/CD 系统能够承担的角色。
  • 检查该角色的信任策略:它应该如下所示:

教程2



'Condition':
  {
    'StringEquals':
      {
        'token.actions.githubusercontent.com:aud': 'sts.amazonaws.com',
        'token.actions.githubusercontent.com:sub': 'repo:octo-org/octo-repo:ref:refs/heads/octo-branch',
      },
  }


Enter fullscreen mode Exit fullscreen mode

在您的 CI 工作流程中配置身份验证。

现在回到 CI/CD 工作流程中的 GitHub Actions 作业。如何让它使用我们刚刚设置的流程进行身份验证?

为此,我们将利用 GitHub Actions Marketplace 的强大功能。实际上,AWS 为我们提供了用于使用 AWS 客户端验证运行器机器的代码,该代码封装在一个 GitHub Action 中,可直接从 GitHub Actions Marketplace 获取。您只需将此 Action 添加为工作流中的一个步骤即可。请务必将 `<role>` 替换为您刚刚创建的角色的 ARN。



- name: Configure AWS Credentials
    uses: aws-actions/configure-aws-credentials@v3
    with:
        role-to-assume: arn:aws:iam::111122223333:role/GitHubAction-AssumeRoleWithAction #change to reflect your IAM role’s ARN
        role-session-name: GitHub_to_AWS_via_FederatedOIDC


Enter fullscreen mode Exit fullscreen mode

最后,将以下权限添加到您的作业中。



permissions:
  id-token: write # This is required for requesting the JWT
  contents: read # This is required for actions/checkout


Enter fullscreen mode Exit fullscreen mode

好了,一切就绪!

资料来源:

https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services

https://github.com/aws-actions/configure-aws-credentials#configure-aws-credentials-for-github-actions

https://datatracker.ietf.org/doc/html/rfc6749.html#section-1.4

https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_oidc_verify-thumbprint.html

https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html

https://auth0.com/docs/get-started/applications/signing-algorithms

文章来源:https://dev.to/slsbytheodo/configure-authentication-to-your-aws-account-in-your-github-actions-ci-13p3