O blog da AWS

Introdução ao Bot Control para proteção de tráfego de bots mal-intencionados com o AWS Web Application Firewall (WAF).

Por Mayerli Romero, Arquiteta de Soluções e
Marco Saenz, Arquiteto de Soluções

Introdução :

De acordo com o relatório Bad Bot Report 2021 da Imperva (líder em segurança cibernética e parceira da AWS), os bots maliciosos representaram 25,6% de todo o tráfego da web em 2020. Da mesma forma, aqueles com uma categorização média ou avançada, e conhecidos como ABP (Advanced Persistent Bots), representaram 57,1% do tráfego em 2020. Tais tipos de bots geralmente executam tarefas como: navegar por IPs aleatórios, entrar por meio de proxies anônimos e redes peer-to-peer com a possibilidade de alterar seus agentes de usuário e evitar a detecção, enquanto mantêm a persistência no alvo.

 

Você pode usar grupos de regras gerenciadas de Bot Control para bloquear ou limitar o tráfego de bots mal-intencionados em sua página web. Este blog apresenta um guia passo a passo geral sobre como configurar e testar os recursos do Bot Control.

Descrição da funcionalidade WAF (Bot Control)

Tutorial

Pré-requisitos

Para este passo a passo, você deve ter os seguintes pré-requisitos:

  1. Uma conta da AWS.
  2. Função ou usuário que tenha acesso para criar os recursos da AWS: AWS WAF, Amazon EC2 (Amazon Elastic Compute Cloud), AWS AutoScaling, AWS StepFunctions, AWS Lambda, Application Load Balancer (ALB). Sugerimos revisar e seguir as (Identity Access Management).
  3. Conhecimento do serviço AWS WAF.
  4. Uso de listas de controle de acesso (ACLs), regras e grupos de regras do AWS WAF

Importante: Os modelos do AWS CloudFormation que consideraremos para este blog devem ser utilizados na região do Oregon (us-west-2).

  

A) Criando o ambiente

Implantaremos o seguinte modelo que criará os recursos básicos com os quais trabalharemos. Embora esse modelo utilize alguns recursos básicos, o AWS WAF também pode ajudá-lo a proteger outros recursos, como: distribuições do Amazon Cloudfront, Application Load Balancers, APIs gerenciadas pelo Amazon API Gateway ou AWS Appsync.

 

  1. Clique no botão ao lado:

Isto te levará automaticamente para a console da AWS para executar o modelo do AWS CloudFormation. Conforme mostrado na imagem a seguir, deixe os valores padrão e clique em Próximo.

  1. Caso queira, o nome da pilha que será criada pode ser alterado por conveniência. Os seguintes parâmetros são mostrados na pilha: CountryCodeForRateRule, CreateWAFRules y LatestAMIId. Se você não quiser seguir o passo a passo manualmente para a configuração no AWS WAF, você pode escolher Yes como o valor do parâmetro CreateWAFRules. Se você fizer isso, pule para a seção D (Simulação de Requisições), pois a configuração do Bot Control será feita automaticamente, caso contrário, deixe o valor padrão No. O que cada parâmetro se refere está detalhado abaixo:
    • CreateWAFRules: Parâmetro que indica se o usuário deseja ou não criar as regras automaticamente.
    • CountryCodeForRateRule: Parâmetro que indica o país, mediante a um CountryCode (consulte aqui as opções de CountryCodes), que será considerado para a criação de uma regra associada as requisições Curl que utilizaremos mais a diante. O objetivo dessa regra será permitir requisições, desde que o limite indicado na regra rate-block-non-browser-user-agent (que será descrita posteriormente) não seja excedido. Esse parâmetro só será necessário se, para o parâmetro CreateWAFRules, escolhermos Yes como o valor.
    • LatestAMIId: Parâmetro pré-carregado da AMI (Amazon Machine Image) a ser utilizada. Deixe o valor que aparece por padrão.

 

  1. Na seção Configurar opções da pilha, deixe os valores padrão e clique em Próximo e, em seguida, no resumo da criação, uma nota com uma caixa de seleção será exibida na parte inferior: Entendo que o AWS CloudFormation pode criar recursos do IAM, você deve selecionar e clicar em Criar Pilha. (Essa caixa também deve ser marcada ao implantar o segundo modelo que veremos mais a frente).

 

