Skip to main content

在 Amazon Web Services 中配置 OpenID Connect

在工作流程中使用 OpenID Connect 向 Amazon Web Services 进行身份验证。

注: GitHub 托管的运行器目前在 GitHub Enterprise Server 上不受支持。 您可以在 GitHub 公共路线图 上查看有关未来支持计划的更多信息。

概览

OpenID Connect (OIDC) 允许您的 GitHub Actions 工作流程访问 Amazon Web Services (AWS) 中的资源,而无需将任何 AWS 凭据存储为长期 GitHub 机密。

本指南介绍如何配置 AWS 信任 GitHub 的 OIDC 作为联合标识,并包括使用令牌向 AWS 验证并访问资源的 aws-actions/configure-aws-credentials 工作流程示例。

基本要求

  • 要了解 GitHub 如何使用 OpenID Connect (OIDC) 的基本概念及其体系结构和优势,请参阅“关于使用 OpenID Connect 进行安全强化”。

  • 在继续之前,必须规划安全策略,以确保仅以可预测的方式分配访问令牌。 要控制云提供商颁发访问令牌的方式,必须至少定义一个条件,使不受信任的存储库无法为云资源请求访问令牌。 更多信息请参阅“使用云配置 OIDC 信任”。

将身份提供商添加到 AWS

要将 GitHub OIDC 提供商添加到 IAM,请参阅 AWS 文档

  • 对于提供程序 URL:使用 https://HOSTNAME/_services/token
  • 对于“受众”:如果您使用的是官方操作,请使用 sts.amazonaws.com

配置角色和信任策略

要在 IAM 中配置角色和信任,请参阅 AWS 文档中的“假定角色”“为 Web 身份或 OpenID Connect Federation 创建角色”

编辑信任关系以将 sub 字段添加到验证条件。 例如:

JSON
"Condition": {
  "StringEquals": {
    "HOSTNAME/_services/token:aud": "sts.amazonaws.com",
    "HOSTNAME/_services/token:sub": "repo:octo-org/octo-repo:ref:refs/heads/octo-branch"
  }
}

更新 GitHub Actions 工作流程

要更新 OIDC 的工作流程,您需要对 YAML 进行两项更改:

  1. 为令牌添加权限设置。
  2. 使用 aws-actions/configure-aws-credentials 操作将 OIDC 令牌 (JWT) 交换为云访问令牌。

添加权限设置

 作业或工作流程运行需要具有 id-token: writepermissions 设置。 如果将 id-tokenpermissions 设置设为 readnone,您将无法请求 OIDC JWT ID 令牌。

id-token: write 设置允许使用以下方法之一从 GitHub 的 OIDC 提供商请求 JWT:

  • 在运行器上使用环境变量(ACTIONS_ID_TOKEN_REQUEST_URLACTIONS_ID_TOKEN_REQUEST_TOKEN)。
  • 从 Actions 工具包使用 getIDToken()

如果您只需要为单个作业获取 OIDC 令牌,则可以在该作业中设置此权限。 例如:

YAML
permissions:
  id-token: write

您可能需要在此处指定其他权限,具体取决于工作流程的要求。

请求访问令牌

aws-actions/configure-aws-credentials 操作从 GitHub OIDC 提供商接收 JWT,然后从 AWS 请求访问令牌。 更多信息请参阅 AWS 文档

  • <example-bucket-name>:在此处添加 S3 存储桶的名称。
  • <role-to-assume>:将示例替换为您的 AWS 角色。
  • <example-aws-region>:在此处添加您的 AWS 区域的名称。
YAML
# Sample workflow to access AWS resources when workflow is tied to branch
# The workflow Creates static website using aws s3
name: AWS example workflow
on:
  push
env:
  BUCKET_NAME : "<example-bucket-name>"
  AWS_REGION : "<example-aws-region>"
# permission can be added at job level or workflow level    
permissions:
      id-token: write
      contents: read    # This is required for actions/checkout
jobs:
  S3PackageUpload:
    runs-on: ubuntu-latest
    steps:
      - name: Git clone the repository
        uses: actions/checkout@v3
      - name: configure aws credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          role-to-assume: arn:aws:iam::1234567890:role/example-role
          role-session-name: samplerolesession
          aws-region: ${{ env.AWS_REGION }}
      # Upload a file to AWS s3
      - name:  Copy index.html to s3
        run: |
          aws s3 cp ./index.html s3://${{ env.BUCKET_NAME }}/