DevOps Mind
Neste post vamos ver na prática como configurar o Terraform em um cenário multi-account. Se você está buscando otimizar sua infraestrutura em nuvem por meio de múltiplas contas, este guia é para você. Vamos descomplicar o processo e fornecer os passos essenciais para uma configuração eficiente, para que a autenticação via Terraform AWS SSO seja fácil e transparente.
Tópicos
O que é AWS Single Sign-On (SSO)?
AWS Single Sign-On (SSO) é um serviço da Amazon Web Services que simplifica o gerenciamento de acesso para diversas contas e aplicações. Ele permite que os usuários acessem múltiplos recursos AWS e aplicativos empresariais com um único conjunto de credenciais, eliminando a necessidade de memorizar várias senhas. Isso não apenas melhora a experiência do usuário, mas também fortalece a segurança ao centralizar o controle de acesso.
O AWS SSO se integra perfeitamente com o AWS Organizations, facilitando a administração de permissões em larga escala. Ele suporta a federação de identidades com provedores externos, como o Microsoft Active Directory, e é compatível com padrões como SAML 2.0. Dessa forma, o AWS SSO proporciona uma solução abrangente para empresas que buscam otimizar seus processos de autenticação e autorização, ao mesmo tempo em que mantêm um alto nível de segurança e conformidade.
Benefícios de Autenticar via SSO no Terraform
A autenticação via Single Sign-On (SSO) no Terraform traz inúmeros benefícios para a gestão de infraestrutura como código. Primeiro, ao usar SSO, os usuários podem acessar várias plataformas e serviços com um único conjunto de credenciais, simplificando o processo de login e melhorando a experiência do usuário.
O gerenciamento de múltiplas contas na AWS com Terraform e assume_role
oferece uma série de benefícios que incluem maior segurança, organização e controle sobre os recursos. Utilizar múltiplas contas permite isolar ambientes de desenvolvimento, teste e produção, reduzindo o risco de interferências acidentais e aprimorando a segurança geral. Cada conta pode ter políticas de acesso personalizadas, garantindo que somente usuários e serviços autorizados possam acessar recursos específicos. Além disso, a segmentação de contas facilita o rastreamento e a gestão de custos, proporcionando uma visão clara dos gastos associados a cada projeto ou equipe.
A configuração e o uso de assume_role
com Terraform simplificam o gerenciamento de múltiplas contas ao permitir que um único conjunto de credenciais assuma diferentes papéis em diversas contas. Isso centraliza a autenticação e facilita a automação do provisionamento de recursos. Utilizando assume_role
, é possível reutilizar módulos e configurações do Terraform, assegurando consistência e conformidade em todas as contas. Esta abordagem reduz a complexidade operacional, minimiza erros humanos e permite um gerenciamento mais eficiente da infraestrutura.
Configurando Terraform AWS SSO
Role na conta de destino
Considerando que temos uma conta de destino, onde existe uma role que desejamos assumir os papéis dela, a partir do usuário da conta de origem, precisamos garantir a configuração dos Trusted entities na role desejada.
Segue o código que foi utilizado no meu exemplo, ele define as condições sob as quais uma entidade pode assumir um determinado papel (role) no AWS:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::891377134822:root"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "7755"
}
}
}
]
}
"Principal"
: Define quem ou o que pode assumir o papel. Neste caso, é a conta AWS com o ARN arn:aws:iam::891377134822:root
.
"Action": "sts:AssumeRole"
: Especifica a ação que está sendo permitida, que é sts:AssumeRole
. Isso permite que a entidade principal assuma o papel.
"Condition"
: Define condições adicionais que devem ser satisfeitas para que a ação seja permitida.
"StringEquals"
: Este é um operador de condição que verifica se o valor de um atributo específico é igual ao valor fornecido."sts:ExternalId": "7755"
: Esta condição verifica se oExternalId
usado ao tentar assumir o papel é igual a7755
. OExternalId
é uma medida de segurança que pode ser usada para garantir que apenas entidades específicas possam assumir o papel.
Resultado esperado:
Manifestos Terraform para configurar a autenticação
providers.tf
provider "aws" {
region = var.regiao
profile = "devopsmind-labs/AdministratorAccess"
assume_role {
role_arn = var.role_arn
external_id = "7755"
session_name = "terraform-session"
}
}
Neste exemplo, configuramos o provedor AWS para utilizar assume_role
, especificando o role_arn
e a session_name
necessários.
Neste exemplo também foi configurado o external_id
, que é opcional, mas é uma segurança adicional.
Explicando um pouco mais sobre os principais campos:
- Perfil:
profile = "devopsmind-labs/AdministratorAccess"
: Especifica o perfil AWS a ser usado, que deve estar configurado no arquivo de credenciais AWS (~/.aws/credentials
) ou então no arquivo config da AWS(~/.aws/config
).
- Assume Role:
- O bloco
assume_role
permite que o Terraform assuma uma role específica na AWS. role_arn = var.role_arn
: Define o ARN da role a ser assumida, baseado na variávelrole_arn
definida emvariables.tf
.external_id = "7755"
: Define um ID externo para a sessão de role assumida, que pode ser usado para segurança adicional.session_name = "terraform-session"
: Define o nome da sessão para a role assumida.
- O bloco
data.tf
# Encontre o usuário atualmente em uso pela AWS
data "aws_caller_identity" "atual" {}
# Região na qual implantar a solução
data "aws_region" "atual" {}
# Zonas de disponibilidade para usar em nossa solução
data "aws_availability_zones" "available" {}
O arquivo data.tf
define os dados necessários para obter a identidade do usuário atual, a região e as zonas de disponibilidade.
variables.tf
variable "regiao" {
description = "A região da AWS para criar os recursos"
type = string
default = "us-east-1"
}
variable "role_arn" {
description = "O ARN da role para assumir"
type = string
default = "arn:aws:iam::058264174146:role/admin-role-account-sandbox"
}
O arquivo variables.tf
declara a variável role_arn
, contendo o ARN do papel/role IAM que o Terraform deve assumir.
main.tf
Já no arquivo main.tf, iremos definir o recurso que desejamos criar, que neste caso é um simples bucket do S3:
resource "aws_s3_bucket" "this" {
bucket = "meu-bucket-devops-mind"
tags = {
Name = "meu-bucket-devops-mind"
Environment = "Dev"
}
}
Configuração do AWS config
Visando fazer uso de um único usuário para autenticar em múltiplas contas, no manifesto Terraform foi informado o profile = “devopsmind-labs/AdministratorAccess”, pois trata-se de um usuário centralizado no nosso exemplo.
A configuração esperada do ~/.aws/config
é algo similar ao exemplo abaixo:
cat ~/.aws/config
[default]
region = us-east-1
output = json
[profile fernandomuller]
region = us-east-1
output = json
[profile devopsmind-labs/AdministratorAccess]
granted_sso_start_url = https://d-9022f718d0.awsapps.com/start/
granted_sso_region = us-east-1
granted_sso_account_id = 891377134822
granted_sso_role_name = AdministratorAccess
common_fate_generated_from = aws-sso
credential_process = granted credential-process --profile devopsmind-labs/AdministratorAccess
Observação:
No meu ambiente eu utilizo o serviço do Granted para facilitar o processo de criação da configuração e autenticação na AWS em si.
Neste artigo abaixo eu trago maiores detalhes sobre como o Granted é importante, ao ajudar no acesso a funções de nuvem e permitir que várias contas de nuvem sejam abertas em seu navegador da Web simultaneamente e/ou via terminal, simplificando demais o AWS SSO Login:
Efetuando teste do assume_role terraform
Acessando o diretório onde configurei os manifestos Terraform, vou efetuar o apply e validar se a autenticação ocorre conforme o esperado:
terraform apply -auto-approve
Bucket criado com sucesso:
Material de apoio
- Use suas credenciais de usuários IAM de forma mais segura com infraestrutura como código
- Terraform AWS Provider — Everything you need to know about Multi-Account Authentication and Configuration
- Using AWS AssumeRole with the AWS Terraform Provider
- Para aqueles que precisam de uma forma fácil e segura de configurar o AWS CLI, recomendo fortemente o uso do Granted, que pode ser visto neste post: https://devopsmind.com.br/aws/granted-a-maneira-mais-facil-de-acessar-sua-nuvem-e-trabalhar-com-multiplas-contas