O blog da AWS
Utilizando o AWS Config para auto remediação contra acesso público ao Amazon S3 bucket
Por Wembley Carvalho, Enterprise Solutions Architect na AWS
A exposição de conteúdo público na internet, em sua maioria, é proposital e intencional. Os sites e blogs, por exemplo, precisam estar abertos ao público que os pretende acessar. Neste cenário, é muito comum inclusive que o público contenha usuários anônimos da Internet; entretanto, em alguns casos, esse tipo de conteúdo não deveria ser acessado por qualquer pessoa sem autorização ou permissão. Para isso, as políticas de acesso ao conteúdo devem ser muito bem estruturadas, restringindo os acessos desconhecidos.
O objetivo deste blog é criar uma remediação automática contra configurações dos buckets que podem deixar públicos informações no Amazon S3. Para isso, vamos utilizar algumas ferramentas direta e indiretamente para monitorar e remediar as políticas a nível do bucket, como o AWS Config, AWS IAM e o AWS Systems Manager
O Amazon Simple Storage Service, ou Amazon S3, é um serviço de armazenamento de objetos e possui configurações nativas para bloqueio de acesso público, podendo ser configurado a nível de conta da AWS ou a nível de bucket, para que os objetos nunca tenham acesso público, agora ou no futuro.
Porém, mesmo com esses controles, é recomendado que criemos medidas protetivas para situações onde essas políticas sejam alteradas ou removidas, de forma intencional ou não. Uma auto remediação irá reestabelecer a política e deixar o conteúdo protegido.
O AWS Config é um serviço que permite acessar, auditar e avaliar as configurações dos recursos da AWS. Com a feature de Conformance Packs é possível gerenciar conformidade das configurações de recursos da AWS e tomar ações de remediação a nível de múltiplas contas, integrando com o AWS Organizations.
O AWS CloudFormation é uma ferramenta de automação e provisionamento de infraestrutura como código. Ao final deste blog post, irei disponibilizar o template para automatizar a implementação desta solução.
Habilitando o AWS Config
Passo 1: Acessar o serviço do AWS Config e habilitá-lo, caso ainda não o tenha feito. Para isso, acesse o console da AWS, e depois o serviço AWS Config
Passo 2: Caso o AWS Config não esteja configurado, clique no botão “1-click setup”, siga para a tela de revisão e confirme a configuração inicial do serviço.
Passo 3: Após essa primeira configuração do AWS Config, a tela inicial do serviço será a seguinte:
Passo 4: Clique em “View Dashboard” para acessar o status do serviço e os itens analisados da sua conta.
Configurando as Rules do AWS Config
Passo 1: A primeira ação é adicionar uma AWS Managed Rule existente no console do AWS Config, para verificar se os buckets do Amazon S3 podem ser acessados publicamente. Para isso, acesse o menu Rules dentro do AWS Config.
Passo 2: Clique em Add rule para adicionar uma regra gerenciada pela AWS. Para essa análise de conformidade, utilizaremos a regra gerenciada chamada s3-bucket-level-public-access-prohibited.
Passo 2: Nesta etapa, precisaremos informar o nome e descrição que daremos à regra; ou podemos deixar com as informações padrões.
Passo 3: Nesta outra etapa, as configurações da seção Trigger (gatilho) devem ser mantidas. Nas configurações da seção Parameters podemos informar, de forma opcional, o parâmetro excludedPublicBuckets ao AWS Config, que usará essa informação para definir qual ou quais buckets (separados por vírgula) podem ser públicos e ficarão fora dessa regra de conformidade.
Passo 4: Revisar e criar a Rule do AWS Config.
Passo 5: Após a criação da regra, na lista de Rules criadas dentro do AWS Config, já será possível visualizar a Rule criada, e também se já existem Buckets em Noncompliant (não conformidade).
Criando a IAM Role
O AWS Config utilizará o AWS Systems Manager para executar a remediação no Amazon S3. Sendo assim, após criar a Rule de verificação dos buckets públicos no S3, precisaremos criar um IAM Role com permissões para a remediação. Para isso, vamos seguir os seguintes passos.
Passo 1: Acesse o serviço AWS IAM no console AWS.
Após isso, selecione Roles no menu lateral esquerdo, e clique no botão Create role. Você será redirecionado para a tela de criação de Roles. Escolha a opção AWS Service, e na lista exibida selecione o serviço Systems Manager como trusted entity. (Na opção “Select your use case”, escolha apenas Systems Manager novamente.)
Passo 2: Na próxima etapa, você precisa selecionar uma policy (política) existente ou criar uma. Clique em Create policy, e em seguida, selecione a opção JSON para abrir o editor de texto de políticas. Utilize como modelo a seguinte policy exibida abaixo, e clique em Next:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:GetBucketPublicAccessBlock",
"s3:PutBucketPublicAccessBlock"
],
"Resource": "*"
}
]
}
Passo 3: A configuração de Tags para ajudar a identificar o recurso é opcional. Clique em Next.
Passo 4: Dê um nome e uma descrição à sua política, e em seguida clique em Create Policy.
Passo 5: Após a criação da policy, retorne à tela de criação das Roles e clique no botão para atualizar a lista de políticas.
Passo 6: Uma vez atualizadas, localize e selecione a política criada nos passos anteriores.
Passo 7: A configuração de Tags para ajudar a identificar o recurso é opcional. Neste caso, a Tag está relacionada a Role. No anterior, estava relacionada à Policy. Clique em Next.
Passo 8: Dê um nome e uma descrição à Role, e em seguida clique em Create role.
Passo 9: Após a criação da Role, a tela retornará a lista de Roles já criadas. Localize e clique na sua respectiva Role. Na parte de Summary, copie o Role ARN para a área de trabalho.
Criando a remediação
Com a regra do AWS Config e o IAM Role criados, vamos agora configurar a remediação
Passo 1: Para criar a remediação, volte ao AWS Config, acesse a lista de Rules, selecione a Rule com o nome s3-bucket-level-public-access-prohibited, clique em Actions e Manage remediations.
Passo2: Em Remediation action, no sub-menu Select remediation method, você deve escolher se a remediação será automática* ou manual.
*Obs: em ambiente produtivos, recomenda-se configurar a primeira execução de forma manual e assistida, para não haver mudança de configuração em Buckets que deveriam de fato ser públicos e ainda não estão na lista de exceção.
Passo 3: No sub-menu Remediation Action details, selecione a remediação AWSConfigRemediation-ConfigureS3BucketPublicAccessBlock.
Passo 4: O sub-menu Rate Limits é utilizado para configurar quantas remediações o Systems Manager irá executar simultaneamente. Neste caso podemos manter os parâmetros padrões de:
2 Concurrent Execution Rate
5 Error Rate
Passo 5: No sub-menu Resource ID parameter, selecionaremos o parâmetro BucketName
Passo 6: No sub-menu Parameters adicionaremos no parâmetro AutomationAssumeRole o Role ARN copiado no Passo 9 da criação do IAM Role. Após tudo isto, clique em Save Changes.
Testando a solução.
Após a remediação criada, podemos esperar a próxima avaliação ou pedir para que seja reavaliado instantaneamente a conformidade dos buckets.
Ou podemos selecionar apenas o bucket que desejamos executar a remediação de forma manual e clicar em Remediate.
Após isto, você poderá validar o sucesso da remediação acessando o Bucket que foi definido como Noncompliant e validar se a configuração de Block public access está ativa e como Block all.
Após alguns minutos, a Rule do AWS Config voltará ao status de Compliant, uma vez que todos os buckets estiverem sendo remediados e bloqueados pela política de acesso público.
Automatizando a criação da remediação via AWS CloudFormation
Uma outra maneira de criar essa automação é via AWS CloudFormation. Para isto, temos dois passos:
Passo 1 – Habilitar o AWS Config (caso precise)
Caso o serviço AWS Config ainda não esteja habilitado na conta AWS, utilize este template do AWS CloudFormation para habilitar o AWS Config.
Será aberto o AWS console já com os parâmetros configurados, precisando apenas selecionar a caixa de “I acknowledge that AWS CloudFormation might create IAM resources” e clicar em Create stack.
Passo 2 – Configurar o AWS Config
Depois do serviço AWS Config habilitado na conta, podemos criar a Rule para verificar os buckets S3 e criar a remediação. Para isso, precisamos executar o template do AWS CloudFormation abaixo, afim de efetuar toda a configuração do AWS Config, tais como a criação das permissões no AWS IAM e a remedição.
Salve este template em um arquivo de texto, com a extensão .yml, e crie uma Stack do AWS CloudFormation a partir dele.
AWSTemplateFormatVersion: 2010-09-09
Description: Checks if Amazon Simple Storage Service (Amazon S3) buckets are publicly accessible. This rule is NON_COMPLIANT if an Amazon S3 bucket is not listed in the excludedPublicBuckets parameter and bucket level settings are public.
Resources:
S3PublicAccessRule:
Type: AWS::Config::ConfigRule
Properties:
Description: Checks if Amazon Simple Storage Service (Amazon S3) buckets are publicly accessible. This rule is NON_COMPLIANT if an Amazon S3 bucket is not listed in the excludedPublicBuckets parameter and bucket level settings are public.
Source:
Owner: AWS
SourceIdentifier: S3_BUCKET_LEVEL_PUBLIC_ACCESS_PROHIBITED
RemediationConfig:
Type: AWS::Config::RemediationConfiguration
Properties:
Automatic: False
ConfigRuleName:
Ref: "S3PublicAccessRule"
Parameters:
AutomationAssumeRole:
StaticValue:
Values:
- Fn::GetAtt:
- "AutoRemediationIamRole"
- "Arn"
BucketName:
ResourceValue:
Value: "RESOURCE_ID"
TargetId: "AWSConfigRemediation-ConfigureS3BucketPublicAccessBlock"
TargetType: "SSM_DOCUMENT"
TargetVersion: "1"
AutoRemediationIamRole:
Type: "AWS::IAM::Role"
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Principal:
Service:
- "ssm.amazonaws.com"
Action:
- "sts:AssumeRole"
Policies: []
AutomationPassRolePolicy:
Type: "AWS::IAM::Policy"
Properties:
PolicyName: "s3GetPutPublicAccess"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Action:
- "s3:GetBucketPublicAccessBlock"
- "s3:PutBucketPublicAccessBlock"
Resource: "*"
Roles:
- Ref: "AutoRemediationIamRole"
Será necessário selecionar a caixa de “I acknowledge that AWS CloudFormation might create IAM resources” e clicar em Create stack, da mesma forma que fizemos no passo anterior.
Neste caso, o script está configurado para que a remediação seja executada de forma manual, para evitar problemas de bloqueios de buckets de forma indevida. Entretanto, essa execução manual pode ser alterada para automática no console do AWS Config.
Conclusão
Utilizando algumas ferramentas, como AWS Config, AWS IAM e o AWS Systems Manager, podemos criar uma remediação automática contra configurações de buckets públicos, que podem expor informações na Internet do Amazon S3. O intuito é evitar que configurações erradas, feitas de forma acidental ou não, permitam o acesso público em buckets que não deveriam ser acessados desta forma.
Sobre o autor
Wembley Carvalho é Enterprise Solutions Architect na AWS desde de 2019, hoje no time da AWS Telco LATAM. Trabalhando em diversas áreas de TI a mais de 20 anos e certificado AWS desde 2016, vem se especializado nos últimos anos em de Segurança em nuvem e transformação digital.