Logs e Auditoria — Especificação (v1.0)

Documentos desta funcionalidade: 01 - Definição (v1.0) · 02 - Especificação (v1.0) · 03 - Protótipo (v1.0, código em 03 - Protótipo v1.0.html) · 04 - Mapeamento de Banco de Dados (v1.0) · Cenários de Teste (v1.0) · 05 - Registro de Decisões (v1.0)

Rascunho v1.0. Itens sem origem em decisão do solicitante, DDL, SBIS ou documento do projeto estão marcados [PROPOSTA]. Revisão por Dois Críticos pendente.


2.1 Premissa de design

O desenvolvedor não deve precisar lembrar de registrar. O caminho padrão registra; o caminho de exceção exige justificativa escrita ([NotAudited("motivo")]) e é visível em revisão. O usuário final só enxerga um código de suporte; o auditor só enxerga uma linha do tempo.

2.2 Histórias de usuário

IDComo…Quero…Para…
US-LOG-01Suportever tudo que aconteceu com um usuário em um intervalo, a partir do código de suporteachar a causa de um problema pontual
US-LOG-02Suportever a saúde geral (erros, lentidão, falhas de banco, por cliente quando for o banco)perceber anomalias antes do cliente
US-LOG-03Usuário clínicoreceber, no erro, uma mensagem simples com um códigoinformar ao suporte sem termos técnicos
US-LOG-04Auditorconsultar a trilha em ordem cronológicasaber quem fez o quê
US-LOG-05Auditorfiltrar por período, evento, usuário e registro afetado (paciente)investigar um caso
US-LOG-06Auditorexportar o resultado em formato abertoentregar evidência ao certificador
US-LOG-07Sistemaregistrar abertura de prontuário e consultascumprir NGS1.07.03a
US-LOG-08Sistemaregistrar criação, alteração e inativação com os nomes dos camposrastrear escrita sem guardar valores
US-LOG-09Sistemaregistrar eventos de segurança no repositório globalcumprir NGS1.07.03b/c
US-LOG-10Desenvolvedordeclarar a auditoria de um endpoint com um atributoincorporar sem esforço
US-LOG-11Desenvolvedorser avisado por build, inicialização e CI quando faltarnão esquecer
US-LOG-12Administradorconceder o direito de visualizar a auditoria a um perfillimitar o acesso (NGS1.07.02)

2.3 Descrição funcional

2.3.1 Log de sistema

  • Pacote Gemed.Telemetry [PROPOSTA]: AddGemedTelemetry() configura OpenTelemetry (.NET SDK), ILogger com saída JSON, middleware de traceId e enriquecimento do contexto (tenant, clínica, usuário).
  • Fluxo: aplicação → OTel Collector (redação, buffer, roteamento) → Loki (logs), Prometheus (métricas) e, opcionalmente, Tempo.
  • Rótulos do Loki: service, environment, level. Os demais campos são metadados estruturados (RN-LOG-006).
  • Métricas (RN-LOG-007): gemed_http_request_duration_seconds{endpoint,status_class} sem tenant; gemed_tenant_requests_total{tenant,status_class}; gemed_db_connection_failures_total{tenant}; gemed_db_query_duration_seconds{tenant}; gemed_db_timeouts_total{tenant}. Nomes [PROPOSTA].
  • Dashboards [PROPOSTA]: “Um usuário” (entrada: traceId ou userId; mostra a sequência de requisições, erros e tempos) e “Saúde geral” (taxa de erro por serviço, latência por endpoint, falhas de banco por tenant).
  • Alertas [PROPOSTA]: taxa de erro 5xx acima do limiar por serviço; falha de conexão de banco de qualquer tenant; latência p95 acima do limiar; ausência de logs de um serviço. Limiares após medir volume.
  • Eventos catalogados: SYS-<área>-<nnn>. Primeiro: SYS-TRD-001 (tradução ausente, DT-011). Geração por [LoggerMessage].

