Skip to main content

Sistema de Auditoria

Visão Geral

O sistema de auditoria do RiskFlow registra e permite consultar todas as operações realizadas no sistema, garantindo rastreabilidade, conformidade e segurança. Este módulo mantém um histórico detalhado de ações, alterações e acessos, permitindo identificar quem fez o quê, quando e onde, além de fornecer estatísticas de uso e histórico completo de entidades.

Endpoints

1. Listar Registros de Auditoria

Retorna uma lista paginada de registros de auditoria com filtros diversos.

GET /api/auditoria

Parâmetros de Consulta

ParâmetroTipoObrigatórioDescrição
entidadestringNãoFiltrar por tipo de entidade (ex: "analise", "usuario")
entidade_iduuidNãoFiltrar por ID da entidade
operacaostringNãoFiltrar por tipo de operação (ex: "criar", "atualizar", "excluir")
usuario_iduuidNãoFiltrar por ID do usuário que realizou a operação
data_iniciostring (date-time)NãoData inicial para filtro (formato: YYYY-MM-DDThh:mm:ssZ)
data_fimstring (date-time)NãoData final para filtro (formato: YYYY-MM-DDThh:mm:ssZ)
nivelstringNãoFiltrar por nível de severidade (info, alerta, erro, critico)
pageintegerNãoNúmero da página (padrão: 1)
limitintegerNãoItens por página (padrão: 20, máx: 100)

Exemplo de Requisição (cURL)

curl -X GET \
'http://localhost:3000/api/auditoria?entidade=analise&operacao=atualizar&data_inicio=2025-05-01T00:00:00Z&data_fim=2025-05-31T23:59:59Z&page=1&limit=20' \
-H 'x-api-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'

Exemplo de Requisição (JavaScript - Fetch API)

const token = localStorage.getItem('token');

const params = new URLSearchParams({
entidade: 'analise',
operacao: 'atualizar',
data_inicio: '2025-05-01T00:00:00Z',
data_fim: '2025-05-31T23:59:59Z',
page: 1,
limit: 20
});

fetch(`http://localhost:3000/api/auditoria?${params.toString()}`, {
method: 'GET',
headers: {
'x-api-key': token
}
})
.then(response => response.json())
.then(data => console.log('Registros de auditoria:', data))
.catch(error => console.error('Erro ao buscar registros de auditoria:', error));

Exemplo de Requisição (Node.js - Axios)

const axios = require('axios');
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';

axios.get('http://localhost:3000/api/auditoria', {
params: {
entidade: 'analise',
operacao: 'atualizar',
data_inicio: '2025-05-01T00:00:00Z',
data_fim: '2025-05-31T23:59:59Z',
page: 1,
limit: 20
},
headers: {
'x-api-key': token
}
})
.then(response => {
console.log('Registros de auditoria:', response.data);
})
.catch(error => console.error('Erro ao buscar registros de auditoria:', error));

Resposta de Sucesso (200 OK)

{
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440200",
"timestamp": "2025-05-15T14:30:00Z",
"usuario": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva",
"email": "[email protected]"
},
"entidade": "analise",
"entidade_id": "550e8400-e29b-41d4-a716-446655440000",
"operacao": "atualizar",
"descricao": "Atualização de status da análise",
"dados_anteriores": {
"status": "EM_ANALISE"
},
"dados_novos": {
"status": "APROVADO"
},
"ip": "192.168.1.100",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"nivel": "info",
"request_id": "550e8400-e29b-41d4-a716-446655440300"
},
{
"id": "550e8400-e29b-41d4-a716-446655440201",
"timestamp": "2025-05-15T14:29:45Z",
"usuario": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva",
"email": "[email protected]"
},
"entidade": "analise",
"entidade_id": "550e8400-e29b-41d4-a716-446655440000",
"operacao": "atualizar",
"descricao": "Adição de parecer à análise",
"dados_anteriores": {
"pareceres": []
},
"dados_novos": {
"pareceres": [
{
"id": "550e8400-e29b-41d4-a716-446655440050",
"texto": "Análise aprovada conforme política de crédito."
}
]
},
"ip": "192.168.1.100",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"nivel": "info",
"request_id": "550e8400-e29b-41d4-a716-446655440301"
}
],
"pagination": {
"total": 45,
"page": 1,
"limit": 20,
"pages": 3
}
}

