kb.erickguedes.com
OWASP: Segurança Web na Prática

Logging, Monitoring e AppSec Pipeline

Aula 6 de 6

A09:2021 — Security Logging and Monitoring Failures

OWASP AppSensor

AppSensor define pontos de detecção e resposta para ataques em tempo real:

Categorias de detecção:
  - RE: Request Exception (parâmetros inválidos, payload anormal)
  - AE: Authentication Exception (tentativas de login, brute force)
  - ACE: Access Control Exception (tentativas de acesso não autorizado)
  - IE: Injection Exception (SQLi, XSS detectados)
  - ME: Malicious Execution (RCE detectado)

Resposta automática:
  - Log: Registrar o evento
  - Alert: Notificar time de segurança
  - Block: Bloquear IP/usuário temporariamente
  - Disable: Desabilitar conta do usuário
  - Throttle: Reduzir taxa de requisições

Audit Logs

# Exemplo de audit logging estruturado
import json
import datetime

def audit_log(event_type, user_id, resource, action, result, ip_address):
    log_entry = {
        "timestamp": datetime.datetime.utcnow().isoformat(),
        "event_type": event_type,
        "user_id": user_id,
        "resource": resource,
        "action": action,
        "result": result,        # success / failure
        "ip_address": ip_address,
        "user_agent": get_user_agent(),
        "correlation_id": get_correlation_id()
    }
    # Enviar para sistema de logging centralizado
    send_to_siem(json.dumps(log_entry))

# Uso
audit_log("AUTH_LOGIN", user.id, "/api/login", "LOGIN", "FAILURE", request.remote_addr)

SIEM (Security Information and Event Management)

Soluções populares:
  - Wazuh (open source)
  - Elastic Security (ELK Stack)
  - Splunk
  - QRadar (IBM)
  - Sentinel (Microsoft)

Correlação de eventos:
  - Múltiplas falhas de login (brute force)
  - Acesso a recurso sensível fora do horário
  - Execução de comando suspeito
  - Anomalia de tráfego (exfiltração de dados)

ELK Stack (Elasticsearch, Logstash, Kibana)

# Filebeat — coleta logs da aplicação
filebeat.inputs:
  - type: log
    paths:
      - /var/log/app/*.log
    fields:
      app: "minha-aplicacao"

output.elasticsearch:
  hosts: ["localhost:9200"]
  index: "app-logs-%{+yyyy.MM.dd}"

Detection Rules

Exemplos de regras de detecção Wazuh/Sigma:

Título: Múltiplas Falhas de Login
Regra: 5+ falhas de login no mesmo usuário em 1 minuto
Ação: Bloquear IP por 15 minutos, alertar time SOC

Título: SQL Injection Detectado
Regra: WAF marca requisição como SQLi
Ação: Log detalhado, bloquear IP, notificar desenvolvedor

OWASP Cheat Sheets

Cheat SheetConteúdo
REST SecurityAutenticação, rate limiting, versionamento, HATEOAS
Docker SecurityImagens mínimas, non-root, read-only FS, secrets
Kubernetes SecurityRBAC, PodSecurityPolicy, network policies
GraphQL SecurityDepth limiting, query cost analysis, introspection off
JSON Web TokenAlgoritmos seguros, expiração, audience validation
File UploadExtensão, tamanho, content-type, scanning
Input ValidationAllowlist, encoding, canonicalization

REST Security

GET /api/v1/users HTTP/1.1
Host: api.exemplo.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
X-API-Key: abc123

# Rate limiting
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1700000000

GraphQL Security

# Query maliciosa (deep nesting → DoS)
query {
  user(id: 1) {
    posts {
      comments {
        user {
          posts {
            comments {
              user { name }
            }
          }
        }
      }
    }
  }
}

# Mitigação: query depth limit (máx 6 níveis)
# Mitigação: query cost analysis (peso por campo)
# Mitigação: rate limiting por IP/API key
# Mitigação: introspection desabilitada em produção

AppSec Pipeline

SAST (Static Application Security Testing)

# Semgrep — regras customizáveis de SAST
semgrep --config=auto .
semgrep --config=p/python .
semgrep --config= r/javascript.react.security .
semgrep -c rules/sql-injection.yaml src/

# SonarQube — análise contínua de qualidade + segurança
sonar-scanner \
  -Dsonar.projectKey=meu_projeto \
  -Dsonar.sources=. \
  -Dsonar.host.url=http://localhost:9000 \
  -Dsonar.login=TOKEN

DAST (Dynamic Application Security Testing)

# OWASP ZAP — DAST automático
zap.sh -daemon -port 8081
zap-cli quick-scan -s all http://meuapp.test

# Burp Suite Professional — Scan automatizado
burpsuite --scan --url=http://meuapp.test --output=report.xml

SCA (Software Composition Analysis)

# OWASP Dependency-Check
dependency-check --project "App" --scan . --format HTML

# Snyk
snyk test --severity-threshold=high

# Trivy
trivy fs --scanners vuln .

Pipeline Integrado

# .github/workflows/appsec.yml
name: AppSec Pipeline
on: [push, pull_request]
jobs:
  appsec:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: SAST  Semgrep
        run: semgrep --config=auto --error .

      - name: SCA  Dependency Check
        run: dependency-check --project App --scan .

      - name: DAST  ZAP Scan (staging)
        run: |
          zap.sh -daemon -port 8081
          zap-cli quick-scan http://staging.app.test

Bug Bounty

Plataformas:
  - HackerOne
  - Bugcrowd
  - Intigriti
  - YesWeHack

Programas VDP (Vulnerability Disclosure Program):
  - Google VRP
  - Microsoft Bounty
  - Meta Bug Bounty

Report Template:
  Título: [Tipo] — Componente — Impacto
  Severidade: Critical / High / Medium / Low
  Descrição: O que ocorre e onde
  Passos para reproduzir: 1, 2, 3
  Impacto: O que um atacante pode fazer
  Prova de conceito: curl, screenshot, vídeo
  Recomendação: Como corrigir

Lab: Configurando AppSec Pipeline

# 1. SAST com Semgrep no projeto
semgrep --config=auto --error .

# 2. SCA com Trivy
trivy fs --scanners vuln .

# 3. Verificar logs da aplicação (estrutura)
cat /var/log/app/application.log | ConvertFrom-Json

# 4. Simular detecção de brute force
# Monitorar log de autenticação para múltiplas falhas
Get-Content /var/log/auth.log | Select-String "Failed password" | Group-Object {$_ -split ' ' | Select -Last 1} | Where-Object Count -gt 5

# 5. Verificar OWASP Cheat Sheets
# https://cheatsheetseries.owasp.org/

Logging sem monitoramento é inútil. AppSec pipeline (SAST + DAST + SCA) deve ser parte do CI/CD, não um processo separado. Bug bounty é a camada final — testadores reais encontram o que scanners automatizados não detectam.