O blog da AWS

Como proteger o acesso entre contas usando MFA?

Por Shon Shah

 

Na AWS você pode adicionar autenticação multifator (MFA) para acesso entre contas. Neste blog post, mostraremos um caso de uso comum, incluindo um exemplo de código, que demonstra como criar políticas que impõem o MFA quando usuários do IAM de uma conta da AWS fazem solicitações programáticas para recursos em uma conta diferente.

Muitos de vocês possuem e gerenciam várias contas da AWS, então frequentemente perguntam como simplificar o gerenciamento de acesso entre essas contas. As roles do IAM fornecem um mecanismo seguro e controlável para permitir o acesso entre contas. As roles permitem que se realize o acesso entre contas sem nenhum compartilhamento de credenciais e sem a necessidade de criar usuários duplicados do IAM. É possível adicionar outra camada de proteção para acesso entre contas, exigindo que os usuários se autentiquem usando um dispositivo de MFA antes de assumirem uma role.

Imagine que sua empresa mantenha várias contas da AWS: desenvolvimento, pré-produção e produção. Vamos supor que você queira centralizar o gerenciamento de acesso de todas essas contas “secundárias” usando uma única conta “principal” que contenha seus usuários do IAM.

Vamos dar uma olhada em como você configuraria esse relacionamento principal-secundária sob a perspectiva do controle de acesso. O objetivo é permitir que os usuários do IAM na conta principal realizem ações privilegiadas, como Amazon EC2 TerminateInstances e Amazon DynamoDB DeleteTable nas contas secundárias, mas somente se elas forem autenticadas usando MFA.

Há três etapas envolvidas: estabelecer uma relação de confiança entre contas, configurar dispositivos de MFA para usuários e realizar ações privilegiadas. Vamos nos aprofundar nos detalhes de cada uma:

1. Estabelecer uma relação de confiança entre contas

Nesta etapa, as contas secundárias se tornam contas confiadas e a conta principal se torna a conta confiante.

Vamos começar com a conta de Desenvolvimento. Você a configura para confiar na conta principal criando uma role, por exemplo, PrivilegedActionsRole – Role para executar ações privilegiadas, e especificando a conta principal como a principal confiante. Em seguida, você configura a role para exigir o MFA. Você pode concluir essas etapas usando o Console de Gerenciamento da AWS. Mude para o console do IAM e acesse o ambiente de Roles e em seguida clique em Create Role selecionando AWS Account em Trusted entity type, em seguida, em An AWS account selecione Another AWS account e insira o ID da conta primária e por fim marque a caixa de seleção Exigir MFA, conforme mostrado na figura abaixo.

Nos bastidores, a role é configurada com uma política de confiança de role que efetivamente diz “Confio que os usuários do IAM da conta principal assumam essa role, desde que o usuário seja autenticado usando MFA”. A política de confiança de role criada pelo assistente é mostrada abaixo.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {"AWS": "Parent-Account-ID"},
      "Action": "sts:AssumeRole",
      "Condition": {"Bool": {"aws:MultiFactorAuthPresent": true}}
    }
  ]
}

Observe que o principal é definido como o ID da conta principal e a condição especifica a chave aws:MultiFactorAuthPresent. A condição verifica se aws:MultiFactorAuthPresent é verdadeira, para verificar se o usuário se autenticou com MFA quando fez login pela primeira vez no AWS Management Console ou forneceu informações de autenticação de MFA quando fez a chamada da API AssumeRole a partir da AWS CLI ou usando uma das AWS SDKs. Se um desses dois cenários não se aplicar, o usuário não poderá assumir a role.

É importante observar que a condição de MFA pode ser especificada somente na política de confiança da role (e não na política de acesso à role discutida abaixo). Ele controla se o MFA é necessário ou não para assumir a role.

A próxima etapa do assistente atribui uma política de acesso à função que determina as permissões concedidas ao usuário que assume a função com êxito. Continuando com nosso exemplo, a política a seguir concede permissão para chamar Amazon EC2 TerminateInstances e Amazon DynamoDB DeleteTable.

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Action":["ec2:TerminateInstances","dynamodb:DeleteTable"],
      "Effect":"Allow",
      "Resource":"*"
    }
  ]
}

Repita essas etapas para as contas de pré-produção e produção.

Agora vamos passar para a configuração da conta principal. Você precisa conceder permissão aos usuários para assumir as roles criadas nas respectivas contas secundárias. Você faz isso anexando uma política de usuário ou grupo que concede a ação AssumeRole e define o recurso como o ARN (nome de recurso da Amazon) das roles que você criou em suas contas secundárias.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": [
       "arn:aws:iam::Development-Account-ID:role/PrivilegedActionsRole",
       "arn:aws:iam::Staging-Account-ID:role/PrivilegedActionsRole",
       "arn:aws:iam::Production-Account-ID:role/PrivilegedActionsRole",
     ]
    }
  ]
}

2. Configurar dispositivos de MFA para usuários

Nesta etapa, você configura dispositivos de MFA para usuários do IAM na conta principal para que os usuários possam assumir as roles que você criou nas contas secundárias. Você pode configurar um hardware ou um dispositivo de MFA virtual usando o Console de Gerenciamento AWS, seguindo as etapas descritas na documentação do IAM.