2. Buscar Registro de Auditoria por ID

Retorna um registro de auditoria específico pelo seu ID.

GET /api/auditoria/:id

Parâmetros de URL

ParâmetroTipoObrigatórioDescrição
iduuidSimID do registro de auditoria

Exemplo de Requisição (cURL)

curl -X GET \
'http://localhost:3000/api/auditoria/550e8400-e29b-41d4-a716-446655440200' \
-H 'x-api-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'

Exemplo de Requisição (JavaScript - Fetch API)

const token = localStorage.getItem('token');
const auditId = '550e8400-e29b-41d4-a716-446655440200';

fetch(`http://localhost:3000/api/auditoria/${auditId}`, {
method: 'GET',
headers: {
'x-api-key': token
}
})
.then(response => response.json())
.then(data => console.log('Registro de auditoria:', data))
.catch(error => console.error('Erro ao buscar registro de auditoria:', error));

Resposta de Sucesso (200 OK)

{
"id": "550e8400-e29b-41d4-a716-446655440200",
"timestamp": "2025-05-15T14:30:00Z",
"usuario": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva",
"email": "[email protected]"
},
"entidade": "analise",
"entidade_id": "550e8400-e29b-41d4-a716-446655440000",
"operacao": "atualizar",
"descricao": "Atualização de status da análise",
"dados_anteriores": {
"status": "EM_ANALISE"
},
"dados_novos": {
"status": "APROVADO"
},
"ip": "192.168.1.100",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"nivel": "info",
"request_id": "550e8400-e29b-41d4-a716-446655440300",
"modulo": "aprovacao-alcada",
"endpoint": "/api/aprovacoes-alcada/550e8400-e29b-41d4-a716-446655440010/decisao",
"metodo_http": "POST",
"duracao_ms": 245
}

Resposta de Erro (404 Not Found)

{
"error": {
"message": "Registro de auditoria não encontrado",
"code": "AUDIT_RECORD_NOT_FOUND",
"requestId": "550e8400-e29b-41d4-a716-446655440302"
}
}

3. Registrar Operação Manualmente

Registra uma operação de auditoria manualmente.

POST /api/auditoria

Corpo da Requisição

{
"entidade": "documento",
"entidade_id": "550e8400-e29b-41d4-a716-446655440400",
"operacao": "visualizar",
"descricao": "Visualização de documento confidencial",
"dados": {
"nome_documento": "Contrato.pdf",
"tipo": "Contrato de Crédito",
"tamanho": "1.2 MB"
},
"nivel": "info"
}

Exemplo de Requisição (cURL)

curl -X POST \
'http://localhost:3000/api/auditoria' \
-H 'Content-Type: application/json' \
-H 'x-api-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' \
-d '{
"entidade": "documento",
"entidade_id": "550e8400-e29b-41d4-a716-446655440400",
"operacao": "visualizar",
"descricao": "Visualização de documento confidencial",
"dados": {
"nome_documento": "Contrato.pdf",
"tipo": "Contrato de Crédito",
"tamanho": "1.2 MB"
},
"nivel": "info"
}'

Exemplo de Requisição (Node.js - Axios)

const axios = require('axios');
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';

const registroAuditoria = {
entidade: "documento",
entidade_id: "550e8400-e29b-41d4-a716-446655440400",
operacao: "visualizar",
descricao: "Visualização de documento confidencial",
dados: {
nome_documento: "Contrato.pdf",
tipo: "Contrato de Crédito",
tamanho: "1.2 MB"
},
nivel: "info"
};