2.3.2 Trilha de auditoria

  • Pacote Gemed.Audit [PROPOSTA]: AddGemedAudit(), IAuditTrail, [Audited], [NotAudited], AuditEventType, interceptador de gravação, analisador Roslyn.
  • Captura de leitura: [Audited(AuditEventType.RegistroConsulta, recurso: "Prontuario")] no endpoint ou caso de uso; o comportamento de pipeline lê o identificador do registro afetado do resultado ou da rota.
  • Captura de escrita: SaveChangesInterceptor do EF Core grava, na mesma transação, um evento por entidade alterada com os nomes dos campos alterados. Sem EF Core: decorador do repositório (P-LOG-05).
  • Captura de segurança: IAuditTrail.Record(tipo, usuário, complemento) chamada pelo serviço de segurança.
  • Supressão: por tipo de evento, com INSERT … WHERE NOT EXISTS sobre a chave (usuário, tipo, registro, janela) (RN-LOG-020).
  • Integridade, fase 1: hash_linha = SHA-256(campos canônicos) calculado pela aplicação; papel de banco só com INSERT e SELECT (RN-LOG-013, 025).

2.3.3 Catálogo de eventos (AuditEventType)

Repositório: G = global (IpSeguranca), C = por cliente. Falha fechada: S = sim. Atribuição de repositório e janelas são [PROPOSTA]; o item NGS vem do requisito.

CódigoEventoCategoriaNGSRepoFalha fechadaSupressão
AUD-RES-001Criação de registro do RESClínica07.03aCSnão
AUD-RES-002Duplicação de registro do RESClínica07.03aCSnão
AUD-RES-003Consulta de registro do RES (abertura de prontuário)Clínica07.03aCSum por abertura e por usuário/paciente na janela (parâmetro)
AUD-RES-004Inativação de registro do RESClínica07.03aCSnão
AUD-RES-005Alteração de registro do RES (nomes dos campos)Clínica07.03a (implícito)CSnão
AUD-RES-006Importação de dadosClínica07.03aCSnão
AUD-RES-007Exportação de dadosClínica07.03aCSnão
AUD-RES-008Impressão de registro do RESClínica07.03aCSnão
AUD-RES-009Solicitação de acesso de emergência (reservado)Clínica07.03a / 11.07CSnão
AUD-RES-010Registro ou alteração de termo de consentimentoClínica07.03aCSnão
AUD-RES-011Regra de apoio à decisão clínica (criar, inativar, alterar)Clínica07.03aCSnão
AUD-RES-012Validação de registro de preceptoriaClínica07.04aCSnão
AUD-USR-001Autenticação com sucessoOperacional07.03bGSnão
AUD-USR-002Autenticação sem sucessoOperacional07.03bGSnão
AUD-USR-003Troca de senhaOperacional07.03bGSnão
AUD-USR-004Assinatura digital realizadaClínica07.03bCSnão
AUD-USR-005Validação de assinatura digitalClínica07.03bCSnão
AUD-USR-006Falha de assinatura ou de validaçãoClínica07.03bCSnão
AUD-USR-007Solicitação de esquecimentoOperacional07.03bCSnão
AUD-USR-008Encerramento ou bloqueio de sessãoOperacional07.04bGSnão
AUD-USR-009Desbloqueio de sessãoOperacional07.04bGSnão
AUD-USR-010Aceitação do termo de usoOperacional07.04bGSnão
AUD-OPE-001Gestão de usuários e perfis (criar, alterar, inativar/bloquear, ativar/desbloquear)Operacional07.03cGSnão
AUD-OPE-002Cópia de segurança e restauraçãoOperacional07.03cCSnão
AUD-OPE-003Configuração do sistemaOperacional07.04cG ou C, conforme o parâmetroSnão
AUD-OPE-004Geração de senha para usuárioOperacional07.04cGSnão
AUD-OPE-005Acesso aos registros de auditoria (consulta e exportação)Operacional07.04cGSnão
AUD-OPE-006Erro de processo operacional, com descriçãoOperacional07.04cCnãonão
AUD-OPE-010Criação, alteração ou inativação de cadastro fora do RESOperacional— (decisão do solicitante: auditoria no sistema todo)CSnão

Evento de preceptoria, revogação de certificado (NGS2) e demais itens “quando contemplados pelo sistema” entram no catálogo quando a funcionalidade existir. A matriz de conformidade NGS1.07.03/.04 é gerada a partir desta enumeração.

