Cloud & Infraestrutura

Boas Práticas de AWS WAF e Shield: Proteção contra DDoS e Ataques Web para Times Ágeis

9 min de leitura

Boas Práticas de AWS WAF e Shield: Proteção contra DDoS e Ataques Web para Times Ágeis

Fundamentos de AWS WAF e Shield para Proteção Web AWS WAF (Web Application Firewall) e AWS Shield são serviços complementares que formam a primeira linha de defesa contra ataques na camada de aplicação e camada de rede. Shield oferece proteção automática contra ataques DDoS de camada 3 e 4, enquanto WAF fornece controle granular sobre requisições HTTP/HTTPS, permitindo bloquear padrões maliciosos específicos. Para times ágeis, compreender essa distinção é crítico: Shield Standard (gratuito) já protege sua infraestrutura automaticamente, mas Shield Advanced adiciona proteção contra ataques sofisticados e oferece suporte 24/7 do DDoS Response Team. WAF, por sua vez, requer configuração ativa e é onde sua inteligência tática entra. O verdadeiro poder emerge quando você integra essas ferramentas ao pipeline de CI/CD. A maioria dos times ágeis falha aqui: criam regras WAF estáticas que nunca mudam. O correto é versionar suas regras WAF como código, testar em staging e promover para produção via Infrastructure as Code (IaC), permitindo rollback rápido em

<h2>Fundamentos de AWS WAF e Shield para Proteção Web</h2>

<p>AWS WAF (Web Application Firewall) e AWS Shield são serviços complementares que formam a primeira linha de defesa contra ataques na camada de aplicação e camada de rede. Shield oferece proteção automática contra ataques DDoS de camada 3 e 4, enquanto WAF fornece controle granular sobre requisições HTTP/HTTPS, permitindo bloquear padrões maliciosos específicos. Para times ágeis, compreender essa distinção é crítico: Shield Standard (gratuito) já protege sua infraestrutura automaticamente, mas Shield Advanced adiciona proteção contra ataques sofisticados e oferece suporte 24/7 do DDoS Response Team. WAF, por sua vez, requer configuração ativa e é onde sua inteligência tática entra.</p>

<p>O verdadeiro poder emerge quando você integra essas ferramentas ao pipeline de CI/CD. A maioria dos times ágeis falha aqui: criam regras WAF estáticas que nunca mudam. O correto é versionar suas regras WAF como código, testar em staging e promover para produção via Infrastructure as Code (IaC), permitindo rollback rápido em caso de falsos positivos.</p>

<h2>Configuração Prática de WAF com Terraform</h2>

<p>Vamos começar com um exemplo real. Aqui está uma configuração Terraform que implementa WAF com regras essenciais:</p>

<pre><code class="language-hcl">resource &quot;aws_wafv2_web_acl&quot; &quot;main&quot; {

name = &quot;web-acl-production&quot;

scope = &quot;CLOUDFRONT&quot;

default_action {

allow {}

}

rule {

name = &quot;AWSManagedRulesCommonRuleSet&quot;

priority = 0

action {

block {}

}

statement {

managed_rule_group_statement {

name = &quot;AWSManagedRulesCommonRuleSet&quot;

vendor_name = &quot;AWS&quot;

rule_action_override {

name = &quot;SizeRestrictions_BODY&quot;

action_to_use {

block {}

}

}

}

}

visibility_config {

cloudwatch_metrics_enabled = true

metric_name = &quot;AWSManagedRulesCommonRuleSetMetric&quot;

sampled_requests_enabled = true

}

}

rule {

name = &quot;RateLimitRule&quot;

priority = 1

action {

block {}

}

statement {

rate_based_statement {

limit = 2000

aggregate_key_type = &quot;IP&quot;

}

}

visibility_config {

cloudwatch_metrics_enabled = true

metric_name = &quot;RateLimitRuleMetric&quot;

sampled_requests_enabled = true

}

}

visibility_config {

cloudwatch_metrics_enabled = true

metric_name = &quot;WebACLMetric&quot;

sampled_requests_enabled = true

}

}