Nota: Uma vez criada a pilha, tome nota do valor informado para LoadBalancerUrl conforme destacado na imagem a seguir.

 

B) Configuração inicial do Bot Control

Abaixo estão as etapas para usar o Controle de bots.

  1. Acesse a console do AWS WAF & Shield, e dentro da guia Web ACLs, selecione a região onde a ACL será criada, Oregon no nosso caso. Em seguida, clique em Create Web ACL:

 

  1. Crie uma Access List atribuindo um nome representativo. A descrição é opcional. Selecione o tipo de recurso Regional resources (Application Load Balancer, API Gateway, AWS AppSync, Amazon Cognito User Pools. Na seção Associated AWS resources – optional, clique em Add AWS resources e adicione o ALB criado pelo modelo do AWS CloudFormation implantado anteriormente. Depois disso, clique em Next:

  1. Na seção Add rules and rule groups, adicione um grupo de regras gerenciadas, clicando em Add rules e em seguida Add managed rule groups. Dentro desse grupo de regras gerenciadas, você pode ver as regras gerenciadas oferecidas por diferentes provedores, incluindo a AWS.

  1. Na seção Paid rule groups dentro de AWS Managed Rule Groups, ative o Bot Control (na seção de ação onde diz Add to web ACL). Em seguida, clique em Editar e habilite Set all rule actions to count, clique em Save Rule e clique no botão Add Rules. Lembre-se de que esses grupos de regras, como o nome indica, têm um custo adicional. .

Em um ambiente produtivo é recomendável contar as requisições antes do bloqueio afim de avaliar o funcionamento correto das regras (consulte Ação de regra do AWS WAF e Configuração do controle de bots).

Com essa configuração, serão obtidas métricas sobre as requisições de bots que foram selecionados acima, no entanto, o bloqueio não será realizado automaticamente. Para bloquear, as regras devem ser configuradas na Web ACL que correspondam às tags das categorias de bots que o Bot Control identificará no tráfego.

 

 

  1. Depois de adicionar essa regra, você deve clicar em Next e, nas próximas etapas (Set rule priority, Configure metrics e Review e create web ACL), deixe as configurações padrão e ao final clique em Create web ACL.

 

C) Configurando regras no WAF

  1. Na guia de Rules, crie uma nova regra clicando no botão Add rules e em seguida em Add my own rules and rule groups.

 

  1. Na seção Rule Type, selecionamos Rule builder. Por padrão, existe o editor visual, mas, se necessário, você pode usar o editor JSON (por exemplo, para adicionar uma política que escrevemos manualmente).

 

Na seção If a request, temos as seguintes opções:

  1. Corresponde à declaração (statement)
  2. Corresponde a todas as declarações (AND)
  3. Corresponde a pelo menos uma das declarações (OR)
  4. Não corresponde à declaração

 

Para levar em conta as descobertas dos bots, usaremos em Inspect a propriedade Has a label, que nos permite reconhecer o bot de acordo com a categorização de etiquetas predeterminadas do Bot Control.

 

  1. Em seguida, criaremos quatro regras do AWS WAF. Recomendamos usar os mesmos nomes descritos abaixo) para testar o bloqueio ou a permissão de tráfego associado a possíveis bots:

 

  1. rate-block-not-browser-user-agent: Bloquear o tráfego de um IP quando um número de requisições correspondente for atingido (100), considerando que essas requisições não vêm de um navegador (consulte Rate-based rule statement para mais informações).
  2. count-python-requests: Contar o número de requisições provenientes de um aplicativo que usa Python (especificamente a biblioteca Python Requests).
  3. allow-country-curl-requests: Permitir requisições via Curl de um país específico (aquele selecionado nos parâmetros do modelo ou configurado manualmente).
  4. block-known-data-centers-bot-and-non-browser-agent: Bloquear requisições não oriundas de um navegador ou datacenter conhecido.

 