2.3.4 Campos do registro (NGS1.07.05)

Identificador único; data e hora UTC; tipo de evento; categoria; componente e IP; usuário (GUID global em G; GUID global também em C, mapeável ao IdUsuario local); identificador do registro afetado (IdPaciente quando houver; recurso e id do recurso nos demais casos); tenant (ClienteBDId); informação complementar (JSON, sem valores clínicos); hash_linha. Detalhe de tipos na seção 4.

2.3.5 Tela do auditor

Rota e menu no contexto Segurança [PROPOSTA]: “Auditoria”. Lista cronológica (mais recente primeiro) com colunas Data e hora, Evento, Usuário, Registro afetado, Origem (IP/componente), Categoria; filtros por período (obrigatório, limite de intervalo por parâmetro), evento (seleção múltipla do catálogo), usuário (autocomplete por nome, filtro pelo GUID) e registro afetado (autocomplete de paciente por nome ou prontuário, filtro pelo IdPaciente). O detalhe abre em painel lateral. Exportar respeita os filtros. Protótipo em 03.

2.3.6 Salvaguardas para o desenvolvedor

  1. Analisador Roslyn (erro de build): endpoint ou caso de uso sem [Audited] nem [NotAudited("motivo")]; [NotAudited] sem motivo; entidade clínica sem cobertura do interceptador.
  2. Varredura na inicialização: percorre EndpointDataSource e derruba a aplicação listando os endpoints sem declaração.
  3. Teste de arquitetura (NetArchTest) no CI: controladores e casos de uso declaram o atributo; ninguém referencia o DbContext fora do ponto autorizado.
  4. Dependência obrigatória: a aplicação não inicia sem AddGemedAudit() e AddGemedTelemetry().
  5. Template dotnet new gemed-api já traz tudo configurado.
  6. Biblioteca de Schema: estender a detecção de “tabelas sem o padrão dos 16 campos” para exigir cobertura de auditoria nas tabelas clínicas.

2.4 Critérios de aceite

IDCritérioUSRN
CA-LOG-001.1Dado um erro 500 em uma requisição, então a resposta ao usuário traz mensagem não técnica e o traceId como código, e o log de sistema tem o mesmo traceIdUS-LOG-03RN-LOG-004
CA-LOG-001.2Dado o traceId, então o dashboard “Um usuário” mostra a sequência das requisições do usuário no intervaloUS-LOG-01RN-LOG-002
CA-LOG-002.1Dado qualquer registro do log de sistema, então não contém nome, CPF, prontuário nem valor clínicoUS-LOG-01RN-LOG-003
CA-LOG-002.2Dado o Loki, então os rótulos são apenas service, environment e levelUS-LOG-02RN-LOG-006
CA-LOG-003.1Dada falha de conexão com o banco de um tenant, então a métrica de banco com tenant aumenta e o alerta disparaUS-LOG-02RN-LOG-007, 008
CA-LOG-004.1Dado o Collector indisponível, então a operação do usuário conclui e o log é reenviado depoisUS-LOG-01RN-LOG-010
CA-LOG-005.1Dada a abertura de um prontuário, então há exatamente um evento AUD-RES-003 com o IdPaciente e sem nome, CPF ou prontuárioUS-LOG-07RN-LOG-015, 019
CA-LOG-005.2Dada nova abertura do mesmo prontuário pelo mesmo usuário dentro da janela de supressão, então nenhum novo evento é gravadoUS-LOG-07RN-LOG-020
CA-LOG-006.1Dada a alteração de um registro clínico, então o evento lista os nomes dos campos alterados e nenhum valorUS-LOG-08RN-LOG-016
CA-LOG-006.2Dada falha na gravação do evento clínico, então a operação inteira é desfeita e o usuário vê mensagem com códigoUS-LOG-08RN-LOG-014
CA-LOG-007.1Dada tentativa de login inválida, então há evento AUD-USR-002 em IpSeguranca, sem a senhaUS-LOG-09RN-LOG-012
CA-LOG-007.2Dada a troca de senha, o bloqueio de conta e a gestão de perfil, então há evento no repositório globalUS-LOG-09RN-LOG-012
CA-LOG-008.1Dado o papel de banco da aplicação, então UPDATE, DELETE e TRUNCATE na trilha são recusadosUS-LOG-04RN-LOG-013
CA-LOG-008.2Dada uma linha da trilha, então o hash_linha confere com o recálculo dos camposUS-LOG-04RN-LOG-025
CA-LOG-009.1Dado um usuário sem o direito de auditoria, então a rota e a API retornam acesso negadoUS-LOG-12RN-LOG-022
CA-LOG-009.2Dada qualquer consulta ou exportação da trilha, então há evento AUD-OPE-005US-LOG-04RN-LOG-022
CA-LOG-010.1Dada a consulta com período, então a lista vem em ordem cronológica e mescla os repositórios global e do clienteUS-LOG-04RN-LOG-012, 023
CA-LOG-010.2Dados filtros de evento, usuário e registro afetado, então só voltam eventos que atendem a todosUS-LOG-05RN-LOG-023
CA-LOG-010.3Dado um evento antigo (fora da retenção quente, se houver), então ele continua visível na listaUS-LOG-04RN-LOG-023
CA-LOG-011.1Dada a exportação, então o arquivo é CSV ou JSON, com software e instituição (nome, CNES, CNPJ) no cabeçalho e datas em RFC 3339US-LOG-06RN-LOG-024
CA-LOG-012.1Dado um endpoint sem [Audited] nem [NotAudited], então o build falhaUS-LOG-11RN-LOG-021
CA-LOG-012.2Dado o mesmo endpoint em um build que passou por fora, então a aplicação não inicia e lista o endpointUS-LOG-11RN-LOG-021
CA-LOG-012.3Dada a aplicação sem AddGemedAudit(), então não iniciaUS-LOG-11RN-LOG-021
CA-LOG-013.1Dados relógios dos componentes, então os instantes gravados são UTCUS-LOG-04RN-LOG-027

