College Online
0%

Seguranca em Redes

Modulo 5 · Aula 2 ~25 min de leitura Nivel: Intermediario

Video da aula estara disponivel em breve

TLS/SSL

TLS (Transport Layer Security, sucessor do SSL) é o protocolo que adiciona criptografia, autenticidade e integridade às conexões TCP. Quando você vê https://, TLS está em uso. Entender TLS é fundamental — toda conexão segura na Internet moderna depende dele.

Criptografia simétrica vs assimétrica

TLS combina dois tipos de criptografia. A assimétrica (RSA, ECDHE) usa um par de chaves (pública/privada) e é lenta — usada apenas no handshake para trocar a chave de sessão. A simétrica (AES) usa uma única chave compartilhada e é rápida — usada para criptografar todos os dados após o handshake.

Referência
Criptografia simétrica vs assimétrica:

  Simétrica (AES-256-GCM):
    - Uma chave compartilhada entre emissor e receptor
    - Rápida (~1 GB/s em hardware moderno)
    - Problema: como compartilhar a chave de forma segura?

  Assimétrica (RSA, ECDHE):
    - Par de chaves: pública (todos conhecem) + privada (secreta)
    - Dados encriptados com pública → só a privada descriptografa
    - Lenta (~1000x mais lenta que simétrica)
    - Resolve o problema de troca de chaves

  TLS usa as DUAS:
    1. Assimétrica no handshake → troca da session key
    2. Simétrica após handshake → encripta dados (AES)

  Diffie-Hellman (ECDHE):
    Permite que duas partes criem uma chave compartilhada
    via canal público, sem que um observador consiga calculá-la.
    É a base do "forward secrecy" — mesmo que a chave privada
    do servidor vaze, sessões passadas permanecem seguras.
Diagrama
TLS Handshake (simplificado):

Cliente                              Servidor
   |                                    |
   |--- ClientHello ------------------>|  Versao TLS, cipher suites, random
   |                                    |
   |<-- ServerHello -------------------|  Cipher suite escolhida, random
   |<-- Certificate -------------------|  Certificado X.509 do servidor
   |<-- ServerHelloDone ---------------|
   |                                    |
   |  [Verifica certificado contra CAs]|
   |                                    |
   |--- ClientKeyExchange ------------>|  Pre-master secret (criptografado
   |--- ChangeCipherSpec ------------->|  com chave publica do servidor)
   |--- Finished (encrypted) -------->|
   |                                    |
   |<-- ChangeCipherSpec --------------|
   |<-- Finished (encrypted) ---------|
   |                                    |
   |==== DADOS CRIPTOGRAFADOS =========|  Symmetric encryption (AES)

Apos o handshake:
  - Ambos tem a mesma session key (simetrica)
  - Todos os dados sao criptografados com AES
  - HMAC garante integridade (dados nao alterados)
Python
import ssl
import socket

def inspect_tls_connection(host, port=443):
    """Inspeciona os detalhes TLS de uma conexão."""
    ctx = ssl.create_default_context()
    with socket.create_connection((host, port)) as sock:
        with ctx.wrap_socket(sock, server_hostname=host) as ssock:
            print(f"Host: {host}")
            print(f"Versão TLS: {ssock.version()}")           # TLSv1.3
            print(f"Cipher: {ssock.cipher()}")                 # AES-256-GCM
            cert = ssock.getpeercert()
            print(f"Subject: {cert['subject'][0][0][1]}")
            print(f"Issuer: {cert['issuer'][1][0][1]}")
            print(f"Expira: {cert['notAfter']}")
            print(f"SANs: {[v for _, v in cert.get('subjectAltName', [])]}")

inspect_tls_connection("google.com")

Certificados e cadeias de confiança

Diagrama
Cadeia de certificados:

Root CA (pre-instalada no SO/browser)
  |
  +-- Intermediate CA (assinada pela Root)
       |
       +-- Certificado do servidor (assinado pela Intermediate)
            Subject: neon.tech
            Issuer: Let's Encrypt
            Valid: 2026-01-01 to 2026-04-01
            Public Key: RSA 2048-bit

Verificacao:
  1. Browser recebe certificado do servidor
  2. Verifica assinatura com a chave publica da Intermediate CA
  3. Verifica assinatura da Intermediate com a Root CA
  4. Root CA esta na trust store do SO? Sim -> CONFIAVEL

OAuth 2.0

OAuth 2.0 e um framework de autorizacao que permite que aplicacoes acessem recursos em nome de um usuario, sem receber a senha do usuario.

Diagrama
OAuth 2.0 Authorization Code Flow:

Usuario    App (Client)     Auth Server     Resource Server
  |           |                  |                |
  |--login--->|                  |                |
  |           |---redirect------>|                |
  |           |                  |                |
  |<------login page------------|                |
  |---credentials--------------->|                |
  |<------auth code--------------|                |
  |           |                  |                |
  |           |---auth code----->|                |
  |           |<--access token---|                |
  |           |                                   |
  |           |---GET /api + Bearer token-------->|
  |           |<--200 OK + data-------------------|

Padroes de autenticacao de API

Referencia
Metodo           Seguranca   Complexidade   Uso
──────────────   ─────────   ────────────   ────────────────────
API Key          Baixa       Simples        APIs publicas, rate limiting
  Header: X-API-Key: abc123

Bearer Token     Media       Media          OAuth 2.0, JWT
  Header: Authorization: Bearer eyJ...

mTLS             Alta        Alta           Servico-a-servico, zero trust
  Ambos os lados apresentam certificados

HMAC Signature   Alta        Media          Webhooks, AWS Signature v4
  Assinatura do request com shared secret
Python
import jwt
import time

