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.
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".
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://token.actions.githubusercontent.com
- 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 relação de confiança no IAM, confira "Como assumir uma função" e "Como criar uma função para identidade da Web ou federação do OpenID Connect" na documentação da AWS.
Edite a política de confiança para adicionar o campo sub
às condições de validação. Por exemplo:
"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"
}
}
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.
{
"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:
- Adicionar configurações de permissões para o token.
- 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: write
permite 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
eACTIONS_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:
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:
permissions:
id-token: write # This is required for requesting the JWT
Você pode precisar especificar permissões adicionais aqui, dependendo das necessidades do seu fluxo de trabalho.
Para fluxos de trabalho reutilizáveis, a configuração permissions
para id-token
deve ser 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. 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.
# 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@v3
- name: configure aws credentials
uses: aws-actions/configure-aws-credentials@v2
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 }}/