2.5 Fluxos de exceção

IDSituaçãoComportamentoRecuperação
EX-LOG-01Falha ao gravar evento de falha fechadaOperação desfeita; mensagem LOG-EMSG-06 com código; log de sistema nível Error com SYS-AUD-001Usuário repete; suporte vê o motivo pelo traceId
EX-LOG-02Falha ao gravar AUD-OPE-006 (falha aberta)Operação segue; evento vai ao log de sistema (SYS-AUD-002)Suporte reprocessa se necessário
EX-LOG-03Collector ou Loki indisponíveisBuffer local; reenvio; alerta de ausência de logsAutomática
EX-LOG-04Auditor sem direitoAcesso negado (LOG-EMSG-02); evento de tentativa fica no log de sistemaAdministrador concede o direito
EX-LOG-05Período inválido ou acima do limiteLOG-EMSG-03; nada é consultadoUsuário ajusta o período
EX-LOG-06Consulta sem resultadosLOG-EMSG-04Usuário ajusta os filtros
EX-LOG-07Repositório global ou do cliente indisponível na consultaMostra o que veio, com aviso de que um repositório não respondeu (LOG-EMSG-07)Tentar novamente
EX-LOG-08Exportação muito grandeGerada em segundo plano; LOG-EMSG-05 ao concluirBaixar quando pronta
EX-LOG-09Paciente unificado (merge)Consulta por IdPaciente usa a tabela de equivalência—

2.6 Validações

Período obrigatório, início anterior ao fim, intervalo máximo por parâmetro; evento deve existir no catálogo; usuário e registro afetado por identificador válido; exportação só nos formatos oferecidos. Toda validação ocorre na API (a interface só orienta).

2.7 Componentes de interface

Cabeçalho da tela; barra de filtros (período, evento, usuário, registro afetado) com chips dos filtros ativos; lista cronológica com rolagem por cursor; painel de detalhe; botão primário “Exportar” (um por região, Design System 12); aviso de repositório indisponível; estado vazio. Ícones Lucide [PROPOSTA]: shield-check (menu), filter, download, user, file-text, clock, triangle-alert. Tokens do Design System; sem cores fixas; tema claro e escuro.

2.8 Integração com backend [PROPOSTA]

