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
- Qual é a diferença entre stateful e stateless?
- Por que é necessário configurar as portas efêmeras na NACL?
- Como permitir que um servidor app acesse um banco de dados via SG?
- Em que ordem as regras da NACL são avaliadas?
- Qual firewall usar para bloquear um IP malicioso?
Próxima seção: Depuração de Rede