MyFinAI · o sistema operacional financeiro com IA← Documentação
Documentação técnica · v1.0.0 · atualizado 2026-06-09 · ESENPT · ⬇ Baixar Markdown

Segurança

A segurança do MyFinAI repousa em três muros que não dependem da disciplina de ninguém: isolamento por inquilino (tenant) (RLS), isolamento por papel, e rastros invioláveis (auditoria encadeada + BYOK). Cada um é verificado de forma contínua e re-executável.

Muro 1 · isolamento por inquilino (RLS)

Cada tabela com dados de inquilino leva uma política FORCE ROW LEVEL SECURITY sobre app.current_tenant_id, e a aplicação se conecta com o papel myfinai_app (NOSUPERUSER, NOBYPASSRLS). O livro de um negócio e o de um lar são fisicamente invisíveis um ao outro.

Testado ao vivo: dois espaços —Café La Aurora e Hogar Marrero— com vazamento zero em ambos os sentidos. Seus conjuntos de transações são disjuntos, e um mesmo login que muda de espaço obtém um livro diferente: café DR $91,216 ≠ lar DR $6,360.

Muro 2 · isolamento por papel

O RLS isola *inquilinos*; os papéis isolam *pessoas dentro de um inquilino*. Os livros do negócio (movimentações, folha de pagamento, razão, impostos, auditoria) estão atrás do nível books (dono · guarda-livros · contador · chefe de família). O funcionário e o membro da família ficam de fora: só veem o próprio recibo ou a própria mesada.

Isso é impedido no servidor, não na interface. Mesmo que um funcionário pedisse
GET /api/data/payroll diretamente, a resposta é 403. O mesmo para Norte:
ninguém extrai os livros através do assistente.

Muro 3 · associação verificada

Você não pode obter um token para um espaço ao qual não pertence. /api/auth/switch valida a associação no servidor: um usuário do café recebe 403 ao tentar mudar para o lar, e vice-versa. O pertencimento é verificado, não presumido.

BYOK · suas chaves, cifradas

Se um inquilino traz a própria chave de IA (BYOK), ela é guardada cifrada com Fernet + HKDF (chave mestra do ambiente + sal por inquilino, info="myfinai-byok-v1"). Só se guarda o texto cifrado; a mestra falha em fechado e o texto plano nunca é registrado nem devolvido. Sem chave, os agentes determinísticos seguem funcionando: a IA pole a resposta, não é um requisito para que o sistema opere.

Auditoria encadeada

Cada ação relevante —abertura de período, decisão, provisionamento, e o que cada agente faz— é escrita em audit_log com o hash do evento anterior (prev_hash → hash). Alterar um registro passado quebra a cadeia e fica evidente. A auditoria cobre operações, não apenas dinheiro.

Verificação contínua

Tudo o que está acima é testado com api/infra/audit_flows.py: 77 verificações, 0 falhas contra o sistema em produção, cobrindo os sete papéis, o cruzamento de inquilinos em ambos os sentidos, e a reconciliação de ambos os livros. O registro de achados, correções e pendências vive em api/AUDIT.md.

python api/infra/audit_flows.py            # contra produção
BASE=http://localhost:8090 python …        # contra uma instância local
A ideia: a confiança não se pede, se demonstra. Qualquer um pode re-executar a
prova e ver, na própria tela, que os muros seguem de pé.