Para ilustrar, mostramos como seria a configuração de cada uma das regras mencionadas acima.

Depois de configurar cada regra, clique em Save Rule e em seguida Set rule priority (onde você pode definir a ordem das regras na filtragem), clique em Save.

Regra 1 – rate-block-non-browser-user-agent:

 

Regra 2 – count-python-requests:

 

Regra 3 – allow-country-curl-requests:

 

Regra 4: block-known-data-centers-bot-and-non-browser-agent:

 

 

Depois de criar essas regras, teremos o seguinte:

As regras devem seguir a ordem descrita anteriormente, caso não estejam conforme imagem acima, podemos editar tal ordem editando a regra, clicando em Save Rule e alterando a prioridade da regra na seção Set rule priority.

Veja a seguir o processo de filtragem de tráfego com base nas regras configuradas e em sua ordem:

 

Nota: Você também pode colocar a opção de CAPTCHA considerando outros casos de uso nos quais é necessário incluir um enigma a ser resolvido se a regra for atendida. Veja a seguir um exemplo da configuração da regra e da aparência do CAPTCHA:

Depois de configurar as regras do AWS WAF, nossa arquitetura ficaria assim:

Em seguida, e com base nos recursos que criaremos por meio de outro modelo do AWS CloudFormation, será feita uma simulação de um ataque ao nosso ambiente por um bot.

 

D) Simulação de requisições

As instruções para implantar os recursos são as seguintes:

 

1. Clique no botão desdobrar:

Isso o levará automaticamente a console da AWS para executar o modelo do AWS CloudFormation, semelhante ao realizado anteriormente. Clique em Próximo (Next).

2. Caso queira, o nome da pilha que será criada pode ser alterado por conveniência. É possível configurar requisições Python, Curl ou ambos os tipos. Você deve selecionar pelo menos uma opção, ou seja, definir ao menos um dos parâmetros PythonRequests ou CurlRequests como Yes e atribuir os respectivos valores aos parâmetros de requisição. Cada tipo de requisição é composto por:

  • NumberXRequests: Quantidade de requisições a
  • LambdaInvokesX: número de execuções da função do AWS Lambda responsável por fazer as requisições. Ex: podemos ter 20 requisições por invocação e invocarmos a função Lambda 3 vezes, o que significaria 60 requisições no total.
  • TimeBetweenXRequests: Período de tempo entre as solicitações.

 

Aviso: Lembre-se de que, se você selecionar valores altos para esses 3 parâmetros, o tempo de execução e geração das requisições aumentará consideravelmente, o que pode gerar custos imprevistos.

  1. Insira a URL do Application Load Balancer que você obteve como Saída (Output) do AWS CloudFormation implantado anteriormente no parâmetro LoadBalancerURL e não modifique o valor do LayerARN. Clique em Próximo.

Abaixo está uma prévia da pilha (você pode alterar os valores numéricos dos parâmetros Curl e Python):

 

  1. Na seção Configurar opções de pilha, clique em Próximoo resumo da criação, clique em Criar pilha. Dependendo do número de solicitações a serem feitas pela máquina de estados (AWS StepFunctions), o tempo de execução pode variar.

Os recursos para simular o ataque incluem uma máquina de estados e funções do AWS Lambda que são representadas da seguinte forma:

 

Visão geral da arquitetura:

Nesse caso, a arquitetura implantada a partir da primeira pilha (stack do CloudFormation) receberá requisições dos recursos criados pela segunda pilha (funções do AWS Lambda orquestradas pela máquina de estados), simulando um bot tentando realizar um scraping (extração de dados) em nosso site.