axios.post('http://localhost:3000/api/auditoria', registroAuditoria, {
headers: {
'Content-Type': 'application/json',
'x-api-key': token
}
})
.then(response => {
console.log('Registro de auditoria criado:', response.data);
})
.catch(error => console.error('Erro ao criar registro de auditoria:', error));

Resposta de Sucesso (201 Created)

{
"id": "550e8400-e29b-41d4-a716-446655440202",
"timestamp": "2025-06-03T18:30:00Z",
"usuario": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva",
"email": "[email protected]"
},
"entidade": "documento",
"entidade_id": "550e8400-e29b-41d4-a716-446655440400",
"operacao": "visualizar",
"descricao": "Visualização de documento confidencial",
"dados": {
"nome_documento": "Contrato.pdf",
"tipo": "Contrato de Crédito",
"tamanho": "1.2 MB"
},
"ip": "192.168.1.100",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"nivel": "info",
"request_id": "550e8400-e29b-41d4-a716-446655440303",
"mensagem": "Registro de auditoria criado com sucesso"
}

4. Buscar Histórico de Entidade

Retorna o histórico completo de alterações de uma entidade específica.

GET /api/auditoria/entidade/:entidade/:entidadeId

Parâmetros de URL

ParâmetroTipoObrigatórioDescrição
entidadestringSimTipo de entidade (ex: "analise", "usuario")
entidadeIduuidSimID da entidade

Parâmetros de Consulta

ParâmetroTipoObrigatórioDescrição
data_iniciostring (date-time)NãoData inicial para filtro (formato: YYYY-MM-DDThh:mm:ssZ)
data_fimstring (date-time)NãoData final para filtro (formato: YYYY-MM-DDThh:mm:ssZ)
pageintegerNãoNúmero da página (padrão: 1)
limitintegerNãoItens por página (padrão: 20, máx: 100)

Exemplo de Requisição (cURL)

curl -X GET \
'http://localhost:3000/api/auditoria/entidade/analise/550e8400-e29b-41d4-a716-446655440000' \
-H 'x-api-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'

Exemplo de Requisição (JavaScript - Fetch API)

const token = localStorage.getItem('token');
const entidade = 'analise';
const entidadeId = '550e8400-e29b-41d4-a716-446655440000';

fetch(`http://localhost:3000/api/auditoria/entidade/${entidade}/${entidadeId}`, {
method: 'GET',
headers: {
'x-api-key': token
}
})
.then(response => response.json())
.then(data => console.log('Histórico da entidade:', data))
.catch(error => console.error('Erro ao buscar histórico da entidade:', error));

Resposta de Sucesso (200 OK)

{
"entidade": "analise",
"entidade_id": "550e8400-e29b-41d4-a716-446655440000",
"historico": [
{
"id": "550e8400-e29b-41d4-a716-446655440203",
"timestamp": "2025-05-15T10:00:00Z",
"usuario": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva"
},
"operacao": "criar",
"descricao": "Criação da análise",
"dados": {
"codigo": "ANL-2025-0001",
"tipo_analise": "Análise de Crédito",
"cliente": "Empresa ABC Ltda",
"valor": 500000.00,
"moeda": "BRL",
"status": "PENDENTE"
},
"nivel": "info"
},
{
"id": "550e8400-e29b-41d4-a716-446655440204",
"timestamp": "2025-05-15T10:30:00Z",
"usuario": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva"
},
"operacao": "atualizar",
"descricao": "Início do fluxo de aprovação",
"dados_anteriores": {
"status": "PENDENTE"
},
"dados_novos": {
"status": "EM_ANALISE",
"fluxo_id": "550e8400-e29b-41d4-a716-446655440010"
},
"nivel": "info"
},
{
"id": "550e8400-e29b-41d4-a716-446655440201",
"timestamp": "2025-05-15T14:29:45Z",
"usuario": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva"
},
"operacao": "atualizar",
"descricao": "Adição de parecer à análise",
"dados_anteriores": {
"pareceres": []
},
"dados_novos": {
"pareceres": [
{
"id": "550e8400-e29b-41d4-a716-446655440050",
"texto": "Análise aprovada conforme política de crédito."
}
]
},
"nivel": "info"
},
{
"id": "550e8400-e29b-41d4-a716-446655440200",
"timestamp": "2025-05-15T14:30:00Z",
"usuario": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva"
},
"operacao": "atualizar",
"descricao": "Atualização de status da análise",
"dados_anteriores": {
"status": "EM_ANALISE"
},
"dados_novos": {
"status": "APROVADO"
},
"nivel": "info"
}
],
"pagination": {
"total": 4,
"page": 1,
"limit": 20,
"pages": 1
}
}

