Skip to main content

Como proteger a configuração e o acesso a buckets S3 com Snyk e Solvo

Escrito por

Lauren Place

David Hendri

blog feature snyk iac solvo

18 de outubro de 2021

0 minutos de leitura

Solvo capacita desenvolvedores e engenheiros de DevOps a executar a infraestrutura em nuvem com acesso de privilégio mínimo, em alta velocidade e escala. Neste artigo, vamos apresentar um fluxo de trabalho que combina a plataforma automatizada da Solvo com Snyk Infrastructure as Code (Snyk IaC) para criar um acesso personalizado e seguro de uma função Lambda a um bucket AWS S3. Este artigo foi publicado originalmente no site da Solvo.


Cada vez mais, as organizações estão adotando o modelo de infraestrutura como código para gerenciar as configurações dos recursos em nuvem.

Configurar a infraestrutura por meio de código permite ter mais controle de versão e do código-fonte, facilitando o acompanhamento e a replicação das condições de um ambiente para outro. Essa abordagem é especialmente útil para criar buckets AWS S3, que podem ser usados para armazenar código ou outros dados importantes. Como recurso de nuvem, esses buckets S3 podem ser facilmente compartilhados com o restante da equipe.

Mas, às vezes, esses buckets S3 acabam sendo _compartilhados demais_. Na correria, escrever uma política IAM segura para um recurso de nuvem (S3, Lambda, EC2 ou qualquer outro) costuma ser a última preocupação dos desenvolvedores. Para ganhar velocidade e conveniência, não é raro um desenvolvedor configurar o bucket incorretamente, com políticas de segurança permissivas demais, colocando o conteúdo em risco de exposição.

Vamos conhecer alguns riscos de segurança relacionados a políticas e ver como evitá-los.

Exemplo de uma função Lambda configurada incorretamente

A seguir, temos uma configuração do Terraform que cria uma função AWS Lambda para armazenar uma imagem em um bucket S3. Também é possível ver o código da função IAM e da política de segurança.

O que podemos deduzir dessa configuração sobre o conteúdo e o nível de segurança?