Alguns minutos depois de executar nossa segunda pilha, você poderá começar a visualizar as métricas de simulação de ataque (tanto na guia Overview quanto na guia Bot Control da Web ACL). Aqui estão alguns exemplos:

 

Nesta imagem, podemos ver a comparação entre requisições de bots identificadas pela funcionalidade Bot Control (99,4%) e tráfego legítimo (0,61%). Também podemos observar o número de bots bloqueados e permitidos (dependendo da configuração feita)

Nesta seção, podemos ver na parte superior, as categorias de bots identificadas ao longo do tempo. Na parte inferior, você pode selecionar um tipo de atividade associada a bots e visualizar essa atividade específica ao longo do tempo (neste caso, Curl).

Nesta seção (Sampled requests en Overview), podemos ver uma amostra das requisições que atenderam às condições da regra chamada block-known-data-centers-bot-and-non-browser-agent.  Nesse caso, também mostra o país de origem e o IP de onde as requisições são provenientes, bem como a rota (URI) para qual a requisição se dirigia.

Apagando os recursos

Para evitar cobranças futuras, lembre-se de excluir as pilhas dos recursos criados:

  1. Simulação de requisições — Pilha 2 (Modelo 2)
  2. Criando o ambiente — Pilha 1 (Modelo 1)

Próximos passos

Depois de fazer a configuração acima, você pôde experimentar o uso dos recursos de Bot Control para ter visibilidade detalhada em tempo real das categorias de bots, identidades e outros detalhes do tráfego associado aos seus aplicativos; além de ter a capacidade de bloquear tráfego arriscado ou indesejado com regras personalizadas do AWS WAF.

Para uma exploração completa de cada uma das regras configuradas, sugerimos provar fazendo acessos na aplicação de maneira legítima (a partir de um navegador), Curl Requests (considerando o país que você colocou nos parâmetros do modelo), Python Requests e realizar diferentes números de requisições, para observar no painel de controle (dashboard) o bloqueio por limite (rate limit) e as diferentes métricas do AWS WAF.

Além disso, convidamos você a revisar também o seguinte blog: Fine-tune and optimize AWS WAF Bot Control mitigation capability, que fornece recomendações para ajuste fino do uso do Bot Control em vosso ambiente.

 

Conclusão

Uma vez realizada a simulação, pudemos observar que o tráfego de bots é bloqueado de maneira adequada (para nosso exemplo). Se você quiser experimentar com outros parâmetros dos recursos criados com as pilhas do AWS CloudFormation, pode-se acessar cada serviço individualmente (AWS StepFunctions, AWS Lambda etc.) afim de ajustar de acordo com sua necessidade e assim realizar outros tipos de testes.

Embora este blog corresponda a um exemplo de exercício e nas métricas se evidencie um resultado limitado às nossas requisições (as quais estão sendo bloqueadas ou permitidas), deve-se observar que, em contextos de negócios reais, haverá níveis mais altos de tráfego nos quais poderemos ver com mais detalhes como seria feito o tratamento de requisições com base nas regras de AWS WAF e Bot Control. Também vale a pena mencionar que, se você não excluir os recursos implantados pelas pilhas do AWS CloudFormation, eles gerarão custos; no entanto, durante esse período, você poderá visualizar diferentes solicitações provenientes do tráfego da Internet.

 


Sobre el autor

Mayerli Romero é arquiteta de soluções na AWS Colômbia. Focada nas verticais de varejo e bens de consumo, com interesse especial em temas de experiência do cliente, especificamente Amazon Connect e Machine Learning. Apaixonada por natação e tartarugas.

Anteriormente, trabalhou nas indústrias bancária, de hidrocarbonetos e de educação.

 

 

 

 

Marco Sáenz é arquiteto de soluções na AWS Colômbia. Em sua função atual, ajuda os clientes de pequeno e médio porte em sua jornada na nuvem. É apaixonado por segurança e pelo mundo gaming. Anteriormente, trabalhou como desenvolvedor de software.