5. Buscar Registros por ID de Requisição

Retorna todos os registros de auditoria associados a um ID de requisição específico.

GET /api/auditoria/request/:requestId

Parâmetros de URL

ParâmetroTipoObrigatórioDescrição
requestIduuidSimID da requisição

Exemplo de Requisição (cURL)

curl -X GET \
'http://localhost:3000/api/auditoria/request/550e8400-e29b-41d4-a716-446655440300' \
-H 'x-api-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'

Exemplo de Requisição (Node.js - Axios)

const axios = require('axios');
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
const requestId = '550e8400-e29b-41d4-a716-446655440300';

axios.get(`http://localhost:3000/api/auditoria/request/${requestId}`, {
headers: {
'x-api-key': token
}
})
.then(response => {
console.log('Registros da requisição:', response.data);
})
.catch(error => console.error('Erro ao buscar registros da requisição:', error));

Resposta de Sucesso (200 OK)

{
"request_id": "550e8400-e29b-41d4-a716-446655440300",
"timestamp": "2025-05-15T14:30:00Z",
"usuario": {
"id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva",
"email": "[email protected]"
},
"ip": "192.168.1.100",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"endpoint": "/api/aprovacoes-alcada/550e8400-e29b-41d4-a716-446655440010/decisao",
"metodo_http": "POST",
"duracao_total_ms": 245,
"registros": [
{
"id": "550e8400-e29b-41d4-a716-446655440200",
"timestamp": "2025-05-15T14:30:00Z",
"entidade": "analise",
"entidade_id": "550e8400-e29b-41d4-a716-446655440000",
"operacao": "atualizar",
"descricao": "Atualização de status da análise",
"dados_anteriores": {
"status": "EM_ANALISE"
},
"dados_novos": {
"status": "APROVADO"
},
"nivel": "info"
},
{
"id": "550e8400-e29b-41d4-a716-446655440201",
"timestamp": "2025-05-15T14:29:45Z",
"entidade": "analise",
"entidade_id": "550e8400-e29b-41d4-a716-446655440000",
"operacao": "atualizar",
"descricao": "Adição de parecer à análise",
"dados_anteriores": {
"pareceres": []
},
"dados_novos": {
"pareceres": [
{
"id": "550e8400-e29b-41d4-a716-446655440050",
"texto": "Análise aprovada conforme política de crédito."
}
]
},
"nivel": "info"
},
{
"id": "550e8400-e29b-41d4-a716-446655440205",
"timestamp": "2025-05-15T14:29:50Z",
"entidade": "fluxo_alcada",
"entidade_id": "550e8400-e29b-41d4-a716-446655440010",
"operacao": "atualizar",
"descricao": "Atualização de status do fluxo de alçada",
"dados_anteriores": {
"status": "EM_ANALISE"
},
"dados_novos": {
"status": "APROVADO"
},
"nivel": "info"
}
]
}

6. Obter Estatísticas de Auditoria

Retorna estatísticas sobre os registros de auditoria.

GET /api/auditoria/estatisticas

