7.8 KiB
7.8 KiB
Relatório de Segurança do App — EduManager & Portal do Aluno
1. Segurança no Portal do Aluno (portal)
O Portal do Aluno possui uma estrutura de segurança robusta baseada em JWT e middlewares de autenticação.
- Mecanismo de Autenticação (Login):
- O endpoint
POST /api/portal/loginem server.selfhosted.js gerencia o acesso do aluno. Ele valida se o aluno existe no banco de dados através da busca pela matrícula (numero_matricula). - Verificação de Senha: A comparação de senha é feita em texto plano diretamente contra a coluna
senha_portaldo banco de dados PostgreSQL. Se o aluno não tiver uma senha definida (senha_portalnula ou vazia), o sistema utiliza como fallback de senha os primeiros 6 dígitos do CPF (removendo a formatação), ou uma string vazia caso o CPF também não esteja disponível. - Validação de Status: Se a conta do aluno estiver inativa no banco (
status !== 'active'), o login é rejeitado com o código HTTP403 Forbidden.
- O endpoint
- Geração e Persistência de Sessão:
- Ao autenticar com sucesso, o servidor assina um token JWT (JSON Web Token) com expiração de 7 dias (
expiresIn: '7d'), contendo informações não sensíveis no payload (studentId,enrollmentNumberename). - No frontend (AuthContext.tsx), esse JWT é guardado no
localStoragedo navegador sob a chaveportal_token, juntamente com os dados do usuário emportal_user.
- Ao autenticar com sucesso, o servidor assina um token JWT (JSON Web Token) com expiração de 7 dias (
- Proteção de Rotas (Backend API):
- Foi implementado um middleware de segurança centralizado no backend chamado authMiddleware.
- Esse middleware intercepta as requisições, extrai o JWT do cabeçalho
Authorization: Bearer <token>, e faz a validação da assinatura utilizando a variável de ambienteJWT_SECRET. Se o token for inválido ou estiver expirado, ele retorna imediatamente401 Unauthorized. - Todas as rotas sensíveis do aluno (
/api/portal/me,/api/portal/financeiro,/api/portal/boletos,/api/portal/notas,/api/portal/frequencia,/api/portal/contratos,/api/portal/avaliacoes,/api/portal/alterar-senha, etc.) estão devidamente protegidas peloauthMiddlewareno backend.
2. Segurança no EduManager (Painel Administrativo — manager)
A arquitetura de segurança do Painel Administrativo possui particularidades importantes. Enquanto o frontend gerencia e restrinja as exibições com base na sessão local, o backend das APIs administrativas do Manager adota uma abordagem menos restritiva de verificação.
- Autenticação no Frontend:
- O painel administrativo restringe o acesso aos componentes da interface gerenciando o estado de login através do index.tsx.
- As sessões administrativas ativas são salvas no
localStoragesob a chaveedumanager_sessioncontendo o objeto de perfil do usuário.
- Mecanismo de Login:
- O endpoint
POST /api/auth/loginem server.selfhosted.js pesquisa o usuário na tabelausuariosdo Postgres pelo campousername. - Assim como no portal, a comparação de senhas ocorre em texto plano (
user.password !== password). - Se as credenciais forem válidas, o servidor gera um JWT contendo
{ userId, username, role }assinado com oJWT_SECRETcom validade de 24 horas.
- O endpoint
- Exposição de Rotas do Backend (API Administrativa aberta):
- Ponto Crítico: Diferente do Portal do Aluno, no backend do Painel Administrativo (server.selfhosted.js), as APIs de gerenciamento de dados principais (
/api/school-data,/api/alunos,/api/turmas,/api/cobrancas, etc.) não implementam uma verificação ativa de JWT (Authorization Middleware). - O frontend (dbService.ts) faz chamadas comuns via
fetchsem incluir o cabeçalhoAuthorization: Bearer <token>. Como consequência, as rotas do backend do Manager estão abertas para requisições diretas de qualquer cliente que conheça os caminhos das rotas, confiando exclusivamente em isolamento de rede ou segurança por obscuridade.
- Ponto Crítico: Diferente do Portal do Aluno, no backend do Painel Administrativo (server.selfhosted.js), as APIs de gerenciamento de dados principais (
3. Armazenamento de Senhas e Segurança de Dados (PostgreSQL)
A persistência do banco de dados PostgreSQL 15 local segue regras estritas estabelecidas em schema.sql:
- Senhas em Texto Claro (Plain Text):
- As senhas dos usuários administrativos (tabela
usuarios) e dos alunos (tabelaalunosno camposenha_portal) são persistidas no banco sem uso de hashing unidirecional (como bcrypt, argon2 ou scrypt). Elas são guardadas e comparadas de forma literal.
- As senhas dos usuários administrativos (tabela
- Usuário Padrão Inicial:
- O script SQL inicial insere automaticamente o usuário administrador padrão com login
admine senhaadmin(default-admin).
- O script SQL inicial insere automaticamente o usuário administrador padrão com login
- Integridade Biométrica (Anti-Sobrescrita):
- Conforme as regras do
GEMINI.md, a tabela de alunos armazena dados de biometria facial na colunaface_descriptor(do tipoJSONB). As rotas de sincronização de dados protegem essa coluna usando instruçõesCOALESCEnoON CONFLICTpara evitar que biometrias e fotos válidas sejam sobrescritas com valores nulos por sincronizações vindas do JSON legado.
- Conforme as regras do
4. Segurança no Upload e Armazenamento de Mídia (MinIO S3)
- Isolamento de Credenciais:
- Todas as credenciais de serviços de terceiros e storage (como
MINIO_ACCESS_KEY,MINIO_SECRET_KEY,ASAAS_API_KEY,DATABASE_URLeJWT_SECRET) estão isoladas no arquivo.enve injetadas pelo container Docker. O frontend não tem acesso a essas variáveis, evitando vazamento de credenciais privadas.
- Todas as credenciais de serviços de terceiros e storage (como
- Proxy de Mídia Relativo:
- Tanto o Manager quanto o Portal servem mídias (fotos de alunos, anexos de justificativas de falta, comprovantes de pagamento e logotipos) através de uma rota dedicada de proxy interno
/storage/:bucket/:key(exemplo: server.selfhosted.js). - Este proxy acessa internamente o MinIO usando o SDK da AWS e transfere os arquivos por fluxo de dados (
data.Body.pipe(res)), ocultando as URLs físicas e as credenciais internas do storage. - Essas rotas de proxy são públicas, ou seja, não validam o JWT do aluno ou administrador para entregar a imagem solicitada, garantindo que o carregamento das mídias em tags
<img>ocorra sem interrupções por CORS ou autenticação.
- Tanto o Manager quanto o Portal servem mídias (fotos de alunos, anexos de justificativas de falta, comprovantes de pagamento e logotipos) através de uma rota dedicada de proxy interno
💡 Principais Pontos de Atenção e Recomendações
Com base no exposto, identifico três pontos sensíveis na arquitetura de segurança atual para seu conhecimento:
- Exposição de API Administrativa: O backend do EduManager confia no frontend para ocultar as ações, mas as rotas
/api/school-data(que lê e escreve toda a base de dados do sistema, incluindo dados financeiros do Asaas) estão abertas e expostas sem validação de tokens JWT no backend do Express. - Senhas sem Hash: O armazenamento e validação de senhas em texto plano tanto na tabela
usuariosquanto na tabelaalunosrepresenta uma vulnerabilidade em caso de vazamento físico ou acesso não autorizado ao banco de dados. - Senha Padrão Ativa: Recomenda-se alterar a senha do usuário padrão
admincriada no banco assim que possível caso esteja em ambiente de produção.