Método e rotaFunção
GET /api/auditoria/eventos?de&ate&evento[]&usuarioId&registroId&categoria&cursor&limiteLista mesclada e cronológica
GET /api/auditoria/eventos/{id}Detalhe (campos alterados, componente, IP)
GET /api/auditoria/tipos-eventoCatálogo para o filtro
POST /api/auditoria/exportacoes (formato, filtros)Gera a exportação; devolve o arquivo ou um identificador
GET /api/auditoria/exportacoes/{id}Situação e download

Todos exigem o direito “Visualizar auditoria” (4.6) e geram AUD-OPE-005. A API consulta os dois repositórios e mescla por ocorrido_em, id.

2.9 Catálogo de mensagens (i18n)

IDTipopt-BRen-USes-419
LOG-EMSG-01ErroAlgo deu errado. Informe ao suporte o código {codigo}.Something went wrong. Give support the code {codigo}.Algo salió mal. Informe al soporte el código {codigo}.
LOG-EMSG-02ErroVocê não tem permissão para ver a auditoria.You don’t have permission to view the audit trail.No tiene permiso para ver la auditoría.
LOG-EMSG-03ErroInforme um período válido, com início antes do fim e até {dias} dias.Enter a valid period, start before end, up to {dias} days.Indique un período válido, con inicio antes del fin y hasta {dias} días.
LOG-EMSG-04VazioNenhum evento encontrado para os filtros escolhidos.No events found for the selected filters.No se encontraron eventos con los filtros elegidos.
LOG-EMSG-05InfoExportação pronta para baixar.Export ready to download.Exportación lista para descargar.
LOG-EMSG-06ErroNão foi possível concluir a operação. Informe ao suporte o código {codigo}.The operation could not be completed. Give support the code {codigo}.No fue posible completar la operación. Informe al soporte el código {codigo}.
LOG-EMSG-07AvisoParte dos registros não pôde ser consultada. Tente novamente.Some records could not be retrieved. Try again.No se pudo consultar parte de los registros. Intente de nuevo.

Rótulos da tela (Auditoria, Data e hora, Evento, Usuário, Registro afetado, Origem, Categoria, Clínica, Operacional, Exportar, Período, Filtros) seguem o mesmo padrão nos três idiomas e entram no dicionário de termos. ECF.17.18: pt-BR obrigatório.

2.10 Acessibilidade

Foco e estados de campo pelo Design System (seções 11 e 12); erro nunca só por cor; lista navegável por teclado; painel de detalhe com foco gerenciado e fechamento por Esc; tabelas com cabeçalhos associados; área tocável mínima de 44x44 px; mobile first (a lista vira cartões).

2.11 Conformidade SBIS

RequisitoEst.Como é atendidoOnde
NGS1.07.011Trilha contínua, sem desligamento; pacote obrigatórioRN-LOG-013, 021
NGS1.07.021Somente inserção; consulta restrita a auditor e administrador; selo adiado e a confirmar (P-LOG-06)RN-LOG-013, 022, 025
NGS1.07.031Catálogo AUD-RES, AUD-USR, AUD-OPE; matriz gerada2.3.3
NGS1.07.042Eventos avançados já no catálogo (AUD-RES-012, USR-008 a 010, OPE-003 a 006)2.3.3
NGS1.07.051Campos do registro2.3.4
NGS1.07.061ID opaco e nomes de campos; interpretação a confirmar (P-LOG-01)RN-LOG-015, 016
NGS1.07.071Tela cronológica com filtros; todos os registros visíveisRN-LOG-023
NGS1.07.083Exportação CSV/JSON com identificaçãoRN-LOG-024
NGS1.02.131Tentativas de login auditadas (a regra de bloqueio é do contexto Segurança)AUD-USR-002
NGS1.03.011Direito de visualização por perfilRN-LOG-022
NGS1.08.061Relógios em UTC; item no manual de operaçãoRN-LOG-027
NGS1.09.021RFC 3339 na exportaçãoRN-LOG-024
NGS1.11.073Evento reservado; funcionalidade futuraRN-LOG-029
ECF.17.191Mensagem simples com código; sem conteúdo técnicoRN-LOG-004