---
title: Segurança
persona: all
category: Documentação técnica
version: 1.0.0
updated: 2026-06-09
---

# 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é.
