OP.EXP.2 Configuración de seguridad
Documentos de referencia
- Guías CCN-STIC:
- Serie CCN-STIC-500 - Guías para Entornos Windows
- Serie CCN-STIC-600 - Guías para otros Entornos
- Guía CCN-STIC-824 - Informe del Estado de Seguridad
- Guía CCN-STIC-827 - Gestión y uso de dispositivos móviles
- ISO/IEC 27000
- NIST SP 800-53 rev4:
- [CM-2] Baseline Configuration
- [CM-6] Configuration Settings
- [CM-7] Least Functionality
- [SI-5] Security Alerts, Advisories, and Directives
- Otras referencias:
- SANS - CIS Critical Security Controls - Version 6.1
- CSC.3 - Secure Configurations for Hardware and Software
- CSC.9 - Limitation and Control of Network Ports
- CSC.18 - Application Software Security
- FDCC - Federal Desktop Core Configuration http://nvd.nist.gov/fdcc/index.cfm
- USGCB - The United States Government Configuration Baseline http://usgcb.nist.gov/
- Manageable Network Plan
- Milestone 7: Manage Your Network, Part II (Baseline Management)
- SANS - CIS Critical Security Controls - Version 6.1
Guía de implantación
- Todos los sistemas deben ser configurados de forma sistemática antes de entrar en producción. El organismo debe elaborar unos pocos perfiles de configuración para las diferentes actividades a que pueden ser dedicados, siendo típicos los siguientes:
- usuarios normales (uso administrativo)
- atención a clientes
- gestión de proveedores (incluidos bancos)
- desarrollo
- operadores y administradores (técnicos de sistemas)
- responsable de seguridad (consola de configuración)
- auditoría
-
La medida se instrumenta por medio de una lista de verificación (checklists) que se debe aplicar sistemáticamente a cada equipo antes de entrar en producción.
-
En todos los perfiles de usuario, excepto en los de administrador, se debe bloquear la opción de que éste pueda cambiar la configuración del sistema o pueda instalar nuevos programas o nuevos periféricos (drivers).
-
La configuración de seguridad debe incluir un perfil básico de auditoría de uso del equipo.
Implementación en Legit Health Plus
Perfiles de configuración según rol
1.1 Perfil: Usuario Clínico (Dermatólogo/Médico)
Profile_ID: LHP-CFG-CLINICAL
Descripción: Configuración para profesionales sanitarios
Permisos:
- Acceso_Diagnóstico: Completo
- Carga_Imágenes: Permitido (máx 50MB, formatos JPEG/PNG/DICOM)
- Modificación_Informes: Solo propios
- Acceso_Historiales: Según consentimiento del paciente
- Exportación_Datos: PDF cifrado, watermark obligatorio
Restricciones:
- Sin acceso administrativo
- Sin instalación de software
- Sin modificación de algoritmos
- Sesión máxima: 8 horas
- MFA obligatorio
Auditoría:
- Log de todas las visualizaciones de imágenes
- Registro de diagnósticos emitidos
- Tracking de exportaciones
1.2 Perfil: Administrador del Sistema
Profile_ID: LHP-CFG-ADMIN
Descripción: Configuración para administradores técnicos
Permisos:
- Gestión_Usuarios: Completo
- Configuración_Sistema: Completo con aprobación
- Acceso_Logs: Lectura completa
- Mantenimiento: Ventanas programadas
Restricciones:
- Sin acceso a datos clínicos sin supervisión
- Cambios críticos requieren doble autorización
- Acceso desde IPs autorizadas
- VPN obligatorio para acceso remoto
Auditoría:
- Log detallado de todos los comandos
- Grabación de sesiones privilegiadas
- Alertas en tiempo real para acciones críticas
1.3 Perfil: Auditor/Inspector Regulatorio
Profile_ID: LHP-CFG-AUDIT
Descripción: Configuración para auditorías y revisión
Permisos:
- Acceso_Logs: Solo lectura, histórico completo
- Visualización_Configuraciones: Sin modificación
- Generación_Informes: Auditoría y compliance
- Acceso_Documentación: DHF, procedimientos, evidencias
Restricciones:
- Acceso temporal limitado (30 días máx)
- Sin modificación de datos
- Sin exportación masiva
- Datos anonimizados cuando sea posible
Auditoría:
- Registro completo de accesos
- Documentos visualizados
- Informes generados
1.4 Perfil: Integración API (Sistemas HIS/EMR)
Profile_ID: LHP-CFG-API
Descripción: Configuración para integraciones externas
Permisos:
- Endpoints específicos según integración
- Rate limiting: 100 req/min
- Formatos: HL7 FHIR, JSON
Restricciones:
- OAuth 2.0 + JWT obligatorio
- IP whitelisting
- Sin acceso directo a base de datos
- Certificados TLS mutuos
Auditoría:
- Log de todas las transacciones
- Métricas de uso y rendimiento
- Alertas de comportamiento anómalo
Baseline de configuración de seguridad
2.1 Sistema Operativo (Ubuntu 22.04 LTS)
#!/bin/bash
# LHP Security Baseline Script v1.0
# Hardening del kernel
echo "kernel.randomize_va_space = 2" >> /etc/sysctl.conf
echo "kernel.exec-shield = 1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies = 1" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.rp_filter = 1" >> /etc/sysctl.conf
# Deshabilitar servicios innecesarios
systemctl disable bluetooth
systemctl disable cups
systemctl disable avahi-daemon
# Configuración de firewall (ufw)
ufw default deny incoming
ufw default allow outgoing
ufw allow 443/tcp # HTTPS
ufw allow 22/tcp # SSH (solo desde IPs de gestión)
ufw enable
# Configuración SSH
sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sed -i 's/#MaxAuthTries 6/MaxAuthTries 3/' /etc/ssh/sshd_config
echo "AllowGroups legit-health-admins" >> /etc/ssh/sshd_config
# Auditoría con auditd
auditctl -w /etc/passwd -p wa -k passwd_changes
auditctl -w /var/log/legit-health/ -p wa -k app_logs
auditctl -w /opt/legit-health/config/ -p wa -k config_changes
2.2 Aplicación Web (Frontend React)
// security-config.js
const securityConfig = {
// Content Security Policy
CSP: {
"default-src": "'self'",
"script-src": "'self' 'unsafe-inline' https://cdn.legit.health",
"style-src": "'self' 'unsafe-inline'",
"img-src": "'self' data: https:",
"connect-src": "'self' https://api.legit.health",
"frame-ancestors": "'none'",
"form-action": "'self'",
},
// Cabeceras de seguridad
headers: {
"Strict-Transport-Security": "max-age=31536000; includeSubDomains",
"X-Content-Type-Options": "nosniff",
"X-Frame-Options": "DENY",
"X-XSS-Protection": "1; mode=block",
"Referrer-Policy": "strict-origin-when-cross-origin",
},
// Configuración de sesión
session: {
timeout: 28800000, // 8 horas para usuarios clínicos
warningTime: 300000, // Aviso 5 minutos antes
refreshTokenInterval: 3600000, // Renovar token cada hora
maxConcurrentSessions: 1,
},
// Validación de entrada
validation: {
maxImageSize: 52428800, // 50MB
allowedImageTypes: ["image/jpeg", "image/png", "application/dicom"],
maxTextLength: 5000,
sanitizeHTML: true,
},
};
2.3 Backend API (Python/FastAPI)
# security_config.py
from pydantic import BaseSettings
import secrets
class SecuritySettings(BaseSettings):
# Autenticación y autorización
JWT_SECRET_KEY: str = secrets.token_urlsafe(32)
JWT_ALGORITHM: str = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES: int = 480 # 8 horas
REFRESH_TOKEN_EXPIRE_DAYS: int = 7
# Rate limiting
RATE_LIMIT_REQUESTS: int = 100
RATE_LIMIT_PERIOD: int = 60 # segundos
# Configuración CORS
ALLOWED_ORIGINS: list = [
"https://app.legit.health",
"https://staging.legit.health"
]
# Cifrado
ENCRYPTION_KEY: str = secrets.token_urlsafe(32)
DATABASE_ENCRYPTION: bool = True
FILE_ENCRYPTION: bool = True
# Validación de entrada
MAX_UPLOAD_SIZE: int = 52428800 # 50MB
ALLOWED_EXTENSIONS: set = {".jpg", ".jpeg", ".png", ".dcm"}
# Auditoría
AUDIT_LOG_LEVEL: str = "INFO"
AUDIT_LOG_RETENTION_DAYS: int = 3650 # 10 años MDR
# Protección contra ataques
SQL_INJECTION_PROTECTION: bool = True
XSS_PROTECTION: bool = True
CSRF_PROTECTION: bool = True
class Config:
env_file = ".env"
env_file_encoding = 'utf-8'
2.4 Base de Datos (PostgreSQL)
-- Configuración de seguridad PostgreSQL
-- Archivo: postgresql_security.conf
-- Conexiones y autenticación
max_connections = 100
superuser_reserved_connections = 3
authentication_timeout = 1min
password_encryption = scram-sha-256
-- SSL/TLS
ssl = on
ssl_cert_file = '/etc/postgresql/14/main/server.crt'
ssl_key_file = '/etc/postgresql/14/main/server.key'
ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL'
ssl_prefer_server_ciphers = on
-- Auditoría
log_connections = on
log_disconnections = on
log_duration = off
log_error_verbosity = default
log_hostname = on
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
log_statement = 'all'
log_timezone = 'UTC'
-- Configuración de seguridad adicional
shared_preload_libraries = 'pg_stat_statements,pgaudit'
pgaudit.log = 'ALL'
pgaudit.log_catalog = on
pgaudit.log_parameter = on
pgaudit.log_statement_once = off
Procedimientos de configuración segura
3.1 Checklist de despliegue seguro
## Checklist de Configuración Segura - Nuevo Despliegue
### Pre-despliegue
- [ ] Revisión de código de seguridad completada (SAST)
- [ ] Análisis de dependencias realizado (SCA)
- [ ] Pruebas de penetración ejecutadas
- [ ] Certificados SSL/TLS válidos instalados
- [ ] Secrets management configurado (HashiCorp Vault)
### Configuración del sistema
- [ ] OS hardening aplicado según baseline
- [ ] Firewall configurado con reglas mínimas
- [ ] SELinux/AppArmor habilitado
- [ ] Actualizaciones de seguridad instaladas
- [ ] Servicios innecesarios deshabilitados
### Configuración de la aplicación
- [ ] Variables de entorno seguras configuradas
- [ ] Modo debug deshabilitado
- [ ] Logs configurados sin información sensible
- [ ] Rate limiting implementado
- [ ] CORS configurado restrictivamente
### Base de datos
- [ ] Conexiones cifradas (TLS)
- [ ] Usuarios con privilegios mínimos
- [ ] Auditoría habilitada
- [ ] Backup cifrado configurado
- [ ] Datos de prueba eliminados
### Monitoreo y auditoría
- [ ] SIEM integrado
- [ ] Alertas de seguridad configuradas
- [ ] Logs centralizados
- [ ] Retention policy aplicada
- [ ] Dashboard de seguridad operativo
3.2 Proceso de revisión de configuración
-
Revisión trimestral programada
- Escaneo con herramientas automatizadas (Nessus, OpenVAS)
- Comparación con baseline documentado
- Identificación de desviaciones
-
Análisis de vulnerabilidades
- CVE scanning de componentes
- Revisión de boletines de seguridad
- Priorización según CVSS y contexto clínico
-
Remediación
- Plan de acción con plazos según criticidad
- Testing en entorno de staging
- Despliegue controlado con rollback plan
Herramientas de gestión de configuración
4.1 Infrastructure as Code (IaC)
# main.tf - Configuración segura de infraestructura
resource "aws_instance" "legit_health_app" {
ami = "ami-0c55b159cbfafe1f0" # Ubuntu 22.04 hardened
instance_type = "t3.xlarge"
vpc_security_group_ids = [aws_security_group.app_sg.id]
subnet_id = aws_subnet.private.id
root_block_device {
volume_type = "gp3"
volume_size = 100
encrypted = true
kms_key_id = aws_kms_key.app_key.id
}
metadata_options {
http_endpoint = "enabled"
http_tokens = "required" # IMDSv2
http_put_response_hop_limit = 1
}
user_data = file("${path.module}/security-baseline.sh")
tags = {
Name = "LegitHealth-Production"
Environment = "Production"
Compliance = "MDR-FDA-ENS"
CostCenter = "Medical-Device"
}
}
4.2 Configuration Management (Ansible)
# security-playbook.yml
---
- name: Apply Security Configuration to Legit Health Servers
hosts: legit_health_production
become: yes
tasks:
- name: Ensure security updates are installed
apt:
upgrade: dist
update_cache: yes
autoremove: yes
- name: Configure firewall rules
ufw:
rule: allow
port: "{{ item }}"
proto: tcp
src: "{{ trusted_networks }}"
loop:
- 443
- 22
- name: Apply sysctl security parameters
sysctl:
name: "{{ item.key }}"
value: "{{ item.value }}"
state: present
reload: yes
loop:
- { key: "kernel.randomize_va_space", value: "2" }
- { key: "net.ipv4.tcp_syncookies", value: "1" }
- { key: "net.ipv4.conf.all.send_redirects", value: "0" }
- name: Configure auditd rules
template:
src: audit.rules.j2
dest: /etc/audit/rules.d/legit-health.rules
notify: restart auditd
- name: Ensure unnecessary services are disabled
systemd:
name: "{{ item }}"
enabled: no
state: stopped
loop:
- bluetooth
- cups
- avahi-daemon
ignore_errors: yes
Monitorización de configuración
5.1 Detección de desviaciones
# config_monitor.py
import hashlib
import json
from datetime import datetime
import boto3
class ConfigurationMonitor:
def __init__(self):
self.baseline = self.load_baseline()
self.sns_client = boto3.client('sns')
def check_configuration(self, system_id):
current_config = self.get_current_config(system_id)
deviations = self.compare_with_baseline(current_config)
if deviations:
self.alert_deviations(system_id, deviations)
self.log_to_siem(system_id, deviations)
return deviations
def compare_with_baseline(self, current):
deviations = []
for key, baseline_value in self.baseline.items():
if key not in current:
deviations.append({
'type': 'missing_configuration',
'key': key,
'expected': baseline_value
})
elif current[key] != baseline_value:
deviations.append({
'type': 'configuration_drift',
'key': key,
'expected': baseline_value,
'actual': current[key]
})
return deviations
def alert_deviations(self, system_id, deviations):
if self.is_critical_deviation(deviations):
# Alerta inmediata para desviaciones críticas
self.sns_client.publish(
TopicArn='arn:aws:sns:eu-west-1:123456789:security-alerts',
Subject=f'CRITICAL: Configuration Deviation - {system_id}',
Message=json.dumps(deviations, indent=2)
)
Métricas e indicadores
KPIs de configuración segura
- Drift Rate: % de sistemas con desviaciones del baseline
- Patch Compliance: % de sistemas con parches actualizados
- Configuration Coverage: % de sistemas con baseline definido
- MTTR: Tiempo medio de corrección de desviaciones
- Audit Success Rate: % de auditorías sin hallazgos críticos
Dashboard de seguridad
Metrics Dashboard:
- Configuration Compliance: 98.5%
- Systems at Baseline: 47/48
- Critical Deviations: 0
- Pending Security Updates: 3 (non-critical)
- Last Full Scan: 2024-01-20 14:30 UTC
- Next Scheduled Review: 2024-02-20
Integración con el ecosistema de seguridad
- SIEM (Splunk): Envío de logs de configuración para correlación
- Vulnerability Scanner (Qualys): Escaneo periódico de configuraciones
- SOAR (Phantom): Automatización de respuesta a desviaciones
- GRC (ServiceNow): Tracking de compliance y excepciones
Consideraciones específicas MDR/FDA
Validación de configuración
- Todas las configuraciones críticas pasan por proceso V&V
- Documentación en DHF (Design History File)
- Trazabilidad con requisitos de ciberseguridad (PRS)
Control de cambios
- Procedimiento GP-005 para cambios en configuración
- Evaluación de impacto clínico obligatoria
- Aprobación del Clinical Safety Officer para cambios en algoritmos
Referencias y documentación relacionada
- T-024-004: Guía de hardening de sistemas
- T-024-005: Procedimiento de gestión de vulnerabilidades
- R-TF-013-002: Registro de gestión de riesgos
- GP-013: Gestión de la ciberseguridad
- FDA Cybersecurity Guidance: Postmarket Management of Cybersecurity
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