Parâmetros de Consulta

ParâmetroTipoObrigatórioDescrição
data_iniciostring (date-time)NãoData inicial para filtro (formato: YYYY-MM-DDThh:mm:ssZ)
data_fimstring (date-time)NãoData final para filtro (formato: YYYY-MM-DDThh:mm:ssZ)

Exemplo de Requisição (cURL)

curl -X GET \
'http://localhost:3000/api/auditoria/estatisticas?data_inicio=2025-05-01T00:00:00Z&data_fim=2025-05-31T23:59:59Z' \
-H 'x-api-key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'

Exemplo de Requisição (JavaScript - Fetch API)

const token = localStorage.getItem('token');

const params = new URLSearchParams({
data_inicio: '2025-05-01T00:00:00Z',
data_fim: '2025-05-31T23:59:59Z'
});

fetch(`http://localhost:3000/api/auditoria/estatisticas?${params.toString()}`, {
method: 'GET',
headers: {
'x-api-key': token
}
})
.then(response => response.json())
.then(data => console.log('Estatísticas de auditoria:', data))
.catch(error => console.error('Erro ao buscar estatísticas de auditoria:', error));

Resposta de Sucesso (200 OK)

{
"periodo": {
"inicio": "2025-05-01T00:00:00Z",
"fim": "2025-05-31T23:59:59Z"
},
"total_registros": 1250,
"por_nivel": {
"info": 1150,
"alerta": 75,
"erro": 20,
"critico": 5
},
"por_operacao": {
"criar": 200,
"atualizar": 800,
"excluir": 50,
"visualizar": 150,
"autenticar": 50
},
"por_entidade": {
"analise": 500,
"usuario": 100,
"fluxo_alcada": 300,
"parecer": 200,
"documento": 150
},
"por_usuario": [
{
"usuario_id": "550e8400-e29b-41d4-a716-446655440003",
"nome": "João Silva",
"total": 450
},
{
"usuario_id": "550e8400-e29b-41d4-a716-446655440004",
"nome": "Maria Oliveira",
"total": 350
},
{
"usuario_id": "550e8400-e29b-41d4-a716-446655440005",
"nome": "Carlos Santos",
"total": 300
}
],
"por_dia": [
{
"data": "2025-05-01",
"total": 45
},
{
"data": "2025-05-02",
"total": 38
},
// ... outros dias
{
"data": "2025-05-31",
"total": 42
}
]
}

Middleware de Auditoria Automática

O sistema utiliza um middleware de auditoria que registra automaticamente operações realizadas através da API. Este middleware pode ser configurado para monitorar rotas específicas e capturar detalhes das operações.

Exemplo de Configuração do Middleware

// Exemplo de configuração do middleware de auditoria
const auditMiddleware = require('../middlewares/audit.middleware');

// Aplicar middleware em rotas específicas
router.post('/analises', auditMiddleware('criar', 'analise'), analisesController.criarAnalise);
router.put('/analises/:id', auditMiddleware('atualizar', 'analise'), analisesController.atualizarAnalise);
router.delete('/analises/:id', auditMiddleware('excluir', 'analise'), analisesController.excluirAnalise);

Exemplo de Implementação do Middleware

// Exemplo simplificado do middleware de auditoria
const auditService = require('../services/auditoria.service');

