# 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/login` em [server.selfhosted.js](file:///c:/Users/Sidney/Documents/edumanagerpro2/portal/server.selfhosted.js#L106-L180) 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_portal` do banco de dados PostgreSQL. Se o aluno não tiver uma senha definida (`senha_portal` nula 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 HTTP `403 Forbidden`. * **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`, `enrollmentNumber` e `name`). * No frontend ([AuthContext.tsx](file:///c:/Users/Sidney/Documents/edumanagerpro2/portal/src/context/AuthContext.tsx#L126-L127)), esse JWT é guardado no `localStorage` do navegador sob a chave `portal_token`, juntamente com os dados do usuário em `portal_user`. * **Proteção de Rotas (Backend API):** * Foi implementado um middleware de segurança centralizado no backend chamado [authMiddleware](file:///c:/Users/Sidney/Documents/edumanagerpro2/portal/server.selfhosted.js#L86-L99). * Esse middleware intercepta as requisições, extrai o JWT do cabeçalho `Authorization: Bearer `, e faz a validação da assinatura utilizando a variável de ambiente `JWT_SECRET`. Se o token for inválido ou estiver expirado, ele retorna imediatamente `401 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 pelo `authMiddleware` no 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](file:///c:/Users/Sidney/Documents/edumanagerpro2/manager/index.tsx#L55-L60). * As sessões administrativas ativas são salvas no `localStorage` sob a chave `edumanager_session` contendo o objeto de perfil do usuário. * **Mecanismo de Login:** * O endpoint `POST /api/auth/login` em [server.selfhosted.js](file:///c:/Users/Sidney/Documents/edumanagerpro2/manager/server.selfhosted.js#L439-L467) pesquisa o usuário na tabela `usuarios` do Postgres pelo campo `username`. * 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 o `JWT_SECRET` com validade de **24 horas**. * **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](file:///c:/Users/Sidney/Documents/edumanagerpro2/manager/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](file:///c:/Users/Sidney/Documents/edumanagerpro2/manager/services/dbService.ts#L195-L264)) faz chamadas comuns via `fetch` sem incluir o cabeçalho `Authorization: Bearer `. 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. --- ## 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](file:///c:/Users/Sidney/Documents/edumanagerpro2/schema.sql): * **Senhas em Texto Claro (Plain Text):** * As senhas dos usuários administrativos (tabela `usuarios`) e dos alunos (tabela `alunos` no campo `senha_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. * **Usuário Padrão Inicial:** * O script SQL inicial insere automaticamente o usuário administrador padrão com login `admin` e senha `admin` (`default-admin`). * **Integridade Biométrica (Anti-Sobrescrita):** * Conforme as regras do `GEMINI.md`, a tabela de alunos armazena dados de biometria facial na coluna `face_descriptor` (do tipo `JSONB`). As rotas de sincronização de dados protegem essa coluna usando instruções `COALESCE` no `ON CONFLICT` para evitar que biometrias e fotos válidas sejam sobrescritas com valores nulos por sincronizações vindas do JSON legado. --- ## 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_URL` e `JWT_SECRET`) estão isoladas no arquivo `.env` e injetadas pelo container Docker. O frontend não tem acesso a essas variáveis, evitando vazamento de credenciais privadas. * **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](file:///c:/Users/Sidney/Documents/edumanagerpro2/manager/server.selfhosted.js#L416-L431)). * 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 `` ocorra sem interrupções por CORS ou autenticação. --- ## 💡 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: 1. **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. 2. **Senhas sem Hash:** O armazenamento e validação de senhas em texto plano tanto na tabela `usuarios` quanto na tabela `alunos` representa uma vulnerabilidade em caso de vazamento físico ou acesso não autorizado ao banco de dados. 3. **Senha Padrão Ativa:** Recomenda-se alterar a senha do usuário padrão `admin` criada no banco assim que possível caso esteja em ambiente de produção.