# Segurança e evolução

O HTML offline e o modo local são estáticos e não possuem autenticação ou backend. O modo compartilhado v0.3 adiciona login, perfis, auditoria e banco local, descritos ao final deste documento; ele é um piloto para rede privada, não uma implantação pública de produção. Não expor o servidor local diretamente à Internet. A alternativa HTTPS autenticada via Funnel está descrita em LINK_PUBLICO.md. Repositório privado não substitui controle de acesso ao sistema.

O HTML original contém dados pessoais e de saúde incorporados. A cópia local opcional foi preservada e é ignorada pelo Git; não é enviada nos novos commits, nem incluída no build ou nos testes sintéticos. O botão de carregamento legado só funciona se o arquivo existir localmente. Não publicar este checkout em hospedagem estática, pois o arquivo original continuaria acessível. Para produção, preparar artefato separado sem o HTML original nem bases identificáveis, após revisão autorizada. Não incluir dados reais em testes, capturas, logs ou relatórios de erro.

A aplicação processa CSVs em memória; não usa armazenamento persistente nem envia os registros a terceiros. Fechar/recarregar a aba perde o estado. Limpar sessão remove as referências da aplicação, sem promessa de apagamento forense da memória. Exportações contêm dados identificáveis e precisam de proteção pelo profissional responsável.

O servidor de desenvolvimento escuta apenas em 127.0.0.1, bloqueia caminhos ocultos e listagem de diretórios, e envia no-store, nosniff e proteção contra frames. O documento novo restringe recursos por CSP; o HTML legado não recebe a mesma garantia. Essas medidas não equivalem a autenticação.

## Antes de operar com múltiplos usuários

- Autenticação institucional e MFA, perfis por função, município/equipe e autorização no servidor para cada consulta/exportação.
- Backend com validação de entrada, limites, TLS, segredos fora do código, criptografia e backups testados.
- Minimização de dados, finalidade e base legal definidas com responsáveis LGPD, retenção e descarte, trilha de acesso sem conteúdo clínico desnecessário.
- Importações em área protegida; revisão de identidade/duplicidade; transações e proveniência por arquivo e versão de regra.
- Auditoria de alterações e exportações, monitoramento de acessos e plano de resposta a incidentes.
- Homologação independente das regras e integração dos critérios completos antes de qualquer cálculo oficial. Os anexos fornecidos foram confrontados com as práticas, mas sua autenticidade/vigência não foi consultada no SEI.

## Sessão protegida

O botão **Salvar sessão protegida** gera um arquivo `.pecenc`, criptografado com AES-256-GCM e chave derivada da senha por PBKDF2-SHA-256 (310.000 iterações), com salt e IV aleatórios por arquivo. A senha não é gravada no arquivo nem enviada a servidor. São salvos relatórios PEC, listas SIAPS normalizadas, referência e filtros. Os checks são recalculados ao reabrir; a versão da regra é registrada para avisar sobre mudanças.

Não há autosave, sincronização ou recuperação de senha. O profissional deve concluir o download, guardar arquivo e senha com segurança e salvar novamente após novas importações. Fechar/recarregar a aba perde a sessão que não foi exportada. Limpar a sessão não apaga arquivos já baixados. A proteção depende da força da senha e da segurança do dispositivo; não substitui autenticação institucional. Exportações CSV continuam contendo dados identificáveis em texto aberto.

Arquivos SIAPS XLSX são interpretados localmente, sem executar macros ou fórmulas. Entradas XML com entidades são recusadas; há limites de arquivo, linhas, colunas e descompactação, além da verificação de tamanho e CRC das entradas ZIP. Erros de importação do lote não substituem listas válidas existentes. Arquivos de sessão são autenticados pelo AES-GCM e validados antes da substituição do estado atual.

Impressões e PDFs gerados pelo botão Imprimir lista contêm os registros do filtro, incluindo identificadores. Não são criptografados como os arquivos .pecenc; mantenha-os sob acesso autorizado. A área de impressão é limpa ao concluir o diálogo de impressão e ao limpar a sessão.

## Modo compartilhado de notebook — v0.3

O modo `--shared` adiciona autenticação de contas individuais, perfis admin/profissional, troca obrigatória de senha inicial, revogação de sessões, proteção CSRF/origem/Host, limitação de tentativas de login, auditoria e persistência transacional SQLite. O servidor aceita loopback e VPN Tailscale por padrão e não oferece os arquivos do banco, backups, código Python ou HTML legado por HTTP. O histórico de auditoria não inclui conteúdo clínico ou senhas.

Os arquivos SQLite/backups não são criptografados pela aplicação: proteja o dispositivo com BitLocker/LUKS, a conta do sistema operacional e cópias externas autorizadas. O HTTP remoto exige o túnel privado; não exponha portas públicas nem desative o firewall. `--allow-lan` é opcional e não protege HTTP direto na LAN. Certificados TLS podem ser configurados explicitamente.

Este é um piloto para cerca de dez profissionais. Na versão 0.5, o servidor separa o acesso por ESF; o gestor municipal consulta as quatro e o administrador organiza as bases. Ainda não há restrição por microárea dentro da ESF, alta disponibilidade, armazenamento clínico criptografado em aplicação ou recuperação automática de desastre. A aprovação institucional e os requisitos de operação definitiva continuam necessários. Veja `ACESSO_COMPARTILHADO.md`.

A auditoria das exportações/impressões registra as solicitações feitas pelos botões da interface, não comprova a conclusão física da impressão nem impede cópias por um usuário que já recebeu os dados. A leitura da base também é auditada pela API. O notebook precisa permanecer atualizado, protegido e sob responsabilidade institucional.

## Link HTTPS — v0.4

O iniciador público configura uma origem HTTPS explícita e restringe o backend ao loopback. O Funnel publica a página de login e encaminha ao backend autenticado; os profissionais dispensam a VPN. Cookies públicos são Secure, a origem é validada e cabeçalhos encaminhados só são aceitos para o hostname configurado em conexão local. O modo padrão continua privado. O link depende do notebook e encerra junto com o processo Funnel em primeiro plano. Veja [LINK_PUBLICO.md](LINK_PUBLICO.md).

## Autorização por ESF — v0.5

Cada ESF tem payload e revisão independentes no SQLite. A API resolve a unidade a partir do perfil/vínculo atual da sessão e rejeita tentativas de consultar outra ESF. O gestor municipal pode consolidar somente as quatro bases classificadas, sem a base anterior pendente. Alterações de acesso e exclusões revogam sessões. A migração mantém profissionais antigos sem unidade bloqueados até atribuição explícita. Backups abrangem todas as unidades. Veja [UNIDADES_ESF.md](UNIDADES_ESF.md).

## Importação municipal SIAPS — v0.6

As rotas de prévia, gravação municipal e leitura de pendências exigem perfil administrador. Os envios JSON exigem CSRF/origem válidos. O servidor valida os relatórios e determina o destino pelo CNES cadastrado, sem confiar em uma divisão enviada pelo navegador. Uma transação e revisões das quatro ESFs impedem confirmação parcial. Pendências permanecem fora das bases de consulta dos profissionais/gestor. A auditoria registra indicadores e quantidades, sem identificadores clínicos. Veja [IMPORTACAO_SIAPS.md](IMPORTACAO_SIAPS.md).