```
# create function 
resource "aws_lambda_function" "Lambda_function" { 
    s3_bucket = "my-bucket" 
    s3_key = "my-key.zip" 
    function_name = "my-test-function" 
    role = aws_iam_role.lambda_iam_role.arn 
    handler = "index.handler" 
    runtime = "nodejs12.x" 
    memory_size = 1024 
    timeout = 900
}

# create role 
resource "aws_iam_role" "Lambda_iam_role" {
    name = "my-lambda-role" 
    assume_role_policy = <<EOF
{
    "Version": "2012-10-17", 
    "Statement": [
        {
            "Action": "sts:AssumeRole", 
            "Principal": {
                "Service": "lambda.amazonaws.com" 
            }, 
            "Effect": "Allow", 
            "Sid": ""
        }
    ]
}
EOF
}

# create policy 
resource "aws_iam_role_policy" "Lambda_iam_policy" { 
    name = "my-lambda-policy" 
    role = aws_iam_role.Lambda_iam_role.id
    policy = <<EOF
{
    "Version": "2012-10-17", 
    "Statement": [
        {
            "Effect": "Allow", 
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream", 
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow", 
            "Action": "*",
            "Resource": "*"
        }
    ]
}
EOF

No nosso aplicativo, a função Lambda foi escrita para armazenar imagens de cães em um bucket S3. Ela tem permissão para fazer isso, além de executar outras ações, como Put, Get, Delete, Create e List. E muitas outras, se considerarmos todos os demais serviços além do S3.

Isso aconteceu por causa do que está escrito nas linhas 52 a 54. Na prática, estamos PERMITINDO todas as ações em todos os recursos. Isso equivale a permissões administrativas.

Essa política é permissiva demais. A única ação que deveria ser permitida aqui é “put”, pois qualquer outra é excessiva e pode levar ao vazamento ou à corrupção de dados, ou ser usada para fazer reconhecimento dos nossos recursos.

Se você conhece bem o Terraform e o AWS IAM e só precisasse revisar essa configuração, talvez fosse fácil identificar o problema. Mas, em geral, há muito mais configurações do Terraform, e é difícil acompanhar todos os detalhes. Assim, é pouco provável que um desenvolvedor ou membro da equipe de segurança encontre essa política arriscada, escondida em meio a um conjunto de módulos do Terraform.

Felizmente, há novas ferramentas que facilitam muito a identificação e a correção desses problemas, além de ajudar a distribuir as responsabilidades de segurança entre todas as equipes de engenharia que usam IaC.

Como detectar configurações inseguras

Snyk Infrastructure as Code (IaC) é uma ferramenta de teste de IaC capaz de analisar configurações de Terraform, Kubernetes e AWS CloudFormation e identificar políticas arriscadas em serviços da AWS, do Azure e do GCP. O problema pode ser algo tão simples quanto um asterisco, que torna a política permissiva demais, como no exemplo acima. Ou pode ser uma permissão de “gravação” onde deveria haver apenas “leitura”, por exemplo.

Com testes estáticos contínuos e automatizados, o Snyk IaC consegue analisar o Terraform em escala, ajudando as organizações a gerenciar a infraestrutura como código. Se a análise encontrar uma configuração arriscada, a Snyk orientará a pessoa desenvolvedora na correção. Melhor ainda: você pode usar o Solvo com o Snyk IaC para gerar automaticamente uma política segura que reduza a exposição a riscos.

Vamos ver como isso funciona na prática.

Para executar a análise, podemos usar a CLI da Snyk e rodar um snyk iac test na nossa configuração:

Saída do terminal após a análise do arquivo lambda.tf pelo Snyk IaC, indicando dois problemas no Terraform: permissões excessivas no IAM e rastreamento do X-Ray para Lambda desativado.

A análise encontrou uma configuração incorreta na política, que usa “*” e é permissiva demais, pois permite tudo.

Snyk IaC informa os possíveis riscos dessa configuração e dá orientações gerais para corrigir o problema. O Solvo vai além e gera automaticamente uma configuração IAM específica para o seu ambiente, com o mínimo de privilégios. Juntos, eles ajudam você a encontrar e corrigir problemas enquanto escreve o código, fazer rapidamente os ajustes necessários e garantir a segurança antes da implantação.

Tela de sugestão de política do IAM exibindo permissões da AWS para criar fluxos de log, registrar eventos de log, enviar objetos para o S3 e criar grupos de log.

Agora, vemos que nossa política permite apenas “PutObject”, então nossas fotos de cães estão protegidas.

Trecho de código que mostra uma política do AWS S3 permitindo a ação s3:PutObject no recurso pictures-of-dogs.

Depois que o Solvo aplicou a política, analisamos o arquivo Terraform novamente, e o Snyk IaC mostra que todas as permissões administrativas foram removidas:

Saída do terminal do teste do Snyk IaC em lambda.tf, indicando um problema de baixa gravidade: rastreamento do X-Ray desativado para uma função do AWS Lambda.

Combine integrações para ampliar a cobertura

Com as análises do Snyk IaC, as organizações podem identificar e corrigir proativamente políticas arriscadas na infraestrutura como código, seja em Terraform, Kubernetes ou CloudFormation. Quando usado com o Solvo, ele pode substituir as políticas arriscadas por políticas seguras e ajudar as organizações a corrigir rapidamente configurações incorretas e aumentar a segurança, sem precisar contratar mais profissionais ou buscar novos conhecimentos especializados.

Para saber mais sobre como o Solvo pode ajudar a reduzir automaticamente os riscos da sua infraestrutura em nuvem, acesse o site da Solvo para começar ou solicitar uma demonstração gratuita. Se você ainda não experimentou o Snyk IaC, pode começar a usar gratuitamente.


David Hendri é cofundador e CTO da Solvo

Lauren Place é gerente de marketing de produto da Snyk

Proteja a infraestrutura desde a origem

A Snyk automatiza a segurança e a conformidade de IaC nos fluxos de trabalho e detecta recursos com configurações divergentes ou ausentes.

Publicado em: