Pular para o conteúdo principal

Security Groups vs NACL

Introdução​

A AWS oferece dois níveis de firewall para proteger seus recursos:

  • Security Groups: no nível da instância
  • NACL (Network ACL): no nível do subnet
┌─────────────────────────────────────────────────────────────┐
│ DOIS NÍVEIS DE SEGURANÇA │
├─────────────────────────────────────────────────────────────┤
│ │
│ INTERNET │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ SUBNET │ │
│ │ ┌────────────────────────────────────────────────┐ │ │
│ │ │ NACL (1º nível) │ │ │
│ │ │ Filtra TODO o tráfego de entrada/saída │ │ │
│ │ │ do subnet │ │ │
│ │ └───────────────────┬────────────────────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌────────────────────────────────────────────────┐ │ │
│ │ │ INSTÂNCIA EC2 │ │ │
│ │ │ ┌──────────────────────────────────────────┐ │ │ │
│ │ │ │ SECURITY GROUP (2º nível) │ │ │ │
│ │ │ │ Filtra o tráfego para/de instância │ │ │ │
│ │ │ └──────────────────────────────────────────┘ │ │ │
│ │ │ │ │ │ │
│ │ │ ┌─────▼─────┐ │ │ │
│ │ │ │ Aplicação │ │ │ │
│ │ │ └───────────┘ │ │ │
│ │ └────────────────────────────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

Security Groups​

Características​

┌─────────────────────────────────────────────────────────────┐
│ SECURITY GROUPS │
├─────────────────────────────────────────────────────────────┤
│ │
│ TIPO : Firewall STATEFUL (com estado) │
│ │
│ Stateful significa: │
│ • Se o tráfego de entrada é permitido │
│ • Então a resposta de saída é automaticamente permitida │
│ • Não precisa de regra explícita para a resposta │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Cliente ──── Requisição ────► Instância │ │
│ │ (permitido por regra inbound) │ │
│ │ │ │
│ │ Cliente ◄─── Resposta ──── Instância │ │
│ │ (automaticamente permitido - stateful) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ FUNCIONAMENTO │
│ • Padrão: TUDO bloqueado na entrada │
│ • Padrão: TUDO permitido na saída │
│ • Apenas regras ALLOW (não há DENY) │
│ • Todas as regras avaliadas em conjunto (sem ordem) │
│ │
└─────────────────────────────────────────────────────────────┘

Anatomia de uma Regra SG​

┌─────────────────────────────────────────────────────────────┐
│ REGRA SECURITY GROUP │
├─────────────────────────────────────────────────────────────┤
│ │
│ Tipo : SSH │
│ Protocolo : TCP │
│ Faixa Portas : 22 │
│ Origem : 203.0.113.0/24 │
│ Descrição : Acesso admin do escritório │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ SIGNIFICADO: │ │
│ │ │ │
│ │ "Permitir tráfego TCP na porta 22 (SSH) │ │
│ │ vindo dos IPs 203.0.113.0 a 203.0.113.255" │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ORIGENS POSSÍVEIS: │
│ • IP único : 203.0.113.45/32 │
│ • Faixa CIDR : 203.0.113.0/24 │
│ • Outro SG : sg-0123456789 │
│ • Prefix List : pl-xxx │
│ • Em todo lugar : 0.0.0.0/0 (⚠️ atenção!) │
│ │
└─────────────────────────────────────────────────────────────┘

Exemplos de Security Groups​

┌─────────────────────────────────────────────────────────────┐
│ SECURITY GROUP - SERVIDOR WEB │
├─────────────────────────────────────────────────────────────┤
│ │
│ Nome : sg-web-server │
│ │
│ REGRAS DE ENTRADA (Inbound) │
│ ┌───────┬──────────┬───────┬─────────────────────────┐ │
│ │ Tipo │ Protocolo│ Porta │ Origem │ │
│ ├───────┼──────────┼───────┼─────────────────────────┤ │
│ │ HTTP │ TCP │ 80 │ 0.0.0.0/0 │ │
│ │ HTTPS │ TCP │ 443 │ 0.0.0.0/0 │ │
│ │ SSH │ TCP │ 22 │ 10.0.0.0/16 (VPC only) │ │
│ └───────┴──────────┴───────┴─────────────────────────┘ │
│ │
│ REGRAS DE SAÍDA (Outbound) │
│ ┌───────┬──────────┬───────┬─────────────────────────┐ │
│ │ Tipo │ Protocolo│ Porta │ Destino │ │
│ ├───────┼──────────┼───────┼─────────────────────────┤ │
│ │ All │ All │ All │ 0.0.0.0/0 │ │
│ └───────┴──────────┴───────┴─────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│ SECURITY GROUP - BANCO DE DADOS │
├─────────────────────────────────────────────────────────────┤
│ │
│ Nome : sg-database │
│ │
│ REGRAS DE ENTRADA (Inbound) │
│ ┌────────┬──────────┬───────┬────────────────────────┐ │
│ │ Tipo │ Protocolo│ Porta │ Origem │ │
│ ├────────┼──────────┼───────┼────────────────────────┤ │
│ │ MySQL │ TCP │ 3306 │ sg-web-server ✓ │ │
│ │ MySQL │ TCP │ 3306 │ sg-app-server ✓ │ │
│ └────────┴──────────┴───────┴────────────────────────┘ │
│ │
│ ✓ Referenciar outro SG = boa prática │
│ Apenas instâncias neste SG podem acessar │
│ │
│ REGRAS DE SAÍDA (Outbound) │
│ ┌───────┬──────────┬───────┬─────────────────────────┐ │
│ │ Tipo │ Protocolo│ Porta │ Destino │ │
│ ├───────┼──────────┼───────┼─────────────────────────┤ │
│ │ All │ All │ All │ 0.0.0.0/0 │ │
│ └───────┴──────────┴───────┴─────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

Network ACL (NACL)​

Características​

┌─────────────────────────────────────────────────────────────┐
│ NETWORK ACL (NACL) │
├─────────────────────────────────────────────────────────────┤
│ │
│ TIPO : Firewall STATELESS (sem estado) │
│ │
│ Stateless significa: │
│ • Cada direção deve ser explicitamente permitida │
│ • Se entrada é permitida, saída também deve ser configurada │
│ • Regras separadas para inbound E outbound │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Cliente ──── Requisição ────► Subnet │ │
│ │ (precisa de regra inbound) │ │
│ │ │ │
│ │ Cliente ◄─── Resposta ──── Subnet │ │
│ │ (precisa de regra outbound separada!) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ FUNCIONAMENTO │
│ • Padrão: TUDO permitido (NACL padrão) │
│ • Regras ALLOW e DENY │
│ • Avaliadas na ORDEM dos números (prioridade) │
│ • Primeira regra que casar = decisão final │
│ • Aplica-se a TODO o subnet │
│ │
└─────────────────────────────────────────────────────────────┘

Anatomia de uma Regra NACL​

┌─────────────────────────────────────────────────────────────┐
│ REGRA NACL │
├─────────────────────────────────────────────────────────────┤
│ │
│ Número da Regra : 100 │
│ Tipo : HTTP (80) │
│ Protocolo : TCP (6) │
│ Faixa Portas : 80 │
│ Origem : 0.0.0.0/0 │
│ Allow/Deny : ALLOW │
│ │
│ ORDEM DE AVALIAÇÃO: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Regra 100: ALLOW HTTP de 0.0.0.0/0 │ │
│ │ Regra 200: DENY HTTP de 192.168.1.0/24 │ │
│ │ Regra * : DENY ALL │ │
│ │ │ │
│ │ Pacote HTTP de 192.168.1.50? │ │
│ │ → Avaliado pela Regra 100 primeiro │ │
│ │ → 192.168.1.50 casa com 0.0.0.0/0 │ │
│ │ → ALLOW! (Regra 200 nunca é avaliada) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ⚠️ A ordem das regras é CRÍTICA em NACL │
│ │
└─────────────────────────────────────────────────────────────┘

Portas Efêmeras​

┌─────────────────────────────────────────────────────────────┐
│ PORTAS EFÊMERAS (Importante para NACL) │
├─────────────────────────────────────────────────────────────┤
│ │
│ Problema NACL: Como permitir as respostas? │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Cliente (porta 54321) ──HTTP:80──► Servidor │ │
│ │ Cliente (porta 54321) ◄──TCP:54321── Servidor │ │
│ │ │ │
│ │ O servidor responde na PORTA DE ORIGEM do cliente │ │
│ │ Essa porta é "efêmera" (aleatória, temporária) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ FAIXAS DE PORTAS EFÊMERAS: │
│ • Linux : 32768 - 60999 │
│ • Windows : 49152 - 65535 │
│ • NAT Gateway : 1024 - 65535 │
│ │
│ SOLUÇÃO: Permitir as portas efêmeras em outbound │
│ │
│ NACL Outbound Rule: │
│ Regra 100: ALLOW TCP 1024-65535 para 0.0.0.0/0 │
│ │
└─────────────────────────────────────────────────────────────┘

Comparação SG vs NACL​

┌─────────────────────────────────────────────────────────────┐
│ SECURITY GROUP vs NACL │
├─────────────────────────────────────────────────────────────┤
│ │
│ Característica │ Security Group │ NACL │
│ ────────────────────┼─────────────────┼───────────────────│
│ Nível │ Instância │ Subnet │
│ Tipo │ Stateful │ Stateless │
│ Regras │ ALLOW only │ ALLOW & DENY │
│ Avaliação │ Todas juntas │ Por ordem │
│ Portas efêmeras │ Automático │ Manual │
│ Padrão │ Deny in/Allow out│ Allow all │
│ Modificável a quente│ Sim │ Sim │
│ │
│ QUANDO USAR O QUÊ? │
│ ──────────────────── │
│ │
│ Security Group: │
│ ✅ Principal caso de uso │
│ ✅ Controle por aplicação/função │
│ ✅ Mais fácil de gerenciar │
│ │
│ NACL: │
│ ✅ Bloquear IPs maliciosos (regra DENY) │
│ ✅ Linha de defesa adicional │
│ ✅ Conformidade (defense in depth) │
│ │
└─────────────────────────────────────────────────────────────┘

Exemplos Práticos​

Criar um Security Group (CLI)​

# Criar o Security Group
aws ec2 create-security-group \
--group-name sg-web-server \
--description "Security group for web servers" \
--vpc-id vpc-xxx

# Adicionar regra HTTP
aws ec2 authorize-security-group-ingress \
--group-id sg-xxx \
--protocol tcp \
--port 80 \
--cidr 0.0.0.0/0

# Adicionar regra SSH (restritiva)
aws ec2 authorize-security-group-ingress \
--group-id sg-xxx \
--protocol tcp \
--port 22 \
--cidr 10.0.0.0/16

# Permitir de outro SG
aws ec2 authorize-security-group-ingress \
--group-id sg-database \
--protocol tcp \
--port 3306 \
--source-group sg-web-server

Criar uma NACL (CLI)​

# Criar a NACL
aws ec2 create-network-acl \
--vpc-id vpc-xxx \
--tag-specifications 'ResourceType=network-acl,Tags=[{Key=Name,Value=nacl-public}]'

# Adicionar regra inbound HTTP
aws ec2 create-network-acl-entry \
--network-acl-id acl-xxx \
--rule-number 100 \
--protocol tcp \
--port-range From=80,To=80 \
--cidr-block 0.0.0.0/0 \
--rule-action allow \
--ingress

# Adicionar regra outbound para respostas (portas efêmeras)
aws ec2 create-network-acl-entry \
--network-acl-id acl-xxx \
--rule-number 100 \
--protocol tcp \
--port-range From=1024,To=65535 \
--cidr-block 0.0.0.0/0 \
--rule-action allow \
--egress

Boas Práticas​

┌─────────────────────────────────────────────────────────────┐
│ BOAS PRÁTICAS DE SEGURANÇA │
├─────────────────────────────────────────────────────────────┤
│ │
│ SECURITY GROUPS │
│ ✅ Princípio do menor privilégio │
│ ✅ Um SG por função/papel │
│ ✅ Referenciar SGs entre si (não IPs) │
│ ✅ Evitar 0.0.0.0/0 para SSH/RDP │
│ ✅ Documentar cada regra (Descrição) │
│ │
│ NACL │
│ ✅ Manter a NACL padrão (Allow all) │
│ ✅ Usar NACL para bloquear IPs maliciosos │
│ ✅ Espaçar os números das regras (100, 200, 300...) │
│ ✅ Não esquecer das portas efêmeras │
│ │
│ ⚠️ ERROS COMUNS │
│ ❌ SSH aberto para 0.0.0.0/0 │
│ ❌ Todos os ports abertos "para testar" │
│ ❌ Esquecer regras outbound na NACL │
│ ❌ Regras muito permissivas em produção │
│ │
└─────────────────────────────────────────────────────────────┘

Quiz de Validação​

  1. Qual é a diferença entre stateful e stateless?
  2. Por que é necessário configurar as portas efêmeras na NACL?
  3. Como permitir que um servidor app acesse um banco de dados via SG?
  4. Em que ordem as regras da NACL são avaliadas?
  5. Qual firewall usar para bloquear um IP malicioso?

Próxima seção: Depuração de Rede