Skip to main content
QMSQMS
QMS
  • Welcome to your QMS
  • Quality Manual
  • Procedures
    • GP-001 Control of documents
    • GP-002 Quality planning
    • GP-003 Audits
    • GP-004 Vigilance system
    • GP-005 Human Resources and Training
    • GP-006 Non-conformity, Corrective and Preventive actions
    • GP-007 Post-market surveillance
    • GP-008 Product requirements
    • GP-009 Sales
    • GP-010 Purchases and suppliers evaluation
    • GP-011 Provision of service
    • GP-012 Design, redesign and development
    • GP-013 Risk management
    • GP-014 Feedback and complaints
    • GP-015 Clinical evaluation
    • GP-016 Traceability and identification
    • GP-017 Technical assistance service
    • GP-018 Infrastructure and facilities
    • GP-019 Software validation plan
    • GP-020 QMS Data analysis
    • GP-021 Communications
    • GP-022 Document translation
    • GP-023 Change control management
    • GP-024 Predetermined Change Control Plan
    • GP-025 Usability and Human Factors Engineering
    • GP-027 Corporate Governance
    • GP-028 AI Development
    • GP-029 Software Delivery And Comissioning
    • GP-050 Data Protection
    • GP-051 Security violations
    • GP-052 Data Privacy Impact Assessment (DPIA)
    • GP-100 Business Continuity (BCP) and Disaster Recovery plans (DRP)
    • GP-101 Information security
    • GP-200 Remote Data Acquisition in Clinical Investigations
    • GP-026 Market-specific product requirements
    • GP-110 Esquema Nacional de Seguridad
      • ORG Marco organizativo
      • OP Marco operacional
        • OP.PL Planificación
        • OP.ACC Control de acceso
        • OP.EXP Explotación
          • OP.EXP.1 Inventario de activos
          • OP.EXP.10 Protección de los registros de actividad
          • OP.EXP.11 Protección de las claves criptográficas
          • OP.EXP.2 Configuración de seguridad
          • OP.EXP.3 Gestión de la configuración
          • OP.EXP.4 Mantenimiento
          • OP.EXP.5 Gestión de Cambios - Procedimiento Formal ENS
          • OP.EXP.6 Protección frente a código dañino
          • OP.EXP.7 Gestión de incidentes
          • OP.EXP.8 Registro de la actividad de los usuarios
          • OP.EXP.9 Registro de la gestión de incidentes
        • OP.EXT Servicios externos
        • OP.NUB Servicios en la nube
        • OP.CONT Continuidad del servicio
        • OP.MON Monitorización del sistema
      • MP Medidas de protección
      • Sin asignar
      • Real Decreto 311/2022, de 3 de mayo, por el que se regula el Esquema Nacional de Seguridad.
  • Records
  • Legit.Health Plus Version 1.1.0.0
  • Legit.Health Plus Version 1.1.0.1
  • Licenses and accreditations
  • Applicable Standards and Regulations
  • Public tenders
  • Procedures
  • GP-110 Esquema Nacional de Seguridad
  • OP Marco operacional
  • OP.EXP Explotación
  • OP.EXP.3 Gestión de la configuración

OP.EXP.3 Gestión de la configuración

Documentos de referencia​

  • NIST SP 800-53 rev4:
    • [CM-3] Configuration Change Control
    • [CM-9] Configuration Management Plan
  • Otras referencias:
    • SANS - CIS Critical Security Controls - Version 6.1
      • CSC.3 - Secure Configurations for Hardware and Software
    • NIST 800-128 Guide for Security-Focused Configuration Management of Information Systems

Guía de implantación​

  1. Por encima de la configuración de cada equipo, hay que tener una visión integral del sistema, de los equipos que trabajan coordinadamente, de la estructura de líneas de defensa en profundidad y de la dinámica del sistema: su evolución temporal desde el punto de vista de arquitectura del sistema y desde el punto de vista de actualizaciones de los componentes.

  2. Los cambios deben ser controlados y la configuración debe ir a la par.

Implementación en Legit Health Plus​

1. Sistema de Gestión de Configuración (CMDB)​

1.1 Arquitectura del sistema​

1.2 Categorías de elementos de configuración (CIs)​

