Arquitetura de Segurança
O Elo Orgânico implementa uma estratégia de segurança em múltiplas camadas para proteger os dados da comunidade e garantir a integridade dos ciclos de compartilhamento. Nossa abordagem combina protocolos padrão da indústria com proteção especializada contra bots e mitigação de ataques de força bruta (brute-force).
1. Proteção contra Bots (Cloudflare Turnstile)
Para evitar registros e tentativas de login automatizados, utilizamos o Cloudflare Turnstile. Ao contrário dos CAPTCHAs tradicionais, o Turnstile oferece uma experiência de verificação não intrusiva e focada na privacidade.
1.1. Integração no Lado do Cliente (React 19)
O AuthFeature utiliza o componente @marsidev/react-turnstile no Modo Gerenciado.
- Modo Gerenciado: Exibe um checkbox inteligente que verifica se o usuário é humano.
- Gerenciamento de Estado: O botão de envio permanece desabilitado até que um
turnstileTokenválido seja emitido pelo widget. - Isolamento: Cada formulário (Login/Registro) mantém sua própria instância do Turnstile via chaves React exclusivas para garantir uma validação nova ao alternar o modo.
1.2. Validação no Servidor (Fastify 5)
A API não confia apenas no estado do lado do cliente.
- Verificação: O
AuthServicerealiza uma requisição POST segura parahttps://challenges.cloudflare.com/turnstile/v0/siteverify. - Validação de IP: O endereço IP do cliente é repassado à Cloudflare para detectar botnets baseadas em proxy.
- DTOs Obrigatórios: Os esquemas
LoginDTOSchemaeRegisterDTOSchemano@elo-instance/coreexigem estritamente oturnstileToken.
2. Mitigação de Força Bruta (Brute-Force)
Protegemos nossos endpoints de autenticação contra ataques de dicionário e adivinhação automatizada por meio de dois mecanismos principais.
2.1. Limitação de Taxa (Rate Limiting)
Utilizando o @fastify/rate-limit, aplicamos limites específicos de contexto a rotas sensíveis.
- Política Global: Um limite base de 100 requisições por minuto por IP para uso geral da API.
- Política Estrita de Autenticação: As rotas
/api/auth/logine/api/auth/registersão limitadas a 5 tentativas por minuto por IP. - Código de Retorno: Exceder esses limites dispara uma resposta
429 (Too Many Requests).
2.2. Lógica de Bloqueio de Conta
Para evitar ataques direcionados contra contas de usuários específicas:
- Tentativas Máximas: Após 5 tentativas consecutivas falhas, a conta é bloqueada.
- Duração do Bloqueio: A conta permanece inacessível por 15 minutos (
lockUntil). - Persistência: O estado de bloqueio é armazenado diretamente no modelo
Userdo Mongoose (loginAttempts,lockUntil).
3. Proteção e Ofuscação de Dados
3.1. Prevenção de Enumeração de Usuários
A API foi projetada para vazar o mínimo de informações possível sobre o estado do sistema para usuários não autenticados.
- Erros Genéricos: Tanto "Usuário Não Encontrado" quanto "Senha Inválida" retornam um código de erro unificado
INVALID_CREDENTIALS. - Tempo de Resposta Uniforme: Comparações criptográficas (Bcrypt) são executadas mesmo se o identificador do usuário não existir, prevenindo ataques de tempo (timing attacks).
3.2. Comunicação Segura
- JWT (HS256): Todas as requisições autenticadas exigem um JSON Web Token assinado com um segredo simétrico forte.
- Proteção contra CSRF: O
@fastify/csrf-protectionestá ativado, exigindo um cabeçalhoCSRF-Tokenpara todas as requisições que alteram estado (POST, PUT, DELETE). - Cookies HTTP-Only: Os tokens de sessão são armazenados em cookies assinados e HTTP-only para mitigar o roubo de tokens baseado em XSS.
4. Requisitos de Ambiente
As seguintes chaves de segurança são obrigatórias para a operação da stack Instance. Cada variável reside no arquivo env pertencente à aplicação responsável, seguindo o princípio de isolamento de Contexto Delimitado do projeto.
4.1. API (instance/apps/api/.env.*)
| Variável | Propósito | Ambientes |
|---|---|---|
TURNSTILE_SECRET_KEY | Verificação do token do Cloudflare Turnstile no servidor. | dev, prod, staging |
JWT_SECRET | Assinatura e verificação de JSON Web Tokens. | dev, prod, staging |
SESSION_SECRET | Criptografia de cookies de sessão assinados e HTTP-only. | dev, prod, staging |
MONGO_URI | String de conexão com o MongoDB. Dev usa Replica Set local; prod/staging usa MongoDB Atlas (mongodb+srv://). | dev, prod, staging |
4.2. Web (instance/apps/web/.env.* / Docker ARG)
| Variável | Propósito | Método de Injeção |
|---|---|---|
VITE_TURNSTILE_SITE_KEY | Chave pública do site para renderizar o widget do Turnstile. | Dev local: lido de .env.dev pelo Vite (--mode dev). Produção: injetado como ARG do Docker durante o build da imagem — gravado estaticamente no bundle JS. |
Importante:
VITE_TURNSTILE_SITE_KEYé uma chave pública (segura para ser embutida nos pacotes do cliente). ATURNSTILE_SECRET_KEYé privada e deve apenas existir no ambiente da API, nunca na aplicação Web ou commitada no controle de versão.
Última Atualização: Junho de 2026