Quadrix

Segurança e dados

O que a gente faz para uma arena nunca enxergar a outra.

O sistema guarda o financeiro da arena, o telefone dos clientes e — quando existe turma kids — dado de menor de idade. Vazamento entre clientes num produto assim não é um bug para corrigir na sprint seguinte: é o fim do produto. Esta página conta o que está feito, em português e sem selo.

O centro de tudo

O isolamento mora no banco, não na consulta.

O jeito comum de separar clientes é escrever “onde a arena for X” em cada consulta do sistema. Funciona em todas, menos naquela em que alguém esqueceu — e a que esquece não dá erro: devolve dado a mais.

Aqui a pergunta nunca é feita solta. Toda consulta abre uma transação que carrega quem está perguntando, e o Postgres decide o que aquela pessoa enxerga, linha por linha, com Row Level Security. Uma consulta que esqueça o filtro não devolve dado demais: devolve nada.

Dois papéis de banco, e a diferença é tudo

Superusuário e dono de tabela ignoram as políticas — é assim que o Postgres funciona. Por isso quem atende as requisições é um papel separado, criado sem o direito de ignorá-las. Se a aplicação conectasse com o papel errado, tudo continuaria funcionando e nada mais estaria protegido; o sistema recusa subir nessa configuração.

Tabela nova nasce fechada

A suíte de testes reprova qualquer tabela criada sem política de isolamento. Não é disciplina do time: é o teste que falha e barra a entrega.

Como sabemos que funciona

Teste de segurança é verificado quebrando o código.

Um teste de isolamento verde não prova nada por si só. Ele pode estar passando porque a proteção funciona — ou porque ele não testa o que acha que testa.

Então cada teste de isolamento deste sistema foi verificado ao contrário: desligamos a proteção da tabela e conferimos que ele fica vermelho. Se continuasse verde, ele seria decoração. Os comentários do código registram qual sabotagem cada teste pega.

O que isso já pegou

Dois furos reais passaram por 182 testes verdes — porque os cenários de teste eram montados com privilégio que a aplicação não tem, e portanto testavam um mundo que não existe. Hoje as fixtures passam pelo mesmo caminho de uma requisição de verdade, sujeitas às mesmas regras. A conexão privilegiada só serve para conferir o resultado.

Contas e acesso

Entrar é a porta mais atacada.

Senha guardada em scrypt

Nunca em texto e nunca de forma reversível. Mínimo de dez caracteres, e o link de redefinição vale trinta minutos e uma vez só.

Senha conferida contra vazamentos

Ao cadastrar, ao trocar e também ao entrar — porque quem criou a conta antes da checagem existir é justamente quem está com a senha em circulação há mais tempo. A senha não sai do servidor: saem cinco caracteres de um resumo, compartilhados por milhares de senhas diferentes.

Avisa, não tranca

Senha comprometida gera aviso no topo de toda tela, com o número de vazamentos em que ela aparece. Não bloqueia: trancar o dono fora da própria arena numa sexta às 19h troca um risco por uma parada de operação.

Limite de tentativas

Por endereço e por conta tentada, junto — só por endereço puniria a arena inteira atrás de um mesmo provedor; só por conta deixaria passar varredura de e-mails. Acertar a senha devolve as tentativas gastas.

Não dizemos quem tem conta

“Esqueci minha senha” responde igual para e-mail que existe e para o que não existe, inclusive no tempo de resposta. Endpoint que responde diferente vira verificador de cadastro.

Permissão por pessoa

Além do papel, cada permissão é nomeada e pode ser aberta ou fechada para uma pessoa só. Dar desconto e cancelar venda — por onde dinheiro de bar vaza — são conferidas pelo próprio banco, e não apenas pela tela que escondeu o botão.

Papéis na equipe

Recepção, gestão, professor e bar enxergam coisas diferentes. O professor vê a agenda e a chamada dele, não o financeiro da arena; quem serve cerveja não precisa enxergar cliente, telefone e agenda para isso.

Pagamento

O cartão não passa por nós.

