AWS configure SSO

Terraform AWS SSO: Autenticação Segura com assume_role

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.

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 o ExternalId usado ao tentar assumir o papel é igual a 7755. O ExternalId é uma medida de segurança que pode ser usada para garantir que apenas entidades específicas possam assumir o papel.

Resultado esperado:

assume_role terraform
Trusted entities – IAM Role

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:

  1. 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).
  2. 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ável role_arn definida em variables.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.

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:

Granted

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

terraform aws
Terraform apply

Bucket criado com sucesso:

terraform sso
Bucket S3

Material de apoio

Compartilhe / Share
Fernando Müller Junior
Fernando Müller Junior

Eu sou o Fernando Müller, um Tech Lead SRE com 16 anos de experiência em TI, atualmente eu trabalho na Appmax, uma fintech localizada no Brasil. Apaixonado por trabalhar com arquiteturas e aplicações Cloud Native, ferramentas Open Source e tudo que existe no mundo SRE, sempre procurando se desenvolver e aprender constantemente(Lifelong learning), atuando em projetos inovadores!

Artigos: 35

Receba as notícias por email / Receive news by email

Insira seu endereço de e-mail abaixo e assine nossa newsletter / Enter your email address below and subscribe to our newsletter

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *