---
id: security-audit
agent: data-engineer
title: Auditoria de segurança e qualidade do banco
inputs: [scope, story]
outputs: [relatório de achados por severidade, lista de remediações]
elicit: false
modes: [interactive, yolo]
---

# Auditoria de segurança e qualidade do banco

**Objetivo:** auditar o banco no escopo pedido (`rls`, `schema` ou `full`) e emitir achados por
severidade — cobertura de RLS, integridade do schema e exposição de segredos — com remediação clara.

**Pré-condições:**
- O `scope` é `rls`, `schema` ou `full`. Se ambíguo, default para `full`.
- Acesso de leitura ao catálogo do banco (`pg_catalog`/`information_schema`). Esta é uma auditoria de
  leitura — não altera nada.

## Passos

1. **Cobertura de RLS** (escopo `rls`/`full`): liste tabelas em schemas expostos sem `rowsecurity`
   habilitado, e tabelas com RLS ligada mas sem política (negam tudo silenciosamente). Cada tabela
   pública sem RLS é achado CRÍTICO.
2. **Integridade do schema** (escopo `schema`/`full`): toda tabela tem PK? FKs declaradas têm índice
   de suporte? Baseline presente (`id`/`created_at`/`updated_at`)? Colunas que deveriam ser `NOT NULL`
   estão? CHECK constraints onde a regra de domínio exige?
3. **Exposição de privilégio:** funções `SECURITY DEFINER` sem `search_path` fixo, GRANTs amplos a
   `public`/`anon`, uso de service role onde RLS bastaria. Redijo qualquer segredo que apareça —
   nunca ecoo token/senha completo.
4. **Classifique cada achado** por severidade: CRÍTICO (tabela pública sem RLS, vazamento de
   privilégio), ALTO (FK sem índice, baseline ausente em tabela quente), MÉDIO/BAIXO (convenção,
   débito menor).
5. **Proponha remediação por achado** rastreável: o quê, por quê, e o comando/migration sugerido —
   sem aplicar nada nesta task (auditoria observa; correção é outra task).
6. **Emita o relatório** ordenado por severidade, com contagem por nível e o veredito geral.

## Critério de pronto (DoD)

- [ ] Cobertura de RLS verificada em todas as tabelas do escopo
- [ ] Integridade do schema checada (PK, FK+índice, baseline, NOT NULL, CHECK)
- [ ] Exposição de privilégio avaliada; segredos redigidos
- [ ] Cada achado tem severidade e remediação rastreável
- [ ] Relatório emitido; nada alterado no banco

## Falha / recuperação

- **Achado CRÍTICO (tabela pública sem RLS / vazamento)** → marco como bloqueador e roteio a
  remediação (`db-policy-apply` / migration) antes de qualquer subida.
- **Sem acesso ao catálogo** → **pare** e reporte a lacuna de permissão; auditoria parcial não vale
  como veredito.
- **Remediação exige migration** → entrego o plano; a aplicação segue o fluxo snapshot → dry-run →
  apply, e o push é do @devops.