Nivel 1: Componentes críticos del dispositivo médico​
CI_Category: MEDICAL_CRITICAL
Elementos:
- Algoritmos_Diagnóstico:
- Modelo_Clasificación_Lesiones: v2.3.1
- Modelo_Severidad_ALEGI: v1.8.0
- Modelo_DLQI_Predictor: v1.2.4
- Configuración_Clínica:
- Umbrales_Diagnóstico
- Parámetros_Sensibilidad
- Mapeo_ICD-11
Control_Cambios: Requiere validación clínica y aprobación CMO
Trazabilidad: Vinculado a DHF y registros V&V
Nivel 2: Infraestructura de soporte​
CI_Category: INFRASTRUCTURE
Elementos:
- Servidores:
- Web_Servers: [web-01, web-02, web-03]
- API_Servers: [api-01, api-02]
- DB_Cluster: [db-master, db-replica-01]
- Networking:
- VPC_Configuration
- Security_Groups
- WAF_Rules
- Servicios_Cloud:
- AWS_Lambda_Functions
- Azure_Cognitive_Services
Control_Cambios: Change Advisory Board (CAB)
Trazabilidad: Tickets en ServiceNow

2. Proceso de gestión de configuración​

2.1 Identificación y registro​

# config_item_registration.py
from datetime import datetime
import uuid
from enum import Enum

class CIType(Enum):
SOFTWARE = "SOFTWARE"
HARDWARE = "HARDWARE"
ALGORITHM = "ALGORITHM"
DOCUMENTATION = "DOCUMENTATION"
NETWORK = "NETWORK"
SERVICE = "SERVICE"

class ConfigurationItem:
def __init__(self, name, ci_type, criticality):
self.ci_id = f"CI-{uuid.uuid4().hex[:8].upper()}"
self.name = name
self.ci_type = ci_type
self.criticality = criticality # CRITICAL, HIGH, MEDIUM, LOW
self.version = None
self.status = "DRAFT"
self.owner = None
self.dependencies = []
self.created_at = datetime.utcnow()
self.medical_device_component = False
self.regulatory_impact = None

def register_in_cmdb(self):
"""
Registra el CI en ServiceNow CMDB
"""
payload = {
"ci_id": self.ci_id,
"name": self.name,
"type": self.ci_type.value,
"criticality": self.criticality,
"medical_device": self.medical_device_component,
"regulatory_requirements": self.get_regulatory_requirements(),
"validation_status": "PENDING" if self.medical_device_component else "N/A"
}

# Integración con ServiceNow API
response = servicenow_client.create_ci(payload)

# Crear entrada en el registro de auditoría
audit_log.info(f"CI registered: {self.ci_id} - {self.name}")

return response

def get_regulatory_requirements(self):
"""Determina requisitos regulatorios aplicables"""
requirements = []

if self.medical_device_component:
requirements.extend([
"MDR Annex I - General Safety and Performance Requirements",
"IEC 62304 - Medical Device Software Lifecycle",
"FDA 21 CFR Part 820 - Quality System Regulation"
])

if self.ci_type == CIType.ALGORITHM:
requirements.extend([
"ISO 14971 - Risk Management",
"FDA Guidance - AI/ML-Based SaMD",
"EU AI Act - High Risk System Requirements"
])

return requirements

2.2 Control de versiones​

# version_control_policy.yml
Versioning_Policy:
Format: MAJOR.MINOR.PATCH.BUILD

MAJOR:
Description: Cambios que afectan la indicación clínica
Approval: CMO + Regulatory Affairs
Validation: Estudio clínico completo
Examples:
- Nuevo algoritmo diagnóstico
- Nueva indicación de uso
- Cambio en población objetivo

MINOR:
Description: Mejoras funcionales sin impacto clínico
Approval: CTO + QA Manager
Validation: Pruebas de regresión completas
Examples:
- Mejoras en UI/UX
- Nuevas integraciones
- Optimizaciones de rendimiento

PATCH:
Description: Correcciones y ajustes menores
Approval: DevOps Lead
Validation: Pruebas unitarias y de integración
Examples:
- Bug fixes
- Actualizaciones de seguridad
- Ajustes de configuración

BUILD:
Description: Número de compilación automático
Approval: Automático
Validation: CI/CD pipeline

2.3 Control de cambios​

## Flujo de Control de Cambios - Legit Health Plus

### Fase 1: Solicitud de Cambio

1. **Iniciación** (RFC - Request for Change)
- Formulario T-024-006 en ServiceNow
- Clasificación automática según CI afectado
- Asignación de prioridad (P1-P4)

2. **Evaluación de Impacto**
- Análisis de riesgos (R-TF-013-002)
- Impacto clínico (si aplica)
- Impacto regulatorio
- Dependencias identificadas

### Fase 2: Aprobación

#### Matriz de Aprobación

