Acessando recursos da AWS com segurança no Github Actions
Eduardo Rabelo
Posted on January 26, 2023
Aprenda a gerar credenciais de curta duração para acessar sua conta AWS a partir dos fluxos de trabalho no Github Actions
Créditos
- Escrito originalmente por Benoît Bouré, em Securely Access Your AWS Resources From Github Actions.
A segurança é um tópico muito importante para todos os engenheiros trabalhando na nuvem. Garantir que sua infraestrutura e dados sejam mantidos fora do alcance de pessoas maliciosas é uma das coisas mais sérias para fazer corretamente. Na AWS, estamos acostumados a lidar com funções e permissões de IAM que tornam nossos recursos acessíveis aos usuários ou a outros recursos. No entanto, às vezes você precisa conceder acesso de fora da sua organização.
Um exemplo é quando você deseja implantar sua infraestrutura a partir de um pipeline de CI/CD, como os Github Actions. Como você permite que seu fluxo de trabalho obtenha acesso à sua conta da AWS?
Uma abordagem é criar um usuário dedicado do IAM, armazenar suas credenciais no Github Encrypted Secrets, e permitir que o fluxo de trabalho os use. Fácil, chega! Segredos são criptografados pelo Github, por isso é seguro, certo?
Na verdade não... O problema é que esses tipos de credenciais tem um tempo de duração muito longo. Isso significa que, se alguém acessar os valores por qualquer motivo (por exemplo: um vazamento nos logs da CI/CD, alguém que tenha acesso ao GitHub Runner, etc). Eles poderão acessar todos os seus recursos (pelo menos aqueles que as credenciais podem controlar). Claro, você pode fazer a rotação das credenciais de tempos em tempos, mas você teria que fazer isso manualmente. Provavelmente não é algo que você quer gastar e, vamos ser sinceros, você provavelmente não vai querer!
Felizmente, existe uma solução melhor. Se você estiver usando os Github Actions, você pode permitir que o Github obtenha credenciais temporárias e de curta duração para ser usado nas suas ações. Depois disso, as credenciais expirarão e ninguém poderá usá-las novamente.
Neste post, eu o guiarei pelas etapas para configurar isso. Não se preocupe, é realmente mais fácil do que você pensa!
Aqui está um esquema que representa o que vamos realizar
Configurando sua conta AWS
💡 TL; DR; Criei um link de criação rápida do CloudFormation que você pode usar para automatizar as etapas a seguir. Veja na parte inferior deste artigo. Se você quiser saber como funciona e o que o CloudFormation fará, continue lendo esta seção.
Crie um provedor de identidade de conexão OpenID
O primeiro passo é criar um provedor de identidade OpenID Connect (OIDC) em sua conta AWS. Isso permitirá que Github se identifique.
- Vá até o IAM Console -> Identity providers
- Clique Add new provider
- Selecione OpenID Connect
- Usar a seguinte URL fornecida pelo GitHub:
https://token.actions.githubusercontent.com
(Não se esqueça de clicarGet Thumbprint
) - Audience:
sts.amazonaws.com
- Adicione tags, se desejar, e clique em Add Provider
💡 Você precisará fazer essa etapa apenas uma vez por conta da AWS.
Atualização: 13 de janeiro de 2022
Em 12 de janeiro, o Github Actions mudou sua cadeia de certificados. A nova impressão digital é 6938fd4d98bab03faadb97b34396831e3780aea1
Benoît Bouré ⚡️@benoit_boureApparently, Github Actions integration broke yesterday after they changed their certs.
You'll need to update the fingerprint to
6938fd4d98bab03faadb97b34396831e3780aea1 twitter.com/Benoit_Boure/s…08:02 AM - 13 Jan 2022Benoît Bouré ⚡️ @Benoit_BoureI just published a new article! Learn how to securely access your AWS resources from Github Actions workflows. https://t.co/wZUUVwQ21U
Crie uma IAM Role
Agora você precisa criar uma IAM Role que o Github possa assumir para acessar os recursos necessários para controlar.
- Volte para o IAM Console e selecione Roles
- Crie um novo IAM Role
- Escolha Web Identity, selecione o provedor de identidade que você criou na etapa anterior e sua Audience.
- Clique Next: Permissions
Agora você precisa atribuir permissões apropriadas (IAM Policies) para essa IAM Role. Estas são as permissões que o Github precisa para fazer o que for preciso. Isso variará com base no seu caso de uso, então deixarei isso com você. Lembre-se de que você deve manter o princípio de menor privilégios.
Quando isso for feito, dê um nome à sua IAM Role e clique em Create Role.
Agora há um passo adicional a ser feito. Você precisa editar a política de confiança da IAM Role (trust policy) para reduzir o escopo de acesso para apenas o seu repositório. Certifique-se de não pular esta parte, é muito importante. Sem isso, qualquer repositório no GitHub poderá assumir sua função e acessar seus recursos.
Até o momento, não há uma maneira de fazer isso no momento da criação, infelizmente.
- Volte para a lista de IAM Roles e selecione a função criada.
- Clique em Trust Relationship
- E finalmente, clique em Edit Trust Relationship
Dentro da chave Condition
, adicione a seguinte declaração:
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:[nome-da-org]/[nome-do-repo]:*"
}
Substitua os nomes da organização e do repo para corresponder aos seus e clique em Update Trust Policy
.
Nota: Você pode levar isso ainda mais longe e reduzir o escopo usando Git References, usando o nome de uma branch ou tag. Por exemplo:
repo:[nome-da-org]/[nome-do-repo]:ref:refs/heads/master
O resultado final será assim:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::1234567890:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
},
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:[nome-da-org]/[nome-do-repo]:*"
}
}
}
]
}
Isso conclui as configurações necessárias na sua conta da AWS. Anote o valor do ARN, você precisará dele mais tarde.
💡 Você pode criar IAM Roles diferentes por conta e usar uma diferente para cada caso de uso. Por exemplo, um por aplicativo, por uso (configurações, deploy, testes de integração, etc). Você pode brincar com isso para reduzir ainda mais o escopo de cada sessão.
Configurando seu Github Actions
Seu Github Actions requer permissões adicionais para poder usar o OIDC. Adicione o seguinte na parte superior do arquivo YML da sua ação. Você também pode adicioná-lo por job, para reduzir o escopo, se necessário.
permissions:
id-token: write # obrigatório para usar autenticação OIDC
contents: read # obrigatório para clonar o código do repositório
Agora você pode usar o GitHub Action configure-aws-credentials no seu job, para assumir a IAM Role criada. Adicione esta etapa para gerar credenciais antes de fazer qualquer chamada para a AWS:
- name: configure aws credentials
uses: aws-actions/configure-aws-credentials@v1
with:
role-to-assume: arn:aws:iam::1234567890:role/your-role-arn
role-duration-seconds: 900 # o TTL da sessão, em segundos.
aws-region: us-east-1 # sua região
# 👇 Agora você pode executar comandos que usarão a suas credenciais
- name: Serverless deploy
run: sls deploy --stage dev
A etapa configure aws credentials
usará a integração OIDC para assumir a função especificada, gerar credenciais de curta duração e disponibilizar a sessão para os comandos do trabalho atual.
💡 Se você quiser levar a segurança ainda mais longe, você pode definir o ARN da sua IAM Role usado em
role-to-assume
em um segredo do Github.
Automatizar
O pessoal do configure-aws-credentials
compartilhou um modelo de CloudFormation que você pode usar para automatizar as etapas de configuração da AWS.
Usando isso, eu fui adiante; Eu crirei um modelo e também um link de implantação direto.
Você pode usá-lo clicando aqui para fazer o deploy em sua conta.
Preencha os parâmetros:
-
GitHubOrg
: nome da sua organização ou nome de usuário do Github -
RepositoryName
: o repositório que precisa de acesso à sua conta AWS -
OIDCProviderArn
: ARN do seu provedor OIDC existente, se você já tiver um. Caso contrário, deixe-o em branco e um será criado para você. (Lembre-se de que você só precisa de um por conta).
Nota: A IAM Role criada não terá nenhuma IAM Policy anexada a ela. Você ainda precisará anexar as permissões que o seu trabalho no GitHub Actions precisa acessar.
Conclusão
Como você pode ver, proteger sua conta não precisa ser difícil. A parte que pode exigir um pouco mais de esforço é definir as IAM Policies corretas se você quiser seguir o princípio de menos privilégios (e que você deve!).
Para mais conteúdo como este, siga-me aqui no Hashnode em bboure, no Twitter em @Benoit_Boure, e não se esqueça de assinar minha newsletter.
Posted on January 26, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.