Skip to main content

Configurando o OpenID Connect no Amazon Web Services

Use o OpenID Connect dentro de seus fluxos de trabalho para efetuar a autenticação com Amazon Web Services.

Observação: no momento, não há suporte para os executores hospedados no GitHub no GitHub Enterprise Server. Você pode ver mais informações sobre o suporte futuro planejado no GitHub public roadmap.

Visão geral

O OpenID Connect (OIDC) permite que seus fluxos de trabalho de GitHub Actions acessem os recursos na Amazon Web Services (AWS), sem precisar armazenar as credenciais AWS como segredos de GitHub de longa duração.

Este guia explica como configurar a AWS para confiar no OIDC do GitHub como uma identidade federada e inclui um exemplo de fluxo de trabalho para o aws-actions/configure-aws-credentials que usa tokens para autenticação na AWS e acesso aos recursos.

Observação: o suporte para declarações personalizadas de OIDC não está disponível na AWS.

Pré-requisitos

  • Para saber os conceitos básicos de como o GitHub usa o OIDC (OpenID Connect), além da arquitetura e dos benefícios, confira "Sobre o enrijecimento de segurança com o OpenID Connect".

  • Antes de prosseguir, você deve planejar sua estratégia de segurança para garantir que os tokens de acesso sejam atribuídos apenas de forma previsível. Para controlar como o provedor de nuvem emite os tokens de acesso, você precisa definir, pelo menos, uma condição, para que os repositórios não confiáveis não possam solicitar tokens de acesso aos seus recursos de nuvem. Para obter mais informações, confira "Sobre o enrijecimento de segurança com o OpenID Connect".

  • Você deve garantir que os seguintes pontos de extremidade OIDC sejam acessíveis pelo seu provedor de nuvem:

    • https://HOSTNAME/_services/token/.well-known/openid-configuration
    • https://HOSTNAME/_services/token/.well-known/jwks

    Observação: você pode restringir o acesso aos pontos de extremidade do OIDC permitindo apenas intervalos de endereços IP da AWS.

Observação: o GitHub não dá suporte nativo a marcas de sessão do AWS.

Adicionando o provedor de identidade ao AWS

Para adicionar o provedor OIDC do GitHub ao IAM, confira a documentação da AWS.

  • Para a URL do provedor: use https://HOSTNAME/_services/token
  • Em "Público-alvo": use sts.amazonaws.com se você estiver usando a ação oficial.

Configurando a função e a política de confiança

Para configurar a função e a política de confiança no IAM, consulte a documentação da AWS "Configurar credenciais da AWS para ações do GitHub" e "Configurando uma função para o provedor de identidade OIDC do GitHub".

Observação: o Gerenciamento de Identidades de Acesso (IAM) da AWS recomenda que os usuários avaliem a chave de condição do IAM, token.actions.githubusercontent.com:sub, na política de confiança de qualquer função que confie no provedor de identidade OIDC (IdP). A avaliação dessa chave de condição na política de confiança de função limita as ações do GitHub que podem assumir a função.

Edite a política de confiança, adicionando o campo sub às condições de validação. Por exemplo:

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

Se você usar um fluxo de trabalho com um ambiente, o campo sub deverá fazer referência ao nome do ambiente: repo:OWNER/REPOSITORY:environment:NAME. Para obter mais informações, confira "Sobre o enrijecimento de segurança com o OpenID Connect".

Observação: quando os ambientes são usados em fluxos de trabalho ou em políticas OIDC, recomendamos adicionar regras de proteção ao ambiente para segurança adicional. Por exemplo, você pode configurar regras de implantação em um ambiente para restringir quais ramificações e tags podem ser implantadas no ambiente ou acessar segredos de ambiente. Para obter mais informações, confira "Usando ambientes para implantação".

JSON
"Condition": {
  "StringEquals": {
    "HOSTNAME/_services/token:aud": "sts.amazonaws.com",
    "HOSTNAME/_services/token:sub": "repo:octo-org/octo-repo:environment:prod"
  }
}

No exemplo a seguir, StringLike é usado com um operador curinga (*) para permitir que qualquer branch, branch de mesclagem de solicitação de pull ou ambiente da organização octo-org/octo-repo e do repositório assuma uma função na AWS.

JSON
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::123456123456:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringLike": {
                    "token.actions.githubusercontent.com:sub": "repo:octo-org/octo-repo:*"
                },
                "StringEquals": {
                    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
                }
            }
        }
    ]
}

Atualizar o seu fluxo de trabalho de GitHub Actions

Para atualizar seus fluxos de trabalho para o OIDC, você deverá fazer duas alterações no seu YAML:

  1. Adicionar configurações de permissões para o token.
  2. Use a ação aws-actions/configure-aws-credentials para trocar o token OIDC (JWT) por um token de acesso à nuvem.

Adicionando configurações de permissões

 A execução de trabalho ou de fluxo de trabalho exige uma configuração permissions com id-token: write. Você não poderá solicitar o token de ID JWT do OIDC se a configuração permissions de id-token for definida como read ou none.

A configuração id-token: writepermite que o JWT seja solicitado do provedor OIDC do GitHub usando uma destas abordagens:

  • Usando variáveis de ambiente no executor (ACTIONS_ID_TOKEN_REQUEST_URL e ACTIONS_ID_TOKEN_REQUEST_TOKEN).
  • Usando getIDToken() por meio do kit de ferramentas do Actions.

Se você precisar buscar um token OIDC para um fluxo de trabalho, a permissão poderá ser definida no nível do fluxo de trabalho. Por exemplo:

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

Se você só precisa obter um token OIDC para um único trabalho, essa permissão poderá ser definida dentro desse trabalho. Por exemplo:

YAML
permissions:
  id-token: write # This is required for requesting the JWT

Talvez seja necessário especificar permissões adicionais aqui, dependendo das necessidades do seu fluxo de trabalho.

Para fluxos de trabalho reutilizáveis pertencentes ao mesmo usuário, organização ou empresa que o fluxo de trabalho do chamador, o token OIDC gerado no fluxo de trabalho reutilizável pode ser acessado no contexto do chamador. Para fluxos de trabalho reutilizáveis fora de sua empresa ou organização, a configuração permissions para id-token deve ser explicitamente definida como write no nível do fluxo de trabalho do chamador ou no trabalho específico que chama o fluxo de trabalho reutilizável. Isso garante que o token OIDC gerado no fluxo de trabalho reutilizável só tenha permissão para ser consumido nos fluxos de trabalho do chamador quando pretendido.

Para obter mais informações, confira "Reutilizar fluxos de trabalho".

Solicitando o token de acesso

A ação aws-actions/configure-aws-credentials recebe um JWT do provedor OIDC do GitHub e solicita um token de acesso da sua instância da AWS. Para obter mais informações, confira a documentação da AWS.

  • <example-bucket-name>: adicione o nome do bucket S3 aqui.
  • <role-to-assume>: substitua o exemplo pela função da AWS.
  • <example-aws-region>: adicione o nome da região da AWS aqui.
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   # This is required for requesting the JWT
  contents: read    # This is required for actions/checkout
jobs:
  S3PackageUpload:
    runs-on: ubuntu-latest
    steps:
      - name: Git clone the repository
        uses: actions/checkout@v4
      - name: configure aws credentials
        uses: aws-actions/configure-aws-credentials@v3
        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 }}/

Leitura adicional