| Tipo de Cambio | Aprobador Nivel 1 | Aprobador Nivel 2 | CAB Requerido |
| --------------------- | ----------------------- | ---------------------- | ------------- |
| Algoritmo IA | Clinical Safety Officer | Chief Medical Officer | Sí |
| Configuración Crítica | Security Officer | CTO | Sí |
| Infraestructura | DevOps Lead | Infrastructure Manager | No |
| Documentación | QA Manager | - | No |

### Fase 3: Implementación

```python
# change_implementation.py
class ChangeImplementation:
def __init__(self, rfc_number):
self.rfc = self.load_rfc(rfc_number)
self.implementation_plan = None
self.rollback_plan = None
self.validation_criteria = []

def execute_change(self):
try:
# Pre-implementation checks
self.pre_implementation_validation()

# Create backup/snapshot
backup_id = self.create_backup()

# Execute change in stages
for stage in self.implementation_plan.stages:
self.execute_stage(stage)
self.validate_stage(stage)

if not self.stage_successful(stage):
self.initiate_rollback(backup_id)
raise ChangeFailedException(f"Stage {stage.name} failed")

# Post-implementation validation
self.post_implementation_validation()

# Update CMDB
self.update_configuration_items()

# Generate compliance report
self.generate_compliance_report()

except Exception as e:
self.handle_change_failure(e)
raise
```

Fase 4: Verificación y Cierre​

  • Pruebas de aceptación
  • Validación clínica (si aplica)
  • Actualización de documentación
  • Comunicación a stakeholders
  • Cierre formal del RFC

### 3. Baseline de configuración

#### 3.1 Definición del baseline