resource &quot;aws_cloudfront_distribution&quot; &quot;cdn&quot; {

enabled = true

web_acl_id = aws_wafv2_web_acl.main.arn

origin {

domain_name = aws_lb.main.dns_name

origin_id = &quot;alb&quot;

custom_origin_config {

http_port = 80

https_port = 443

origin_protocol_policy = &quot;https-only&quot;

}

}

default_cache_behavior {

allowed_methods = [&quot;DELETE&quot;, &quot;GET&quot;, &quot;HEAD&quot;, &quot;OPTIONS&quot;, &quot;PATCH&quot;, &quot;POST&quot;, &quot;PUT&quot;]

cached_methods = [&quot;GET&quot;, &quot;HEAD&quot;]

target_origin_id = &quot;alb&quot;

forwarded_values {

query_string = true

headers {

header_names = [&quot;Authorization&quot;, &quot;CloudFront-Viewer-Country&quot;]

}

cookies {

forward = &quot;all&quot;

}

}

viewer_protocol_policy = &quot;redirect-to-https&quot;

min_ttl = 0

default_ttl = 3600

max_ttl = 86400

}

restrictions {

geo_restriction {

restriction_type = &quot;none&quot;

}

}

viewer_certificate {

cloudfront_default_certificate = true

}

}</code></pre>

<p>Este exemplo implementa duas camadas: regras gerenciadas da AWS (que protegem contra vulnerabilidades comuns como SQL injection e XSS) e uma regra de rate limiting (máximo 2000 requisições por 5 minutos por IP). O CloudWatch Metrics integrado permite monitorar tentativas bloqueadas em tempo real.</p>

<h3>Personalização de Regras para Seu Caso de Uso</h3>

<p>Após o baseline, adicione regras específicas. Se sua API aceita JSON com campos de tamanho limitado, configure <code>SizeRestrictions_BODY</code>. Se você integra com serviços de terceiros por IP fixo, crie uma whitelist:</p>

<pre><code class="language-hcl">rule {

name = &quot;WhitelistTrustedPartners&quot;

priority = 0

action {

allow {}

}

statement {

ip_set_reference_statement {

arn = aws_wafv2_ip_set.trusted_partners.arn

}

}

visibility_config {

cloudwatch_metrics_enabled = true

metric_name = &quot;WhitelistMetric&quot;

sampled_requests_enabled = false

}

}

resource &quot;aws_wafv2_ip_set&quot; &quot;trusted_partners&quot; {

name = &quot;trusted-partner-ips&quot;

scope = &quot;CLOUDFRONT&quot;

ip_address_version = &quot;IPV4&quot;

addresses = [&quot;203.0.113.0/24&quot;, &quot;198.51.100.0/24&quot;]

}</code></pre>

<h2>Monitoramento e Resposta a Incidentes</h2>

<p>Configurar WAF sem observabilidade é como ter airbag sem velocímetro. Integre CloudWatch Logs com análise em tempo real:</p>

<pre><code class="language-python">import boto3

import json

from datetime import datetime, timedelta

