Segurança - CAKeysama/ReTool GitHub Wiki

Segurança

Princípio

A interface esconde o que a pessoa não pode fazer. Quem garante a segurança são as regras do Firestore e do Storage e a Cloud Function, que validam cada operação no servidor. Um cliente que chame a API do Firebase diretamente, fora da interface, esbarra nas mesmas regras.

Autenticação

  • Firebase Authentication com e-mail e senha. O Firebase guarda apenas o hash das senhas; o ReTool nunca grava senha no Firestore.
  • O cadastro público exige senha com no mínimo 6 caracteres, o mínimo do Firebase.
  • A sessão só permanece aberta para contas ativas ou Convidados em análise. Bloqueio, rejeição ou exclusão encerram a sessão em tempo real.

Autorização

  • Rotas: ProtectedLayout e RoleRoute em src/App.tsx.
  • Interface: usePermissions().
  • Contextos e casos de uso: checagens antes de gravar.
  • Servidor: firestore.rules, storage.rules e a Cloud Function redefinirSenhaTemporaria, que refaz toda a checagem com o Admin SDK.

A matriz de permissões e a definição de conta operacional estão em Usuários, Cargos e Permissões. O resumo das regras por coleção está em Firebase e Firestore.

Proteções específicas aplicadas no servidor:

Risco Proteção
Visitante escolher o próprio cargo O autocadastro só é aceito como Convidado, inativo e pendente, sem campos extras
Convidado ler dados Leituras exigem conta operacional (Firestore e Storage)
Usuário alterar o próprio cargo ou status O próprio usuário só altera nome (ou conclui a troca de senha)
"Desbloquear" um convidado sem aprovação Conta ativa exige cargo atribuível e statusAprovacao: 'aprovado'
Decidir a própria solicitação de cargo Recusado nas regras e nos casos de uso
Aprovar cargo sem aplicá-lo, ou aplicá-lo sem aprovar A decisão e o novo cargo precisam estar no mesmo lote
Várias solicitações de cargo simultâneas Trava pendencias_cargo/{uid}
Administração se bloquear ou se rebaixar Recusado nas regras e na interface
Forjar ou apagar auditoria Autoria obrigatória, carimbo do servidor, nada de update ou delete

Senhas

Situação Como funciona
Cadastro público A própria pessoa define a senha (mínimo de 6 caracteres)
Conta criada pela Administração Senha temporária de 14 caracteres gerada no navegador com crypto.getRandomValues e exibida uma única vez
Nova senha temporária Gerada no servidor (CSPRNG do Node) pela Cloud Function, que também revoga as sessões abertas
Primeiro acesso com senha temporária Troca obrigatória antes de qualquer outra tela: no mínimo 8 caracteres, letras e números, diferente da temporária. As regras bloqueiam os dados até a troca

A senha temporária nunca é gravada no Firestore, em logs, em URLs ou no armazenamento do navegador. Detalhes em Fluxos de Acesso.

Logs e dados sensíveis

  • A auditoria remove automaticamente campos de senha, token, hash e credenciais (ver Logs e Auditoria).
  • Somente a Administração lê os logs, e ninguém os altera ou apaga pelo app.

Variáveis de ambiente e segredos

  • O .env não é versionado. Use .env.example como modelo e valores reais apenas localmente.
  • A configuração web do Firebase (VITE_*) é pública por natureza, porque vai no JavaScript entregue ao navegador. Por isso, toda proteção depende das regras estarem publicadas no projeto que o app usa.
  • Não há chaves privadas ou contas de serviço no repositório. A Cloud Function usa a identidade padrão do próprio Firebase.
  • Não crie contas com credenciais fixas no código. O primeiro administrador é promovido pelo Console (ver Usuários, Cargos e Permissões).

Limitações conhecidas

  • Conclusão da troca de senha: as regras não conseguem verificar se a senha realmente mudou no Auth. Um usuário poderia, pela API, desligar a própria exigência sem trocar a senha. Isso afeta apenas a própria conta dele.
  • Login com senha errada não é auditado, porque não há identidade autenticada.
  • Excluir um usuário não apaga a conta do Firebase Auth, porque o SDK do navegador não permite. Sem perfil, a conta não acessa dados e, ao entrar, volta como Convidado pendente.
  • Os logs são gravados pelo cliente. A autoria e o horário são garantidos; o perfil informado e o texto descritivo não são validados.