Pular para o conteúdo principal

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​

PortaServiçoQuando abrir
22SSHAcesso admin (restrinja ao seu IP)
80HTTPSites públicos
443HTTPSSites seguros
3306MySQLBanco de dados (somente interno)
5432PostgreSQLBanco de dados (somente interno)
3389RDPWindows Remote Desktop
8080HTTP AltAplicações, Tomcat
27017MongoDBBanco 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​

ConceitoDescrição
Security GroupFirewall no nível da instância
StatefulRespostas permitidas automaticamente
InboundBloqueado por padrão
OutboundPermitido por padrão
ALLOW onlySem regras DENY
Referência SGUsar um SG como origem

Quiz de Validação​

  1. O que significa "stateful" para um Security Group?
  2. Qual é a política padrão para tráfego de entrada?
  3. É possível bloquear um IP específico com um Security Group?
  4. O que significa 0.0.0.0/0 como origem?
  5. Por que referenciar um SG ao invés de um IP?
  6. Qual é a porta padrão para SSH?

Próxima seção: Lab: Arquitetura EC2