cloudwatch = boto3.client(&#039;logs&#039;)

sns = boto3.client(&#039;sns&#039;)

def analyze_waf_logs():

query = &quot;&quot;&quot;

fields @timestamp, action, httpRequest.clientIp, httpRequest.uri, rule

stats count() as block_count by httpRequest.clientIp, rule | sort block_count desc | limit 10

&quot;&quot;&quot;

response = cloudwatch.start_query(

logGroupName=&#039;/aws/wafv2/production&#039;,

startTime=int((datetime.now() - timedelta(hours=1)).timestamp()),

endTime=int(datetime.now().timestamp()),

queryString=query

)

query_id = response[&#039;queryId&#039;]

Aguardar conclusão

while True:

result = cloudwatch.get_query_results(queryId=query_id)

if result[&#039;status&#039;] == &#039;Complete&#039;:

break

Alertar se IPs maliciosos são identificados

for record in result[&#039;results&#039;]:

block_count = int([r[&#039;value&#039;] for r in record if r[&#039;field&#039;] == &#039;block_count&#039;][0])

if block_count &gt; 100:

sns.publish(

TopicArn=&#039;arn:aws:sns:us-east-1:123456789:waf-alerts&#039;,

Subject=&#039;WAF: Bloqueio em alta quantidade detectado&#039;,

Message=json.dumps(record, indent=2)

)

if __name__ == &#039;__main__&#039;:

analyze_waf_logs()</code></pre>

<p>Este script executa em uma Lambda agendada (CloudWatch Events) a cada hora, identifica padrões de ataque e envia alertas SNS para seu time. Integre isso com seu Slack para notificações imediatas, permitindo ação rápida em caso de falso positivo (ajuste da whitelist).</p>

<h3>Shield Advanced para Camadas Mais Profundas</h3>

<p>Shield Advanced ($3.000/mês) justifica-se apenas se você processa volumes alta de tráfego ou é alvo frequente. O real diferencial é o DDoS Response Team (DRT), que analisa seus logs e recommenda regras WAF personalizadas. Para times ágeis começando, comece com Shield Standard + WAF Standard e upgrade conforme necessário.</p>

<h2>Integração com Pipeline CI/CD</h2>

<p>Regras WAF devem ser testadas antes de produção. Aqui está como integrar com GitLab CI:</p>

<pre><code class="language-yaml">stages:

  • validate
  • test
  • deploy

validate_waf_rules:

stage: validate

image: hashicorp/terraform:latest

script:

  • terraform init
  • terraform validate
  • terraform plan -out=tfplan

test_waf_rules:

stage: test

image: python:3.9

script:

  • pip install boto3
  • python test_waf_rules.py

only:

  • merge_requests

deploy_waf:

stage: deploy

image: hashicorp/terraform:latest

script:

  • terraform apply tfplan

only:

  • main

environment:

name: production</code></pre>

<p>E o teste de segurança (<code>test_waf_rules.py</code>):</p>

<pre><code class="language-python">import boto3

import pytest

waf_client = boto3.client(&#039;wafv2&#039;)

def test_rate_limit_rule_exists():

acl = waf_client.get_web_acl(Name=&#039;web-acl-production&#039;, Scope=&#039;CLOUDFRONT&#039;)

rule_names = [r[&#039;Name&#039;] for r in acl[&#039;WebACL&#039;][&#039;Rules&#039;]]

assert &#039;RateLimitRule&#039; in rule_names

def test_no_allow_all_rules():

acl = waf_client.get_web_acl(Name=&#039;web-acl-production&#039;, Scope=&#039;CLOUDFRONT&#039;)

for rule in acl[&#039;WebACL&#039;][&#039;Rules&#039;]:

assert rule[&#039;Action&#039;][&#039;Type&#039;] != &#039;ALLOW&#039; or &#039;whitelist&#039; in rule[&#039;Name&#039;].lower()

if __name__ == &#039;__main__&#039;:

pytest.main([__file__, &#039;-v&#039;])</code></pre>

<h2>Conclusão</h2>

<p>Três pontos essenciais aprendidos: <strong>Primeiro</strong>, WAF e Shield são complementares mas não redundantes — Shield protege infraestrutura, WAF protege aplicação. Implemente ambos. <strong>Segundo</strong>, regras WAF devem ser versionadas, testadas e auditadas como código, não configuradas manualmente no console. <strong>Terceiro</strong>, observabilidade não é opcional — sem monitoramento contínuo, você não saberá se está bloqueando ataques reais ou afastando clientes legítimos. Comece simples com regras gerenciadas AWS, adicione rate limiting e personalize com whitelists. Evoluir é mais seguro que começar perfeito.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://docs.aws.amazon.com/waf/" target="_blank" rel="noopener noreferrer">AWS WAF Documentation</a></li>

<li><a href="https://aws.amazon.com/shield/ddos-protection-adavnced/" target="_blank" rel="noopener noreferrer">AWS Shield Advanced Overview</a></li>

<li><a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/wafv2_web_acl" target="_blank" rel="noopener noreferrer">Terraform AWS WAF Provider</a></li>

<li><a href="https://owasp.org/Top10/" target="_blank" rel="noopener noreferrer">OWASP Top 10 - Web Application Security</a></li>

<li><a href="https://github.com/aws-samples/aws-waf-security-automations" target="_blank" rel="noopener noreferrer">AWS WAF Security Automations</a></li>

</ul>

Comentários

Mais em Cloud & Infraestrutura

Boas Práticas de AppSync: GraphQL Gerenciado com Resolvers e Real-time para Times Ágeis
Boas Práticas de AppSync: GraphQL Gerenciado com Resolvers e Real-time para Times Ágeis

AppSync: Fundamentos e Arquitetura AWS AppSync é um serviço gerenciado que pe...

O que Todo Dev Deve Saber sobre Systems Manager: Parameter Store, Session Manager e Patch Manager
O que Todo Dev Deve Saber sobre Systems Manager: Parameter Store, Session Manager e Patch Manager

Systems Manager: Uma Visão Prática para Developers O AWS Systems Manager é um...

Dominando AWS Lambda: Fundamentos, Triggers e Execution Model em Projetos Reais
Dominando AWS Lambda: Fundamentos, Triggers e Execution Model em Projetos Reais

Fundamentos do AWS Lambda AWS Lambda é um serviço de computação sem servidor...