OP.EXP.10 Protección de los registros de actividad
Documentos de referencia
- Real Decreto 311/2022 - Anexo II, Medida OP.EXP.10
- T-024-016 - Procedimiento de protección de logs
- T-024-017 - Arquitectura de almacenamiento seguro de logs
- GP-013 - Gestión de Ciberseguridad
- OP.EXP.8 - Registro de la actividad de los usuarios
- ISO/IEC 27001:2022 - Control A.8.15 (Protección de registros)
- FDA 21 CFR Part 11 - Integridad de audit trails
Guía de implantación
Objetivo
Garantizar la protección, integridad, disponibilidad y no repudio de todos los registros de actividad (logs) generados por los sistemas de información de Legit Health, asegurando que constituyan evidencia fiable para auditorías, investigaciones forenses y cumplimiento regulatorio.
Alcance
Este procedimiento aplica a:
- Logs de aplicaciones y sistemas
- Registros de auditoría (audit trails)
- Logs de seguridad y eventos
- Registros de acceso y autenticación
- Logs de transacciones del dispositivo médico
- Registros de cambios y configuración
- Logs de infraestructura y red
Amenazas a los registros de actividad
3.1 Amenazas identificadas
Amenaza | Impacto | Probabilidad | Controles |
---|---|---|---|
Modificación no autorizada | Crítico | Media | Write-once, firma digital |
Eliminación accidental/maliciosa | Crítico | Media | Backups, replicación |
Acceso no autorizado | Alto | Media | Control de acceso, cifrado |
Corrupción de datos | Alto | Baja | Checksums, verificación |
Pérdida por fallo hardware | Alto | Baja | Redundancia, cloud |
Exfiltración de información | Medio | Media | Cifrado, DLP |
Manipulación de timestamps | Alto | Baja | NTP seguro, TSA |
Arquitectura de protección
4.1 Modelo de seguridad en capas
┌─────────────────────────────────────┐
│ Capa de Aplicación │
│ - Generación segura de logs │
│ - Firma en origen │
└────────────────┬────────────────────┘
│
┌────────────────┴────────────────────┐
│ Capa de Transmisión │
│ - Cifrado TLS 1.3 │
│ - Autenticación mutua │
└────────────────┬────────────────────┘
│
┌────────────────┴────────────────────┐
│ Capa de Procesamiento │
│ - Validación de integridad │
│ - Normalización y enriquecimiento │
└────────────────┬────────────────────┘
│
┌────────────────┴────────────────────┐
│ Capa de Almacenamiento │
│ - Write-once (WORM) │
│ - Cifrado at-rest │
│ - Replicación multi-zona │
└─────────────────────────────────────┘
4.2 Flujo de protección
- Generación: Log creado con timestamp certificado
- Firma: Aplicación de firma digital al log
- Cifrado: Encriptación antes de transmisión
- Transmisión: Envío seguro al colector
- Validación: Verificación de firma e integridad
- Almacenamiento: Escritura en storage inmutable
- Replicación: Copia a múltiples ubicaciones
- Verificación: Chequeos periódicos de integridad
Medidas de protección implementadas
5.1 Protección de integridad
Firma digital de logs:
def sign_log_entry(log_entry):
# Serializar el log entry
log_json = json.dumps(log_entry, sort_keys=True)
# Calcular hash
log_hash = hashlib.sha256(log_json.encode()).digest()
# Firmar con clave privada
signature = private_key.sign(
log_hash,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
# Añadir firma al log
log_entry['signature'] = base64.b64encode(signature).decode()
log_entry['hash'] = base64.b64encode(log_hash).decode()
return log_entry
Hash chain (blockchain-like):
def create_hash_chain(current_log, previous_hash):
# Incluir hash del log anterior
current_log['previous_hash'] = previous_hash
# Calcular nuevo hash incluyendo el anterior
combined = f"{previous_hash}{json.dumps(current_log)}"
new_hash = hashlib.sha256(combined.encode()).hexdigest()
current_log['current_hash'] = new_hash
return current_log, new_hash
Verificación periódica:
- Verificación automática cada 6 horas
- Validación completa semanal
- Auditoría de integridad mensual
- Alertas inmediatas ante discrepancias
5.2 Protección de confidencialidad
Cifrado en reposo:
Storage Configuration:
Encryption: AES-256-GCM
Key Management: AWS KMS
Key Rotation: Automatic (90 days)
Access: IAM Role-based
Audit: CloudTrail enabled
Cifrado en tránsito:
Transport Security:
Protocol: TLS 1.3
Cipher Suites:
- TLS_AES_256_GCM_SHA384
- TLS_CHACHA20_POLY1305_SHA256
Certificate: EV SSL
Mutual Auth: Required for critical systems
Perfect Forward Secrecy: Enabled
Anonimización de datos sensibles:
def anonymize_sensitive_data(log_entry):
# Hasher para datos PII
if 'patient_id' in log_entry:
log_entry['patient_id'] = hash_pii(log_entry['patient_id'])
# Ocultar IPs internas parcialmente
if 'ip_address' in log_entry:
log_entry['ip_address'] = mask_ip(log_entry['ip_address'])
# Eliminar datos de tarjetas
log_entry = remove_card_numbers(log_entry)
return log_entry
5.3 Protección de disponibilidad
Arquitectura de alta disponibilidad:
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Zona AZ1 │ │ Zona AZ2 │ │ Zona AZ3 │
│ │◄────┤ │◄────┤ │
│ Log Storage │ │ Log Storage │ │ Log Storage │
│ Primary │ │ Replica 1 │ │ Replica 2 │
└──────────────┘ └──────────────┘ └──────────────┘
│ │ │
└────────────────────┴────────────────────┘
│
┌────────┴────────┐
│ Load Balancer │
│ (Active-Active)│
└─────────────────┘
Configuración de replicación:
- Replicación síncrona a zona secundaria
- Replicación asíncrona a zona terciaria
- Backup diario a S3 Glacier
- Snapshot cada 4 horas
5.4 Control de acceso
Modelo de permisos:
Roles:
log-reader:
permissions: [read]
scope: [non-sensitive-logs]
mfa: required
log-analyst:
permissions: [read, search, export]
scope: [all-logs]
mfa: required
approval: manager
log-admin:
permissions: [read, search, export, configure]
scope: [all-logs, configuration]
mfa: required
approval: ciso
dual-control: required
system:
permissions: [write]
scope: [assigned-source]
authentication: certificate
Registro de accesos a logs:
{
"access_timestamp": "2024-11-15T10:30:00Z",
"user": "analyst@legithealth.com",
"action": "search",
"query": "error_level:critical AND timestamp:[2024-11-14 TO 2024-11-15]",
"results_returned": 42,
"justification": "Investigating incident INC-2024-1115",
"approved_by": "manager@legithealth.com",
"session_id": "sess-uuid-12345"
}
Almacenamiento seguro
6.1 Tecnología WORM (Write Once Read Many)
Configuración AWS S3 Object Lock:
Bucket: legit-health-immutable-logs
ObjectLock:
Mode: COMPLIANCE
RetentionPeriod: 2555 days (7 years)
LegalHold: Available when required
Versioning: Enabled
MFADelete: Enabled
Replication: Cross-region to eu-central-1
Prevención de modificación:
- Una vez escrito, no se puede modificar ni eliminar
- Ni siquiera el root account puede bypassear
- Cumple con SEC 17a-4, FINRA 4511, CFTC 1.31
6.2 Segregación de almacenamiento
/logs/
/security/ [CRITICAL - 7 years]
/authentication/
/authorization/
/incidents/
/clinical/ [HIGH - 10 years]
/patient-access/
/diagnoses/
/treatments/
/operational/ [MEDIUM - 3 years]
/performance/
/errors/
/debugging/
/compliance/ [CRITICAL - 10 years]
/audit-trails/
/regulatory/
/data-processing/
Sincronización temporal
7.1 NTP seguro
Configuración NTP:
NTP Servers:
Primary: time.google.com
Secondary: time.cloudflare.com
Tertiary: pool.ntp.org
Security:
Authentication: Symmetric key
Protocol: NTPv4
Stratum: Maximum 3
Drift tolerance: ± 100ms
Monitoring:
Check interval: 5 minutes
Alert threshold: ± 1 second drift
Auto-correction: Enabled
7.2 Timestamp Authority (TSA)
Integración con TSA:
def get_certified_timestamp(data_hash):
# Crear solicitud RFC 3161
req = TimeStampReq()
req['messageImprint']['hashAlgorithm'] = id_sha256
req['messageImprint']['hashedMessage'] = data_hash
req['certReq'] = True
# Enviar a TSA
response = requests.post(
'https://tsa.legithealth.com/timestamp',
data=req.encode(),
headers={'Content-Type': 'application/timestamp-query'},
cert=('/path/to/client.crt', '/path/to/client.key')
)
# Validar y almacenar respuesta
tst = TimeStampResp(response.content)
if tst['status']['status'] == 0: # Success
return tst['timeStampToken']
else:
raise TimestampError(f"TSA error: {tst['status']['statusString']}")
Procedimientos de verificación
8.1 Verificación de integridad
Verificación automática (cada 6 horas):
def verify_log_integrity():
errors = []
# Seleccionar muestra aleatoria
sample_size = max(1000, total_logs * 0.01)
logs_sample = select_random_logs(sample_size)
for log in logs_sample:
# Verificar firma digital
if not verify_signature(log):
errors.append(f"Signature failed: {log['id']}")
# Verificar hash chain
if not verify_hash_chain(log):
errors.append(f"Hash chain broken: {log['id']}")
# Verificar timestamp
if not verify_timestamp(log):
errors.append(f"Timestamp invalid: {log['id']}")
if errors:
alert_security_team(errors)
initiate_forensic_analysis()
return len(errors) == 0
8.2 Auditoría forense
Procedimiento de análisis forense:
- Aislar logs sospechosos
- Crear copia forense certificada
- Analizar metadatos y timestamps
- Verificar cadena de custodia
- Reconstruir secuencia de eventos
- Identificar punto de compromiso
- Documentar hallazgos
- Preservar evidencias
Recuperación y restauración
9.1 Procedimiento de recuperación
Recovery Procedure:
1. Identify Failure:
- Type: Corruption / Deletion / Hardware failure
- Scope: Time range and systems affected
- Impact: Critical / High / Medium / Low
2. Select Recovery Source:
- Primary: Hot standby replica
- Secondary: Recent backup (< 24h)
- Tertiary: Archive storage
3. Validate Backup:
- Verify checksums
- Check signatures
- Confirm completeness
4. Restore Process:
- Isolate affected storage
- Restore from validated source
- Verify hash chains
- Re-establish replication
5. Verification:
- Compare with known-good hashes
- Validate time continuity
- Check for gaps
6. Documentation:
- Document incident
- Record recovery actions
- Update disaster recovery plan
9.2 Tiempos de recuperación
Fuente | RTO | RPO | Disponibilidad |
---|---|---|---|
Réplica hot standby | < 5 min | 0 | 99.99% |
Backup reciente | < 1 hora | < 24h | 99.9% |
Archivo (Glacier) | < 12 horas | < 7 días | 99.99% |
Cinta (offsite) | < 48 horas | < 30 días | 99.999% |
Cumplimiento regulatorio
10.1 Requisitos FDA 21 CFR Part 11
- ✓ Audit trails seguros y automáticos
- ✓ Firma electrónica en registros críticos
- ✓ Imposibilidad de modificación
- ✓ Timestamps certificados
- ✓ Backup y recuperación validados
- ✓ Controles de acceso documentados
10.2 Requisitos ENS
- ✓ Protección acorde a categoría ALTA
- ✓ Integridad garantizada mediante firma
- ✓ Disponibilidad 99.9% mínimo
- ✓ Retención mínima 2 años
- ✓ Sincronización temporal certificada
- ✓ Segregación por nivel de sensibilidad
Métricas y monitorización
11.1 KPIs de protección
Métrica | Objetivo | Actual | Tendencia |
---|---|---|---|
Integridad logs | 100% | 99.999% | → |
Disponibilidad sistema | 99.9% | 99.95% | ↑ |
Tiempo verificación | < 10 min | 7 min | ↓ |
Logs perdidos/mes | 0 | 0 | → |
Intentos modificación | - | 3/mes | ↓ |
Recuperaciones exitosas | 100% | 100% | → |
11.2 Dashboard de protección
┌─────────────────────────────────────────────────┐
│ LOG PROTECTION DASHBOARD │
├─────────────────────────────────────────────────┤
│ Storage Status: [██████████] 100% Healthy │
│ Replication: All zones synchronized │
│ Last Integrity: 2024-11-15 10:00:00 ✓ │
│ Signatures Valid: 15,234,567 / 15,234,567 │
│ Access Attempts: 342 (3 blocked) │
│ Archive Status: On schedule │
│ Alerts: 0 Critical, 2 Warning │
└─────────────────────────────────────────────────┘
Procedimientos de emergencia
12.1 Respuesta a compromiso de logs
-
Detección (T+0)
- Alerta automática de integridad fallida
- Activación equipo de respuesta
-
Contención (T+15min)
- Aislar sistemas afectados
- Detener escritura a logs comprometidos
- Activar almacenamiento alternativo
-
Análisis (T+1h)
- Determinar alcance del compromiso
- Identificar período afectado
- Evaluar impacto regulatorio
-
Recuperación (T+4h)
- Restaurar desde fuente confiable
- Revalidar integridad completa
- Restablecer operaciones normales
-
Notificación (T+24h)
- Informar a autoridades si requerido
- Documentar para auditoría
- Actualizar procedimientos
Formación y concienciación
- Administradores: Gestión segura de logs (semestral)
- Desarrolladores: Implementación de logging seguro
- Analistas: Uso de herramientas de verificación
- Auditores: Validación de cadena de custodia
Documentación y evidencias
- T-024-016: Procedimiento detallado de protección
- T-024-017: Arquitectura técnica de seguridad de logs
- Informes de integridad: Generados automáticamente
- Certificados TSA: Almacenados con cada lote de logs
- Registros de acceso: Audit trail de consultas a logs
- Informes de recuperación: Documentación de cada restore
Signature meaning
The signatures for the approval process of this document can be found in the verified commits at the repository for the QMS. As a reference, the team members who are expected to participate in this document and their roles in the approval process, as defined in Annex I Responsibility Matrix
of the GP-001
, are:
- Author: Team members involved
- Reviewer: JD-003, JD-004
- Approver: JD-001