Security Groups
O que é um Security Group?
Um Security Group (SG) é um firewall virtual que controla o tráfego de entrada e saída das suas instâncias EC2. É a primeira linha de defesa para proteger seus recursos AWS.
┌─────────────────────────────────────────────────────────────┐
│ SECURITY GROUP │
├─────────────────────────────────────────────────────────────┤
│ │
│ Internet │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ SECURITY GROUP │ │
│ │ (Firewall no nível da instância) │ │
│ │ │ │
│ │ REGRAS DE ENTRADA (Inbound) │ │
│ │ ┌─────────────────────────────────────────┐ │ │
│ │ │ Porta 22 (SSH) ← Apenas Admin │ │ │
│ │ │ Porta 80 (HTTP) ← Todos │ │ │
│ │ │ Porta 443 (HTTPS) ← Todos │ │ │
│ │ └─────────────────────────────────────────┘ │ │
│ │ │ │
│ │ REGRAS DE SAÍDA (Outbound) │ │
│ │ ┌─────────────────────────────────────────┐ │ │
│ │ │ Todo o tráfego → Permitido por padrão │ │ │
│ │ └─────────────────────────────────────────┘ │ │
│ │ │ │
│ └──────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────┐ │
│ │ Instância EC2│ │
│ └───────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Características Principais
1. Stateful (Mantém Estado)
┌─────────────────────────────────────────────────────────────┐
│ STATEFUL │
├─────────────────────────────────────────────────────────────┤
│ │
│ Se uma conexão de ENTRADA é permitida, │
│ a resposta de SAÍDA é automaticamente permitida. │
│ │
│ Exemplo: │
│ ┌─────────┐ ┌─────────────┐ │
│ │ Cliente │ ──── Requisição HTTP ────►│ EC2 │ │
│ │ │ (Porta 80) │ (SG) │ │
│ │ │ ◄─── Resposta ──────── │ │ │
│ └─────────┘ (Automático) └─────────────┘ │
│ │
│ Você NÃO precisa criar uma regra de saída │
│ para a resposta! │
│ │
└─────────────────────────────────────────────────────────────┘
2. Negado por Padrão (Inbound)
Por padrão:
• INBOUND : Tudo é BLOQUEADO ❌
• OUTBOUND : Tudo é PERMITIDO ✅
Você deve autorizar explicitamente o tráfego de entrada.
3. Apenas Regras ALLOW
Security Groups = Apenas regras ALLOW
✅ Você PODE: Permitir SSH de 10.0.0.0/8
❌ Você NÃO PODE: Bloquear um IP específico
Para bloquear IPs → Use NACLs (nível VPC)
Estrutura de uma Regra
┌─────────────────────────────────────────────────────────────┐
│ ESTRUTURA DE UMA REGRA │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────┬───────────┬─────────────┬───────────────┐ │
│ │ Tipo │ Protocolo │ Porta │ Origem │ │
│ ├────────────┼───────────┼─────────────┼───────────────┤ │
│ │ SSH │ TCP │ 22 │ 203.0.113.0/24│ │
│ │ HTTP │ TCP │ 80 │ 0.0.0.0/0 │ │
│ │ HTTPS │ TCP │ 443 │ 0.0.0.0/0 │ │
│ │ Custom │ TCP │ 3306 │ sg-xxxxx │ │
│ │ All ICMP │ ICMP │ All │ 10.0.0.0/16 │ │
│ └────────────┴───────────┴─────────────┴───────────────┘ │
│ │
│ Origem pode ser: │
│ • CIDR: 0.0.0.0/0 (todos), 10.0.0.0/8 (privado) │
│ • Security Group: sg-xxxxxxxx │
│ • Prefix List: pl-xxxxxxxx │
│ │
└─────────────────────────────────────────────────────────────┘
Origens Comuns
Notação CIDR
┌─────────────────────────────────────────────────────────────┐
│ NOTAÇÃO CIDR │
├─────────────────────────────────────────────────────────────┤
│ │
│ 0.0.0.0/0 = Toda a Internet (CUIDADO!) │
│ ::/0 = Todo IPv6 │
│ │
│ 10.0.0.0/8 = Rede privada classe A │
│ 172.16.0.0/12 = Rede privada classe B │
│ 192.168.0.0/16 = Rede privada classe C │
│ │
│ 203.0.113.25/32 = Um único IP (seu escritório) │
│ 10.0.1.0/24 = 256 endereços (um subnet) │
│ │
│ O /XX indica quantos bits são fixos: │
│ /32 = 1 IP, /24 = 256 IPs, /16 = 65536 IPs, /0 = tudo │
│ │
└─────────────────────────────────────────────────────────────┘
Referenciar Outro Security Group
┌─────────────────────────────────────────────────────────────┐
│ REFERÊNCIA ENTRE SECURITY GROUPS │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ sg-web │ │ sg-database │ │
│ │ │ │ │ │
│ │ Inbound: │ │ Inbound: │ │
│ │ HTTP 80 0.0.0.0/0 │ MySQL 3306 │ │
│ │ │ │ Origem: sg-web │◄─────┐ │
│ │ │ │ │ │ │
│ │ ┌──────────┐ │ │ ┌──────────┐ │ │ │
│ │ │ Web App │──┼─────────┼─►│ MySQL │ │ │ │
│ │ └──────────┘ │ │ └──────────┘ │ │ │
│ │ │ │ │ │ │
│ └─────────────────┘ └─────────────────┘ │ │
│ │ │
│ Somente as instâncias em sg-web podem acessar ───────┘ │
│ o MySQL. Não precisa gerenciar IPs! │
│ │
└─────────────────────────────────────────────────────────────┘
Boa Prática
Referencie Security Groups ao invés de IPs sempre que possível. É mais dinâmico e mais seguro!
Portas Comuns
| Porta | Serviço | Quando abrir |
|---|---|---|
| 22 | SSH | Acesso admin (restrinja ao seu IP) |
| 80 | HTTP | Sites públicos |
| 443 | HTTPS | Sites seguros |
| 3306 | MySQL | Banco de dados (somente interno) |
| 5432 | PostgreSQL | Banco de dados (somente interno) |
| 3389 | RDP | Windows Remote Desktop |
| 8080 | HTTP Alt | Aplicações, Tomcat |
| 27017 | MongoDB | Banco de dados (somente interno) |
Exemplos de Configuração
Servidor Web Público
┌─────────────────────────────────────────────────────────────┐
│ SG : sg-webserver-public │
├─────────────────────────────────────────────────────────────┤
│ │
│ REGRAS DE ENTRADA: │
│ ┌──────────┬──────────┬──────────┬─────────────────────┐ │
│ │ Tipo │ Protocolo│ Porta │ Origem │ │
│ ├──────────┼──────────┼──────────┼─────────────────────┤ │
│ │ HTTP │ TCP │ 80 │ 0.0.0.0/0 │ │
│ │ HTTPS │ TCP │ 443 │ 0.0.0.0/0 │ │
│ │ SSH │ TCP │ 22 │ 203.0.113.50/32 │ │
│ └──────────┴──────────┴──────────┴─────────────────────┘ │
│ │
│ REGRAS DE SAÍDA: │
│ ┌──────────┬──────────┬──────────┬─────────────────────┐ │
│ │ All │ All │ All │ 0.0.0.0/0 │ │
│ └──────────┴──────────┴──────────┴─────────────────────┘ │
│ │
│ ⚠️ SSH restrito ao IP do escritório (203.0.113.50) │
│ │
└─────────────────────────────────────────────────────────────┘
Banco de Dados (Interno)
┌─────────────────────────────────────────────────────────────┐
│ SG : sg-database-private │
├─────────────────────────────────────────────────────────────┤
│ │
│ REGRAS DE ENTRADA: │
│ ┌──────────┬──────────┬──────────┬─────────────────────┐ │
│ │ Tipo │ Protocolo│ Porta │ Origem │ │
│ ├──────────┼──────────┼──────────┼─────────────────────┤ │
│ │ MySQL │ TCP │ 3306 │ sg-webserver │ │
│ └──────────┴──────────┴──────────┴─────────────────────┘ │
│ │
│ REGRAS DE SAÍDA: │
│ ┌──────────┬──────────┬──────────┬─────────────────────┐ │
│ │ All │ All │ All │ 0.0.0.0/0 │ │
│ └──────────┴──────────┴──────────┴─────────────────────┘ │
│ │
│ ✅ Somente acessível a partir do SG dos servidores web │
│ ❌ Sem acesso direto da Internet │
│ │
└─────────────────────────────────────────────────────────────┘
Erros Comuns
1. SSH Aberto para Todos ❌
RUIM:
SSH (22) - Origem: 0.0.0.0/0
↓
⚠️ Qualquer pessoa pode tentar se conectar!
Ataques de força bruta garantidos.
BOM:
SSH (22) - Origem: 203.0.113.50/32 (seu IP)
ou
SSH (22) - Origem: 10.0.0.0/8 (rede privada + VPN)
2. Banco de Dados Exposto ❌
RUIM:
MySQL (3306) - Origem: 0.0.0.0/0
↓
⚠️ Banco de dados acessível publicamente!
Risco grave de segurança.
BOM:
MySQL (3306) - Origem: sg-application
↓
✅ Apenas acessível a partir dos servidores de aplicação
3. Muitas Regras ❌
RUIM:
Um SG com 50 regras diferentes
↓
⚠️ Difícil de auditar e manter
Risco de erros
BOM:
Vários SGs com funções claras:
- sg-web-public (HTTP/HTTPS)
- sg-admin (SSH/RDP)
- sg-database (MySQL interno)
Boas Práticas
1. Princípio do Menor Privilégio
Permita APENAS o que for necessário.
✅ Bom : Porta 443 de 0.0.0.0/0 (HTTPS público necessário)
❌ Ruim: Todas as portas de 0.0.0.0/0
2. Use Nomes Descritivos
Nomes recomendados:
• sg-web-public-prod
• sg-database-internal-prod
• sg-admin-ssh-restricted
• sg-loadbalancer-public
3. Documente suas Regras
Adicione descrições a cada regra:
Porta 443 - "HTTPS público para o site"
Porta 22 - "SSH admin apenas do escritório de Paris"
Porta 3306 - "MySQL apenas para backend"
4. Audite Regularmente
Perguntas para se fazer:
• Existem regras com 0.0.0.0/0 desnecessárias?
• Portas de banco de dados estão expostas publicamente?
• As regras de SSH estão muito permissivas?
• Existem regras obsoletas?
Security Group vs NACL
┌─────────────────────────────────────────────────────────────┐
│ SECURITY GROUP vs NACL │
├─────────────────────────────────────────────────────────────┤
│ │
│ Critério Security Group NACL │
│ ────────────────────────────────────────────────────── │
│ Nível Instância Subnet │
│ Estado Stateful Stateless │
│ Regras Apenas ALLOW ALLOW e DENY │
│ Avaliação Todas as regras Ordem de prioridade │
│ Padrão Deny entrada Allow tudo │
│ Mudança Imediata Imediata │
│ │
│ Use SG para: Controle detalhado por instância │
│ Use NACL para: Bloquear IPs, defesa em profundidade │
│ │
└─────────────────────────────────────────────────────────────┘
Resumo
| Conceito | Descrição |
|---|---|
| Security Group | Firewall no nível da instância |
| Stateful | Respostas permitidas automaticamente |
| Inbound | Bloqueado por padrão |
| Outbound | Permitido por padrão |
| ALLOW only | Sem regras DENY |
| Referência SG | Usar um SG como origem |
Quiz de Validação
- O que significa "stateful" para um Security Group?
- Qual é a política padrão para tráfego de entrada?
- É possível bloquear um IP específico com um Security Group?
- O que significa 0.0.0.0/0 como origem?
- Por que referenciar um SG ao invés de um IP?
- Qual é a porta padrão para SSH?
Próxima seção: Lab: Arquitetura EC2