Saltar al contenido principal
Version: 0.59.0-rc.2

Sistema de Auditoría y Registro

Este documento describe el sistema de registro de auditoría para cumplimiento y seguridad.

Descripción General​

El sistema de auditoría proporciona:

  • Historial completo de operaciones
  • Informes de cumplimiento
  • Monitoreo de seguridad
  • Análisis forense

Arquitectura​

Estructura de Entrada de Auditoría​

pub struct AuditEntry {
pub id: AuditEntryId,
pub timestamp: DateTime<Utc>,
pub subject: SubjectId,
pub subject_type: SubjectType,
pub action: String,
pub object: String,
pub object_id: Option<String>,
pub outcome: AuditOutcome,
pub ip_address: Option<IpAddr>,
pub user_agent: Option<String>,
pub correlation_id: Option<Uuid>,
pub metadata: serde_json::Value,
}

pub enum SubjectType {
User,
System,
ApiClient,
}

pub enum AuditOutcome {
Success,
Failure,
Denied,
}

Categorías de Auditoría​

CategoríaDescripciónEjemplos
AutenticaciónEventos de inicio/cierre de sesiónInicio de sesión de usuario, expiración de sesión
AutorizaciónDecisiones de permisosAcceso denegado, verificación de rol
Acceso a DatosOperaciones de lecturaVer cliente, exportar informe
Modificación de DatosOperaciones de escrituraCrear instalación, actualizar términos
Eventos del SistemaProcesos en segundo planoEjecución de trabajo, sincronización completada

Puntos de Integración​

Middleware de GraphQL​

pub struct AuditMiddleware {
audit_service: Arc<AuditService>,
}

impl Extension for AuditMiddleware {
async fn execute(&self, ctx: &ExtensionContext<'_>, operation_name: Option<&str>, next: NextExecute<'_>) -> Response {
let start = Instant::now();
let subject = ctx.data::<SubjectId>().cloned();

let response = next.run(ctx, operation_name).await;

// Log the operation
if let Some(subject) = subject {
self.audit_service.log(AuditEntry {
subject,
action: operation_name.unwrap_or("unknown").to_string(),
outcome: if response.is_ok() { AuditOutcome::Success } else { AuditOutcome::Failure },
..Default::default()
}).await.ok();
}

response
}
}

Auditoría de Servicios de Dominio​

impl CreditService {
pub async fn create_facility(
&self,
subject: &SubjectId,
input: CreateFacilityInput,
) -> Result<CreditFacility> {
let facility = self.do_create_facility(input).await?;

// Audit the operation
self.audit.log(AuditEntry {
subject: subject.clone(),
action: "create_facility".to_string(),
object: "credit_facility".to_string(),
object_id: Some(facility.id.to_string()),
outcome: AuditOutcome::Success,
metadata: json!({
"amount": facility.amount,
"customer_id": facility.customer_id,
}),
..Default::default()
}).await?;

Ok(facility)
}
}

API de Consultas​

Consulta GraphQL​

query GetAuditLogs($filter: AuditFilter!, $first: Int, $after: String) {
auditEntries(filter: $filter, first: $first, after: $after) {
edges {
node {
id
timestamp
subject
action
object
objectId
outcome
metadata
}
}
pageInfo {
hasNextPage
endCursor
}
}
}

Opciones de Filtro​

input AuditFilter {
subjectId: ID
action: String
object: String
outcome: AuditOutcome
startDate: DateTime
endDate: DateTime
}

Política de Retención​

Tipo de DatosPeríodo de Retención
Registros de autenticación2 años
Registros de autorización2 años
Registros de transacciones7 años
Registros del sistema1 año

Informes de Cumplimiento​

Informe de Actividad del Usuario​

query UserActivityReport($userId: ID!, $period: DateRange!) {
userActivityReport(userId: $userId, period: $period) {
totalActions
actionsByType {
action
count
}
timeline {
date
actions
}
}
}

Informe de Acceso​

query AccessReport($objectType: String!, $period: DateRange!) {
accessReport(objectType: $objectType, period: $period) {
totalAccesses
uniqueUsers
byAction {
action
count
}
}
}

Monitoreo de Seguridad​

Detección de Anomalías​

Monitorear patrones inusuales:

  • Múltiples intentos fallidos de inicio de sesión
  • Acceso fuera del horario habitual
  • Exportaciones masivas de datos
  • Intentos de escalada de privilegios

Alertas​

pub struct AuditAlertService {
audit_repo: AuditRepo,
notification_service: NotificationService,
}

impl AuditAlertService {
pub async fn check_for_anomalies(&self) -> Result<()> {
// Check for suspicious patterns
let failed_logins = self.audit_repo
.count_failed_logins_last_hour()
.await?;

if failed_logins > 10 {
self.notification_service
.send_security_alert("High number of failed logins detected")
.await?;
}

Ok(())
}
}