/**
* Middleware para registro automático de auditoria
* @param {string} operacao - Tipo de operação (criar, atualizar, excluir, etc.)
* @param {string} entidade - Tipo de entidade (analise, usuario, etc.)
*/
module.exports = (operacao, entidade) => {
return async (req, res, next) => {
// Armazenar resposta original para capturar após processamento
const originalSend = res.send;

// Capturar dados antes da operação
const dadosAnteriores = req.method === 'PUT' || req.method === 'DELETE' ?
await obterDadosEntidade(entidade, req.params.id) : null;

// Sobrescrever método send para capturar resposta
res.send = function(body) {
// Restaurar método original
res.send = originalSend;

// Processar resposta
const resposta = JSON.parse(body);

// Registrar auditoria apenas se operação foi bem-sucedida
if (res.statusCode >= 200 && res.statusCode < 300) {
const dadosAuditoria = {
entidade,
entidade_id: resposta.id || req.params.id,
operacao,
descricao: `${operacao.charAt(0).toUpperCase() + operacao.slice(1)} de ${entidade}`,
dados_anteriores: dadosAnteriores,
dados_novos: req.method !== 'DELETE' ? req.body : null,
nivel: 'info',
request_id: req.requestId
};

// Registrar auditoria de forma assíncrona
auditService.registrarOperacao(dadosAuditoria, req.userId)
.catch(err => console.error('Erro ao registrar auditoria:', err));
}

// Continuar com o envio da resposta
return originalSend.call(this, body);
};

next();
};
};

/**
* Função auxiliar para obter dados da entidade antes da operação
*/
async function obterDadosEntidade(entidade, id) {
try {
// Implementação específica para cada tipo de entidade
// ...
} catch (error) {
console.error(`Erro ao obter dados anteriores de ${entidade}:`, error);
return null;
}
}

Visualização de Dados de Auditoria

Os dados de auditoria podem ser visualizados de várias formas:

1. Timeline de Eventos

// Exemplo usando uma biblioteca de timeline
function renderTimeline(historico) {
const timelineData = historico.map(item => ({
id: item.id,
content: `${item.descricao} por ${item.usuario.nome}`,
start: new Date(item.timestamp),
title: `${item.operacao.toUpperCase()}: ${JSON.stringify(item.dados_novos || item.dados)}`,
className: `timeline-item-${item.nivel}`
}));

const timeline = new Timeline(
document.getElementById('timeline-container'),
timelineData,
{
min: new Date(historico[0].timestamp),
max: new Date(historico[historico.length - 1].timestamp),
zoomable: true
}
);
}

2. Gráficos de Estatísticas

// Exemplo usando Chart.js para estatísticas por operação
const ctx = document.getElementById('operacoesChart').getContext('2d');
const chart = new Chart(ctx, {
type: 'pie',
data: {
labels: ['Criar', 'Atualizar', 'Excluir', 'Visualizar', 'Autenticar'],
datasets: [{
data: [200, 800, 50, 150, 50],
backgroundColor: [
'rgba(75, 192, 192, 0.2)',
'rgba(54, 162, 235, 0.2)',
'rgba(255, 99, 132, 0.2)',
'rgba(255, 206, 86, 0.2)',
'rgba(153, 102, 255, 0.2)'
],
borderColor: [
'rgba(75, 192, 192, 1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 99, 132, 1)',
'rgba(255, 206, 86, 1)',
'rgba(153, 102, 255, 1)'
],
borderWidth: 1
}]
},
options: {
responsive: true,
plugins: {
legend: {
position: 'top',
},
title: {
display: true,
text: 'Distribuição de Operações'
}
}
}
});

Melhores Práticas

  1. Dados Sensíveis: Evite registrar dados sensíveis (senhas, tokens, informações pessoais) nos logs de auditoria.
  2. Níveis Adequados: Use níveis de severidade adequados para cada tipo de operação.
  3. Retenção de Logs: Implemente políticas de retenção de logs para gerenciar o volume de dados.
  4. Consultas Eficientes: Use filtros adequados ao consultar logs para melhorar a performance.
  5. Monitoramento Proativo: Configure alertas para operações críticas ou padrões suspeitos.

Próximos Passos

Agora que você entende como utilizar o sistema de auditoria, pode explorar:

  • Retenção de Logs - Para gerenciar o ciclo de vida dos logs de auditoria
  • Exportação - Para exportar logs de auditoria em diferentes formatos
  • Dashboards - Para visualizar estatísticas de auditoria em painéis personalizados