Audit Log

Audit Log - C-Suite

Visão Geral

Este documento descreve o sistema de audit log centralizado para registrar todas as ações importantes no ecossistema C-Suite: quem fez o quê, quando, e com quais dados.

Módulo de Audit Log

Localização

O módulo principal está em: common_audit.py (raiz do projeto)

Características

Setup

1. Criar Tabela de Audit Logs

# Executar schema SQL
mysql -u root -p csuite < schema_audit_logs.sql

2. Configuração

# Habilitar/desabilitar audit log
AUDIT_LOG_ENABLED=true

# Nome da tabela (opcional, padrão: audit_logs)
AUDIT_LOG_TABLE=audit_logs

Uso Básico

1. Logging Manual

from common_audit import audit_log

# Log de criação de política
audit_log(
    action="policy_created",
    user_id="123",
    org_id=1,
    resource_type="policy",
    resource_id="min_margin",
    details={"value": 0.15, "previous_value": None},
    ip_address="192.168.1.1",
    success=True
)

# Log de atualização
audit_log(
    action="policy_updated",
    user_id="123",
    org_id=1,
    resource_type="policy",
    resource_id="min_margin",
    details={"old_value": 0.15, "new_value": 0.20},
    success=True
)

# Log de erro
audit_log(
    action="policy_update_failed",
    user_id="123",
    org_id=1,
    resource_type="policy",
    resource_id="min_margin",
    success=False,
    error_message="Valor inválido: deve ser entre 0 e 1"
)

2. Middleware Automático

from fastapi import FastAPI
from common_audit import create_audit_middleware

app = FastAPI()

# Adiciona middleware para logar todos os requests
app.middleware("http")(create_audit_middleware(
    log_requests=True,
    log_responses=False,  # Apenas requests por padrão
    exclude_paths=["/health", "/ready"]  # Paths a excluir
))

3. Usando Enum de Ações

from common_audit import audit_log, AuditAction

audit_log(
    action=AuditAction.POLICY_CREATED,
    user_id="123",
    org_id=1,
    resource_type="policy",
    resource_id="min_margin"
)

Ações Auditáveis

Políticas

Decisões

Autenticação

Dados

HTTP

Integração com Apps

Policy Engine

from common_audit import audit_log

def create_policy(org_id: int, rule_key: str, value: Any, user_id: str):
    # Cria política
    policy = db.create_policy(org_id, rule_key, value)

    # Loga ação
    audit_log(
        action="policy_created",
        user_id=user_id,
        org_id=org_id,
        resource_type="policy",
        resource_id=rule_key,
        details={"rule_key": rule_key, "value": value},
        success=True
    )

    return policy

Decision API

from common_audit import audit_log

async def decide(customer_id: int, org_id: int, user_id: str):
    # Toma decisão
    decision = await make_decision(customer_id, org_id)

    # Loga decisão
    audit_log(
        action="decision_made",
        user_id=user_id,
        org_id=org_id,
        resource_type="decision",
        resource_id=str(decision.id),
        details={
            "customer_id": customer_id,
            "offer_id": decision.offer_id,
            "intent_score": decision.intent_score
        },
        success=True
    )

    return decision

Autenticação

from common_audit import audit_log

async def login(email: str, password: str, ip_address: str):
    user = verify_credentials(email, password)

    if user:
        audit_log(
            action="login",
            user_id=str(user.id),
            org_id=user.org_id,
            ip_address=ip_address,
            success=True
        )
        return create_token(user)
    else:
        audit_log(
            action="login_failed",
            details={"email": email},
            ip_address=ip_address,
            success=False,
            error_message="Credenciais inválidas"
        )
        raise HTTPException(status_code=401, detail="Credenciais inválidas")

Consultando Audit Logs

Queries Úteis

-- Todas as ações de um usuário
SELECT * FROM audit_logs 
WHERE user_id = '123' 
ORDER BY created_at DESC;

-- Todas as ações de uma organização
SELECT * FROM audit_logs 
WHERE organization_id = 1 
ORDER BY created_at DESC;

-- Ações de um tipo específico
SELECT * FROM audit_logs 
WHERE action = 'policy_created' 
ORDER BY created_at DESC;

-- Ações de um recurso específico
SELECT * FROM audit_logs 
WHERE resource_type = 'policy' 
  AND resource_id = 'min_margin'
ORDER BY created_at DESC;

-- Ações recentes (últimas 24h)
SELECT * FROM audit_logs 
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 24 HOUR)
ORDER BY created_at DESC;

-- Ações que falharam
SELECT * FROM audit_logs 
WHERE success = 0 
ORDER BY created_at DESC;

-- Estatísticas por ação
SELECT 
    action,
    COUNT(*) as count,
    SUM(success = 1) as successful,
    SUM(success = 0) as failed
FROM audit_logs
GROUP BY action
ORDER BY count DESC;

Boas Práticas

  1. Logue todas as ações importantes: Criação, atualização, deleção de recursos
  2. Inclua contexto: user_id, org_id, resource_type, resource_id
  3. Detalhes relevantes: Valores antigos/novos, parâmetros importantes
  4. Logue erros: Ações que falharam também devem ser logadas
  5. Não logue dados sensíveis: Senhas, tokens, PII completo
  6. Use trace IDs: Para correlacionar com logs de aplicação
  7. Retenção: Defina política de retenção (ex: 1 ano)

Segurança

Imutabilidade

Os logs são imutáveis por design:
- Não há UPDATE ou DELETE na tabela
- Apenas INSERT é permitido
- Timestamps automáticos

Privacidade

Acesso

Retenção e Arquivamento

Política de Retenção

-- Mover logs antigos (> 1 ano) para arquivo
CREATE TABLE audit_logs_archive LIKE audit_logs;

-- Mover logs antigos
INSERT INTO audit_logs_archive
SELECT * FROM audit_logs
WHERE created_at < DATE_SUB(NOW(), INTERVAL 1 YEAR);

-- Deletar logs arquivados (após backup)
DELETE FROM audit_logs
WHERE created_at < DATE_SUB(NOW(), INTERVAL 1 YEAR);

Monitoramento

Alertas

Dashboards

Troubleshooting

Logs não aparecem

  1. Verifique se AUDIT_LOG_ENABLED=true
  2. Verifique conexão com banco de dados
  3. Verifique se tabela existe
  4. Verifique logs de erro do aplicativo

Performance

  1. Índices estão criados corretamente
  2. Considere particionamento por data
  3. Considere arquivamento de logs antigos

Próximos Passos

  1. ✅ Módulo de audit log criado
  2. ✅ Schema de banco criado
  3. ⏳ Executar migration SQL
  4. ⏳ Integrar em todos os apps
  5. ⏳ Configurar retenção e arquivamento
  6. ⏳ Criar dashboards de monitoramento

🔊 Text-to-Speech

1.0x
1.0
Pronto para reproduzir