```json
{
"baseline_id": "BL-2024-Q1-001",
"version": "1.1.0.0",
"status": "APPROVED",
"effective_date": "2024-01-15",
"components": {
"application": {
"web_frontend": "v1.1.0",
"api_backend": "v1.1.0",
"mobile_apps": {
"ios": "v1.0.8",
"android": "v1.0.9"
}
},
"ai_models": {
"lesion_classifier": "v2.3.1",
"severity_scorer": "v1.8.0",
"dlqi_predictor": "v1.2.4"
},
"infrastructure": {
"kubernetes": "v1.28.5",
"postgresql": "v14.10",
"redis": "v7.2.3",
"nginx": "v1.24.0"
},
"security_configurations": {
"tls_version": "1.3",
"cipher_suites": ["TLS_AES_256_GCM_SHA384", "TLS_CHACHA20_POLY1305_SHA256"],
"waf_ruleset": "OWASP_CRS_3.3.4"
}
},
"regulatory_compliance": {
"mdr_conformity": "2024-01-10",
"fda_listing": "K231234",
"iso_13485_audit": "2023-12-15"
}
}

3.2 Gestión de baselines​

# baseline_management.py
class BaselineManager:
def __init__(self):
self.current_baseline = None
self.baseline_history = []

def create_baseline(self, components, approval_evidence):
"""Crea un nuevo baseline de configuración"""
baseline = {
"id": self.generate_baseline_id(),
"timestamp": datetime.utcnow().isoformat(),
"components": self.collect_component_versions(components),
"configuration_hash": self.calculate_config_hash(components),
"approval": approval_evidence,
"validation_status": "PENDING"
}

# Validación automática
validation_results = self.validate_baseline(baseline)

if validation_results.passed:
baseline["validation_status"] = "VALIDATED"
self.promote_baseline(baseline)
else:
baseline["validation_errors"] = validation_results.errors

return baseline

def validate_baseline(self, baseline):
"""Valida integridad y compatibilidad del baseline"""
validations = [
self.check_component_compatibility(),
self.verify_security_requirements(),
self.validate_regulatory_compliance(),
self.test_integration_points(),
self.verify_performance_metrics()
]

return ValidationResults(validations)

def compare_baselines(self, baseline1, baseline2):
"""Compara dos baselines y genera reporte de diferencias"""
diff_report = {
"added_components": [],
"removed_components": [],
"modified_components": [],
"configuration_changes": [],
"risk_assessment": None
}

# Análisis detallado de diferencias
for component in baseline1["components"]:
if component not in baseline2["components"]:
diff_report["removed_components"].append(component)
elif baseline1["components"][component] != baseline2["components"][component]:
diff_report["modified_components"].append({
"component": component,
"old_version": baseline1["components"][component],
"new_version": baseline2["components"][component]
})

# Evaluación de riesgos de los cambios
diff_report["risk_assessment"] = self.assess_change_risk(diff_report)

return diff_report

4. Automatización y herramientas​

4.1 GitOps para gestión de configuración​

# .github/workflows/config-management.yml
name: Configuration Management Pipeline

on:
pull_request:
paths:
- "infrastructure/**"
- "config/**"
- "k8s/**"

jobs:
validate-configuration:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

- name: Validate Terraform
run: |
terraform init
terraform validate
terraform plan -out=tfplan

- name: Security Scan
run: |
tfsec . --format json --out tfsec-report.json
checkov -d . --output json --file-output checkov-report.json

- name: Policy Compliance
run: |
opa eval -d policies/ -i tfplan data.terraform.deny[_]

- name: Generate Change Report
run: |
python scripts/generate_change_report.py \
--baseline current-baseline.json \
--proposed tfplan \
--output change-report.md

- name: Post PR Comment
uses: actions/github-script@v6
with:
script: |
const fs = require('fs');
const changeReport = fs.readFileSync('change-report.md', 'utf8');
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: changeReport
});

deploy-to-staging:
needs: validate-configuration
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
- name: Deploy Configuration
run: |
terraform apply -auto-approve

- name: Update CMDB
run: |
python scripts/update_cmdb.py \
--environment staging \
--baseline new-baseline.json

- name: Run Smoke Tests
run: |
pytest tests/smoke/ --environment=staging

- name: Generate Compliance Report
run: |
python scripts/compliance_report.py \
--standard MDR \
--output compliance-report.pdf

4.2 Monitoreo continuo de configuración​

# config_drift_detector.py
import boto3
import json
from deepdiff import DeepDiff
import logging

class ConfigDriftDetector:
def __init__(self):
self.aws_config = boto3.client('config')
self.logger = logging.getLogger(__name__)

def detect_drift(self, resource_type, baseline_config):
"""Detecta desviaciones de la configuración baseline"""
current_config = self.get_current_configuration(resource_type)

diff = DeepDiff(
baseline_config,
current_config,
ignore_order=True,
exclude_paths=["root['LastModified']", "root['CreationTime']"]
)

if diff:
self.handle_drift(resource_type, diff)

return diff

def handle_drift(self, resource_type, diff):
"""Maneja las desviaciones detectadas"""
severity = self.assess_drift_severity(diff)

if severity == "CRITICAL":
# Acción inmediata
self.trigger_auto_remediation(resource_type, diff)
self.send_critical_alert(resource_type, diff)
elif severity == "HIGH":
# Crear ticket de cambio
self.create_change_request(resource_type, diff)
else:
# Log para revisión
self.logger.warning(f"Configuration drift detected: {diff}")

def trigger_auto_remediation(self, resource_type, diff):
"""Intenta remediar automáticamente la desviación"""
remediation_actions = {
"SecurityGroup": self.remediate_security_group,
"S3Bucket": self.remediate_s3_bucket,
"IAMPolicy": self.remediate_iam_policy
}

if resource_type in remediation_actions:
remediation_actions[resource_type](diff)

5. Auditoría y compliance​

5.1 Registro de auditoría de configuración​

-- Tabla de auditoría de configuraciones
CREATE TABLE configuration_audit_log (
audit_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
timestamp TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
ci_id VARCHAR(50) NOT NULL,
action VARCHAR(50) NOT NULL, -- CREATE, UPDATE, DELETE, ROLLBACK
old_value JSONB,
new_value JSONB,
change_request_id VARCHAR(50),
user_id VARCHAR(100) NOT NULL,
user_role VARCHAR(50),
approval_evidence JSONB,
medical_device_impact BOOLEAN DEFAULT FALSE,
regulatory_notification_required BOOLEAN DEFAULT FALSE,
compliance_check_result JSONB,
INDEX idx_ci_id (ci_id),
INDEX idx_timestamp (timestamp),
INDEX idx_user (user_id)
);

-- Vista para reportes de compliance
CREATE VIEW configuration_compliance_view AS
SELECT
ci.ci_id,
ci.name,
ci.criticality,
cal.timestamp as last_change,
cal.user_id as changed_by,
cal.compliance_check_result->>'status' as compliance_status,
CASE
WHEN ci.medical_device_component = TRUE
THEN 'MDR/FDA Required'
ELSE 'Standard'
END as regulatory_level
FROM configuration_items ci
LEFT JOIN LATERAL (
SELECT * FROM configuration_audit_log
WHERE ci_id = ci.ci_id
ORDER BY timestamp DESC
LIMIT 1
) cal ON TRUE;

5.2 Reportes de configuración​

# configuration_reports.py
class ConfigurationReporter:
def generate_monthly_report(self, month, year):
"""Genera reporte mensual de configuración para compliance"""
report = {
"period": f"{year}-{month:02d}",
"summary": {},
"changes": [],
"incidents": [],
"compliance": {},
"recommendations": []
}

# Estadísticas de cambios
report["summary"] = {
"total_changes": self.count_changes(month, year),
"emergency_changes": self.count_emergency_changes(month, year),
"failed_changes": self.count_failed_changes(month, year),
"rollbacks": self.count_rollbacks(month, year),
"unauthorized_changes": self.detect_unauthorized_changes(month, year)
}

# Compliance con baselines
report["compliance"] = {
"baseline_compliance_rate": self.calculate_baseline_compliance(),
"security_compliance": self.check_security_compliance(),
"regulatory_compliance": {
"MDR": self.check_mdr_compliance(),
"FDA": self.check_fda_compliance(),
"ISO_13485": self.check_iso_compliance()
}
}

# Generar PDF con firma digital
pdf_report = self.generate_pdf(report)
signed_report = self.sign_document(pdf_report)

return signed_report

6. Métricas e indicadores​

KPIs de gestión de configuración​

Configuration_Management_KPIs:
Accuracy:
- CI_Accuracy_Rate: 99.2% # CIs correctamente documentados
- Baseline_Compliance: 98.5% # Sistemas alineados con baseline
- Discovery_Coverage: 97.8% # Assets descubiertos vs documentados

Change_Management:
- Change_Success_Rate: 96.3%
- Emergency_Change_Percentage: 2.1%
- Average_Change_Lead_Time: 4.2 days
- Rollback_Rate: 1.8%

Compliance:
- Audit_Finding_Rate: 0.3 per audit
- Time_to_Remediation: 2.1 days average
- Policy_Violation_Rate: 0.5%

Automation:
- Automated_Discovery_Rate: 94%
- Auto_Remediation_Success: 87%
- Manual_Intervention_Required: 13%

7. Integración con otros controles ENS​

  • OP.EXP.1: Actualización automática del inventario de activos
  • OP.EXP.2: Aplicación de configuraciones de seguridad
  • OP.EXP.5: Proceso integrado de gestión de cambios
  • OP.EXP.7: Configuraciones relacionadas con incidentes
  • MP.SI.2: Configuración de controles criptográficos

8. Consideraciones específicas para dispositivo médico​

Control de configuración de algoritmos de IA​

  • Versionado inmutable de modelos
  • Trazabilidad con datasets de entrenamiento
  • Registro de métricas de performance clínica
  • Procedimiento de rollback validado clínicamente

Requisitos regulatorios​

  • Cumplimiento con IEC 62304 para control de configuración de software
  • Documentación en DHF de todas las versiones released
  • Notificación a autoridades de cambios significativos
  • Retención de configuraciones históricas por 10 años

9. Referencias y documentación relacionada​

  • T-024-006: Procedimiento de gestión de cambios
  • T-024-007: Guía de versionado y release
  • R-TF-013-002: Registro de gestión de riesgos
  • GP-005: Control de cambios
  • GP-013: Gestión de la ciberseguridad

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
Previous
OP.EXP.2 Configuración de seguridad
Next
OP.EXP.4 Mantenimiento
  • Documentos de referencia
  • Guía de implantación
  • Implementación en Legit Health Plus
    • 1. Sistema de Gestión de Configuración (CMDB)
      • 1.1 Arquitectura del sistema
      • 1.2 Categorías de elementos de configuración (CIs)
        • Nivel 1: Componentes críticos del dispositivo médico
        • Nivel 2: Infraestructura de soporte
    • 2. Proceso de gestión de configuración
      • 2.1 Identificación y registro
      • 2.2 Control de versiones
      • 2.3 Control de cambios
    • Fase 4: Verificación y Cierre
      • 3.2 Gestión de baselines
    • 4. Automatización y herramientas
      • 4.1 GitOps para gestión de configuración
      • 4.2 Monitoreo continuo de configuración
    • 5. Auditoría y compliance
      • 5.1 Registro de auditoría de configuración
      • 5.2 Reportes de configuración
    • 6. Métricas e indicadores
      • KPIs de gestión de configuración
    • 7. Integración con otros controles ENS
    • 8. Consideraciones específicas para dispositivo médico
      • Control de configuración de algoritmos de IA
      • Requisitos regulatorios
    • 9. Referencias y documentación relacionada
All the information contained in this QMS is confidential. The recipient agrees not to transmit or reproduce the information, neither by himself nor by third parties, through whichever means, without obtaining the prior written permission of Legit.Health (AI LABS GROUP S.L.)