# Criando um JWT (JSON Web Token)
secret = "my-secret-key"
payload = {
    "sub": "build-ai",           # Subject (quem)
    "role": "agent",              # Permissoes
    "iat": int(time.time()),     # Issued at
    "exp": int(time.time()) + 3600,  # Expira em 1h
}
token = jwt.encode(payload, secret, algorithm="HS256")
print(f"JWT: {token}")

# Verificando JWT
try:
    decoded = jwt.decode(token, secret, algorithms=["HS256"])
    print(f"Subject: {decoded['sub']}")
    print(f"Role: {decoded['role']}")
except jwt.ExpiredSignatureError:
    print("Token expirado!")
except jwt.InvalidTokenError:
    print("Token invalido!")

Ataques comuns em redes

Conhecer os ataques é essencial para projetar defesas. Os ataques mais comuns exploram vulnerabilidades em diferentes camadas:

Referência
Ataques por camada:

Camada 2 (Enlace):
  ARP Spoofing:   Atacante envia ARP replies falsos
                  → redireciona tráfego para si (MitM)
  MAC Flooding:   Inunda switch com MACs falsos
                  → switch vira hub, todos recebem tudo

Camada 3 (Rede):
  IP Spoofing:    Forja endereço IP de origem
  BGP Hijacking:  Anuncia rotas falsas para sequestrar tráfego

Camada 4 (Transporte):
  SYN Flood:      Envia milhares de SYN sem completar handshake
                  → esgota recursos do servidor (tabela de conexões)
  Port Scanning:  Descobre serviços ativos (nmap)

Camada 7 (Aplicação):
  DNS Spoofing:   Responde DNS com IP falso → redireciona tráfego
  SQL Injection:  Injeta SQL malicioso via input do usuário
  XSS:            Injeta JavaScript malicioso em páginas web
  CSRF:           Força usuário a executar ação não intencional

Defesas:
  ARP Spoofing  → Dynamic ARP Inspection (DAI) no switch
  SYN Flood     → SYN cookies (não aloca estado no SYN)
  DNS Spoofing  → DNSSEC (assinatura digital de records DNS)
  BGP Hijacking → RPKI (Resource Public Key Infrastructure)
!
Man-in-the-Middle (MitM) Um ataque MitM intercepta a comunicação entre duas partes sem que nenhuma perceba. TLS previne MitM porque o atacante não consegue apresentar um certificado válido para o domínio alvo — o browser rejeita. Por isso, nunca ignore avisos de certificado no browser.

No harness.os

Segurança de rede é o concern "security" do harness.os. Cada camada de comunicação do mesh precisa de proteção específica:

Diagrama
Segurança de rede no harness.os:

1. MCP Server endpoints
   Atual:   API key no header (X-API-Key)
   Ideal:   JWT com escopos (read:knowledge, write:sessions)
   Futuro:  mTLS entre mesh nodes (zero trust)

2. Neon Postgres
   Atual:   Password auth + SSL required
   Ideal:   SSL + IP allowlist + credential rotation
   Futuro:  IAM authentication (sem passwords)

3. Mesh inter-node communication
   Problema: como build.ai confia em marco.ai?
   Solucao:  JWT signed com shared secret entre nodes
             Cada node tem um token que identifica quem e + permissoes

4. Fly.io deployment
   Atual:   Auto-TLS (Let's Encrypt) para HTTPS
   Ideal:   mTLS entre apps Fly.io (WireGuard mesh interno)

Fluxo de autenticacao mesh proposto:
  Node A --[JWT: sub=build-ai, role=build]--> Node B
  Node B verifica JWT, checa permissoes
  Se valido: processa request
  Se invalido: 401 Unauthorized

Resumo

Homework

Exercício 1: Projete o fluxo de autenticação para comunicação entre nodes do mesh harness.os.

  1. Escolha: API key, JWT ou mTLS? Justifique com base nos trade-offs de segurança vs complexidade
  2. Defina os claims do JWT: subject, role, scopes, expiration
  3. Implemente em Python: função que gera e verifica tokens de mesh
  4. Como renovar tokens sem interromper a comunicação? (token refresh)

Exercício 2: Use o script inspect_tls_connection() para analisar 3 sites diferentes (google.com, github.com, neon.tech). Compare: versão TLS, cipher suite, emissor do certificado, e validade.

Exercício 3: Explique como um ataque ARP spoofing funciona passo a passo. Desenhe o diagrama mostrando o atacante, a vítima e o gateway. Como Dynamic ARP Inspection previne o ataque?

Exercício 4: Implemente em Python um gerador de JWT com claims personalizados e um verificador que valida assinatura, expiração e scopes. Teste com tokens válidos, expirados e adulterados.

Verifique seu entendimento

No TLS handshake, qual tipo de criptografia e usado para trocar a session key?

  • Criptografia simetrica (AES)
  • Criptografia assimetrica (RSA/ECDHE) para trocar a chave, depois simetrica para dados
  • Hashing (SHA-256)
  • Nenhuma — a session key e enviada em texto plano

Verifique seu entendimento

O que é "forward secrecy" e por que é importante?

  • É quando o servidor encaminha pacotes sem descriptografar
  • Mesmo que a chave privada do servidor vaze no futuro, sessões passadas permanecem seguras (porque cada sessão usa uma chave efêmera única via ECDHE)
  • É o processo de verificar certificados antes de estabelecer a conexão
  • É quando o firewall inspeciona pacotes antes de encaminhá-los

Verifique seu entendimento

Qual ataque esgota a tabela de conexões de um servidor enviando milhares de SYN sem completar o handshake TCP?

  • ARP Spoofing
  • DNS Spoofing
  • SYN Flood
  • BGP Hijacking