3. Realizar ações privilegiadas

Com a configuração descrita acima, os usuários da conta principal agora podem realizar ações nos recursos das contas secundárias. A figura a seguir mostra as três etapas envolvidas quando os usuários da conta principal desejam assumir a role protegida por MFA para realizar ações nos recursos nas contas secundárias. Essas etapas podem ser executadas usando os SDKs da AWS ou usando o AWS CLI.

Passo 1:  Autenticar usando o ID da chave de acesso e a chave de acesso secreto.

Passo 2:  Obtenha um código (Senha única baseada em tempo ou TOTP) do dispositivo MFA. Passe a identificação do dispositivo MFA e o código para a solicitação AssumeRole. Estes são os novos parâmetros serialNumber e tokenCode. Esses parâmetros são além dos parâmetros necessários para o ARN da role a assumir e um nome de sessão. Em caso de sucesso, obtenha de volta as credenciais de segurança temporárias.

Passo 3:  Use as credenciais de segurança temporárias para realizar ações privilegiadas na conta secundária.

Agora que analisamos toda a configuração, vamos ver uma amostra de código. O programa de exemplo a seguir, escrito usando o AWS SDK for Python (Boto), mostra como você pode assumir uma role protegida por MFA passando parâmetros da MFA para AssumeRole. O código de exemplo usa as credenciais de segurança temporárias da resposta AssumeRole para encerrar uma instância na conta confiável.

import boto
from boto.sts import STSConnection
from boto.ec2 import EC2Connection

# Role from the trusting account to assume
role_arn = "arn:aws:iam::ACCOUNT-NUMBER-WITHOUT-HYPHENS:role/ROLE-TO-ASSUME"
# String to identify the role session
role_session_name = "AssumeRoleSessionWithMFA"

# MFA device ID (serial number for hardware device or ARN for virtual device)
mfa_serial_number = "arn:aws:iam::ACCOUNT-NUMBER-WITHOUT-HYPHENS:mfa/MFA-DEVICE-ID"

# The calls to AssumeRole must be signed using the access key ID and
# secret access key of an IAM user. The IAM user credentials can be 
# in environment variables or in a configuration file and will be 
# discovered automatically by the STSConnection() function. For more 
# information, see the Python SDK documentation:
# http://boto.readthedocs.org/en/latest/boto_config_tut.html
print "nConnecting to Security Token Service..."
sts_connection = STSConnection()
print "Connection successful."

# Assume the role
print "nAssuming role", role_arn, "using MFA device", mfa_serial_number, "..."
# Prompt for MFA one-time-password
mfa_token = raw_input("Enter the MFA code: ")
role_session = sts_connection.assume_role(
    role_arn=role_arn,
    role_session_name=role_session_name,
    mfa_serial_number=mfa_serial_number,
    mfa_token=mfa_token
)
print "Assumed the role successfully."

# Use the role-provided temporary security credentials to connect to EC2
print "nConnecting to Elastic Compute Cloud service..."
ec2_connection = EC2Connection(
    aws_access_key_id=role_session.credentials.access_key,
    aws_secret_access_key=role_session.credentials.secret_key,
    security_token=role_session.credentials.session_token
)
print "Connection successful."

# Terminate instance
print "nTerminating EC2 instance..."
instance_id = raw_input("Enter id of the instance to teminate: ")
response = ec2_connection.terminate_instances(instance_id)
print response
print "Done."

Aqui está a saída de uma amostra de execução:

Screenshot showing the output from a sample run

Em resumo, as roles do IAM fornecem um mecanismo seguro e controlável para simplificar o gerenciamento de acesso entre contas. Você pode adicionar outra camada de proteção, impondo a MFA para esse acesso cruzado entre contas. Para obter informações adicionais sobre este recurso, visite a seção Configuração de acesso à API protegido por MFA no Guia de Usuário do IAM.

 

Este artigo foi traduzido do Blog da AWS em Inglês.


Sobre o autor

Shon Shah

 

 

 

 

Revisores

Carolina Carneiro atua como Technical Trainer na AWS. Ministra treinamentos de Segurança, Machine Learning, Arquitetura, Operação de Sistemas, dentre outros. Iniciou a sua jornada na nuvem da AWS em 2020 fazendo parte do Programa Tech U, um programa de capacitação na nuvem da AWS. Após o Tech U, iniciou a sua jornada no time de Training and Certification LATAM, o qual teve a oportunidade de se aprofundar em tópicos como Segurança e Machine Learning. Hoje busca ensinar AWS de maneira acessível e engajada.

 

 

 

 

Ricardo Makino atualmente é arquiteto de soluções na AWS apoiando os clientes de governo em sua jornada para a nuvem, possui mais de 20 anos de experiência em TI onde já passou pelos setores de governo, educação e pesquisa atuando como administrador de redes e sistemas, analista de segurança da informação, pesquisador de segurança da informação e especialista em nuvem, e esteve envolvido em diversos projetos de tecnologias de orquestração de infraestrutura e plataforma, otimização de aplicações, migrações, segurança de redes e aplicações e outros.