A cobrança online é feita pelo Mercado Pago, com a conta da própria arena. O número do cartão é transformado em um token dentro do navegador do cliente e nunca chega aos nossos servidores — o que quer dizer que não há o que vazar daqui.

Aviso de pagamento é conferido

Todo aviso do gateway tem a assinatura verificada antes de virar “pago”. Um endereço público que confirma pagamento sem conferir assinatura é fraude esperando acontecer — e o sistema recusa subir configurado para cobrar sem esse segredo.

Aviso repetido não cobra duas vezes

Gateway reenvia notificação quando não tem certeza de que a primeira chegou. Cada aviso é registrado uma vez só, então reenvio não vira reserva duplicada nem pagamento contado em dobro.

Conciliação diária

Todo dia o sistema compara o que ele acha que recebeu com o que o gateway diz ter recebido, e aponta a diferença. É como um aviso perdido aparece em vinte e quatro horas em vez de no fechamento do mês.

Infraestrutura

Onde os dados ficam, e o que acontece num dia ruim.

Servidores no Brasil

A aplicação e o banco rodam em infraestrutura contratada no Brasil, com conexão cifrada entre a aplicação e o banco e HTTPS obrigatório na frente. O cookie de sessão só é emitido em conexão segura.

Backup diário, restauração ensaiada

Backup automático com retenção, e — mais importante — restauração testada e cronometrada antes de a arena depender disso. Backup que nunca foi restaurado é uma crença, não um plano. O número que interessa é quanto tempo a arena ficaria parada.

Mudança de banco é versionada

Nenhuma alteração é feita à mão em produção. O sistema recusa aplicar uma migração já aplicada que tenha mudado de conteúdo — que é exatamente como produção passa a divergir do código sem ninguém perceber.

Voltar uma versão

Cada versão publicada fica identificada e disponível. Um deploy ruim se desfaz apontando para a anterior, sem reconstruir nada.

LGPD

Os dados são da arena.

Quem decide o que fazer com o cadastro dos clientes é a arena — ela é a controladora desses dados. O Quadrix opera em nome dela e só faz o que ela pede.

Exportação sem negociação

Clientes, reservas, pagamentos e turmas saem em formato aberto quando a arena quiser, inclusive na saída. Está nos termos de uso, não numa conversa de retenção.

Exclusão

Encerrada a assinatura, os dados são apagados no prazo dos termos, com a exceção do que a lei fiscal obriga a guardar. Os backups seguem o próprio ciclo de retenção e expiram sozinhos.

Menores de idade

Turma kids implica cadastro de criança e de responsável. Esses dados recebem o mesmo isolamento do resto e não são usados para nada além de operar a escola da arena.

Quem mais toca nos dados

A lista de subprocessadores está na política de privacidade: o provedor de infraestrutura, o Mercado Pago para pagamento e o serviço de e-mail. Nenhum dado é vendido nem usado para publicidade, em nenhuma hipótese.

Honestidade

O que não temos.

Página de segurança que só lista virtudes não ajuda ninguém a decidir.

  • Nenhuma certificação formal. Não temos ISO 27001 nem SOC 2. Somos uma operação pequena, e comprar auditoria antes de ter produto é gastar com o carimbo em vez de com a coisa.
  • Sem segundo fator ainda. A entrada é e-mail e senha, com a senha conferida contra vazamentos. Segundo fator está no plano e ainda não está no ar.
  • Sem teste automatizado de navegador. As centenas de testes cobrem regra de negócio, dinheiro e isolamento, mas não abrem uma tela. Boa parte dos problemas encontrados até hoje era a tela mentindo com a API certa.
  • Sem promessa de disponibilidade em contrato. Não vendemos um SLA que não temos como sustentar hoje. O que existe é um canal direto com quem escreve o sistema.

Encontrou uma falha?

Escreva para seguranca@quadrixpro.com.br. Respondemos, corrigimos e contamos o que aconteceu — inclusive quando a resposta é constrangedora.

Alguma dúvida que esta página não respondeu?

Pergunte. A resposta vem de quem escreveu o código.