# DevSecOps - Application Médicale MédiSecure
## Partie 1 : Audit et Mise en Conformité
### A. Contexte Réglementaire
#### 1. RGPD et Données de Santé
##### 1.1 Articles Clés
- **Article 9 : Traitement des données de santé**
* Interdiction de principe du traitement
* Exceptions pour la santé
* Conditions de consentement
* Mesures de protection spécifiques
- **Article 35 : Analyses d'impact (DPIA)**
* Obligation d'analyse préalable
* Contenu de l'analyse
* Consultation de l'autorité de contrôle
* Documentation des mesures
- **Article 32 : Sécurité du traitement**
* Mesures techniques requises
* Mesures organisationnelles
* Niveau de sécurité adapté
* Évaluation régulière
##### 1.2 Sanctions et Implications
- Jusqu'à 4% du CA mondial
- Plafond de 20M€
- Impact réputationnel
- Responsabilité pénale possible
#### 2. HDS (Hébergeur de Données de Santé)
##### 2.1 Certification Obligatoire
- Certification depuis 2018
- Audit initial et surveillance
- Renouvellement périodique
- Périmètre d'application
##### 2.2 Référentiel de Certification
- Processus métier
- Infrastructure
- Organisation
- Sécurité physique
- Sécurité logique
#### 3. Standards Internationaux
##### 3.1 HIPAA (USA)
- Privacy Rule
- Security Rule
- Enforcement Rule
- Breach Notification Rule
##### 3.2 NHS Digital (UK)
- Data Security Standards
- Clinical Safety Standards
- Interoperability Standards
- Service Management Standards
##### 3.3 NIS2 Directive (EU)
- Cybersécurité
- Notification des incidents
- Gestion des risques
- Continuité d'activité
### B. Implémentation de la Conformité
#### 1. Gestion du Consentement
```python
from datetime import datetime, timedelta
import jwt
class ConsentManager:
"""
Gestionnaire de consentement RGPD pour données médicales
"""
def __init__(self, secret_key):
self.secret_key = secret_key
def record_consent(self, user_id, purpose, expiration_days=365):
"""
Enregistre le consentement d'un utilisateur
Args:
user_id: Identifiant unique de l'utilisateur
purpose: Finalité du traitement
expiration_days: Durée de validité du consentement
Returns:
str: Token JWT contenant les informations de consentement
"""
consent_data = {
'user_id': user_id,
'purpose': purpose,
'timestamp': datetime.utcnow().isoformat(),
'expiration': (datetime.utcnow() + timedelta(days=expiration_days)).isoformat(),
'version': '1.0'
}
return jwt.encode(consent_data, self.secret_key, algorithm='HS256')
def verify_consent(self, consent_token):
"""
Vérifie la validité d'un consentement
Args:
consent_token: Token JWT de consentement
Returns:
bool: True si le consentement est valide
"""
try:
decoded = jwt.decode(consent_token, self.secret_key, algorithms=['HS256'])
return datetime.fromisoformat(decoded['expiration']) > datetime.utcnow()
except:
return False
def revoke_consent(self, user_id, purpose):
"""
Révoque le consentement d'un utilisateur
Args:
user_id: Identifiant de l'utilisateur
purpose: Finalité concernée
"""
# Logique de révocation
pass
def audit_consent(self, user_id):
"""
Génère un rapport d'audit des consentements
Args:
user_id: Identifiant de l'utilisateur
Returns:
dict: Historique des consentements
"""
# Logique d'audit
pass
```
#### 2. Chiffrement des Données Sensibles
```python
from cryptography.fernet import Fernet
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
import base64
import json
class HealthDataEncryption:
"""
Gestion du chiffrement des données de santé
"""
def __init__(self, master_key):
self.master_key = master_key
self.kdf = PBKDF2HMAC(
algorithm=hashes.SHA256(),
length=32,
salt=b'medisecure_salt',
iterations=100000,
)
def generate_patient_key(self, patient_id):
"""
Génère une clé unique par patient
Args:
patient_id: Identifiant unique du patient
Returns:
Fernet: Instance de chiffrement unique au patient
"""
patient_specific = f"{patient_id}_{self.master_key}".encode()
key = base64.urlsafe_b64encode(self.kdf.derive(patient_specific))
return Fernet(key)
def encrypt_medical_data(self, patient_id, data):
"""
Chiffre les données médicales d'un patient
Args:
patient_id: Identifiant du patient
data: Données à chiffrer
Returns:
bytes: Données chiffrées
"""
cipher = self.generate_patient_key(patient_id)
return cipher.encrypt(json.dumps(data).encode())
def decrypt_medical_data(self, patient_id, encrypted_data):
"""
Déchiffre les données médicales d'un patient
Args:
patient_id: Identifiant du patient
encrypted_data: Données chiffrées
Returns:
dict: Données déchiffrées
"""
cipher = self.generate_patient_key(patient_id)
decrypted = cipher.decrypt(encrypted_data)
return json.loads(decrypted.decode())
```
#### 3. Gestion des Accès et Authentification
```python
from fastapi import FastAPI, Depends, HTTPException, Security
from fastapi.security import OAuth2PasswordBearer, SecurityScopes
from jose import JWTError, jwt
from datetime import datetime, timedelta
from typing import List, Optional
import logging
class SecurityManager:
"""
Gestionnaire de sécurité pour l'application médicale
"""
def __init__(self, secret_key: str, algorithm: str = "HS256"):
self.secret_key = secret_key
self.algorithm = algorithm
self.logger = logging.getLogger("security_manager")
def create_access_token(self, data: dict, scopes: List[str], expires_delta: Optional[timedelta] = None):
"""
Crée un token JWT avec les autorisations appropriées
Args:
data: Données à inclure dans le token
scopes: Liste des autorisations
expires_delta: Durée de validité du token
"""
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta
else:
expire = datetime.utcnow() + timedelta(minutes=15)
to_encode.update({
"exp": expire,
"scopes": scopes,
"iat": datetime.utcnow()
})
return jwt.encode(to_encode, self.secret_key, algorithm=self.algorithm)
def verify_token(self, token: str, required_scopes: List[str] = None):
"""
Vérifie la validité d'un token et ses autorisations
Args:
token: Token JWT à vérifier
required_scopes: Liste des autorisations requises
"""
try:
payload = jwt.decode(token, self.secret_key, algorithms=[self.algorithm])
if required_scopes:
token_scopes = set(payload.get("scopes", []))
for scope in required_scopes:
if scope not in token_scopes:
raise HTTPException(
status_code=403,
detail=f"Permission insuffisante. Requis: {scope}"
)
return payload
except JWTError as e:
self.logger.error(f"Erreur de vérification du token: {str(e)}")
raise HTTPException(status_code=401, detail="Token invalide")
def audit_access(self, user_id: str, resource: str, action: str):
"""
Enregistre une tentative d'accès pour audit
"""
log_entry = {
"timestamp": datetime.utcnow().isoformat(),
"user_id": user_id,
"resource": resource,
"action": action,
"ip_address": self.get_client_ip()
}
self.logger.info(f"Audit log: {log_entry}")
# Stockage dans la base de données d'audit
```
#### 4. Outils d'Audit
##### 4.1 Configuration SonarQube
```yaml
# sonar-project.properties
sonar.projectKey=medisecure
sonar.projectName=MediSecure
sonar.projectVersion=1.0
# Sources
sonar.sources=src
sonar.tests=tests
sonar.exclusions=**/tests/**,**/migrations/**
# Couverture de code
sonar.python.coverage.reportPaths=coverage.xml
sonar.python.xunit.reportPath=test-results.xml
# Qualité
sonar.python.pylint=/path/to/pylint
sonar.python.pylint_config=/path/to/.pylintrc
# Sécurité
sonar.security.sources=src
sonar.security.exclusions=**/test/**
sonar.security.sanitizers=**/sanitizers/**
# Règles personnalisées
sonar.python.rules=/path/to/custom-rules
```
##### 4.2 Configuration OWASP ZAP
```python
from zapv2 import ZAPv2
import time
import logging
class SecurityScanner:
"""
Scanner de sécurité automatisé avec OWASP ZAP
"""
def __init__(self, target_url, api_key):
self.zap = ZAPv2(apikey=api_key, proxies={'http': 'http://127.0.0.1:8080', 'https': 'http://127.0.0.1:8080'})
self.target = target_url
self.logger = logging.getLogger("security_scanner")
def setup_context(self):
"""Configure le contexte de scan"""
context_id = self.zap.context.new_context("medisecure")
self.zap.context.include_in_context("medisecure", f"^{self.target}.*$")
return context_id
def run_scan(self):
"""
Exécute un scan de sécurité complet
"""
try:
# Spider scan
self.logger.info('Démarrage du Spider scan...')
scan_id = self.zap.spider.scan(self.target)
time.sleep(2)
while int(self.zap.spider.status(scan_id)) < 100:
time.sleep(2)
# Active scan
self.logger.info('Démarrage du scan actif...')
scan_id = self.zap.ascan.scan(self.target)
while int(self.zap.ascan.status(scan_id)) < 100:
time.sleep(5)
# Génération du rapport
return self.generate_report()
except Exception as e:
self.logger.error(f"Erreur durant le scan: {str(e)}")
raise
def generate_report(self):
"""
Génère un rapport de sécurité
"""
alerts = self.zap.core.alerts()
report = {
"high_risks": [],
"medium_risks": [],
"low_risks": []
}
for alert in alerts:
risk = alert.get('risk')
if risk == 'High':
report["high_risks"].append(alert)
elif risk == 'Medium':
report["medium_risks"].append(alert)
elif risk == 'Low':
report["low_risks"].append(alert)
return report
```
##### 4.3 Configuration Dependency Check
```yaml
# dependency-check-config.yaml
scan:
dependencies:
# Scan des dépendances Python
python:
enabled: true
path: requirements.txt
# Scan des dépendances JavaScript
node:
enabled: true
path: package.json
output:
format:
- HTML
- JSON
- XML
directory: security-reports
suppression: suppression.xml
# Configuration des règles
rules:
# Niveau de gravité minimum
cvssv3.severity: MEDIUM
# Score CVSS minimum
cvssv3.score: 4.0
cache:
directory: .cache
retention: 7
analyzers:
- experiencePythonPackageVulnerability
- experimentalNodeAudit
# Serveurs NVD
nvd:
urls:
- https://nvd.nist.gov/feeds/json/cve/1.1/nvdcve-1.1-recent.json.gz
```
## Liens utiles
### Références Réglementaires pour les Données de Santé
#### RGPD (Europe)
#### Documents Officiels
- [Texte officiel du RGPD](https://eur-lex.europa.eu/legal-content/FR/TXT/HTML/?uri=CELEX:32016R0679)
- [Article 9 - Traitement des données sensibles](https://gdpr-text.com/fr/read/article-9/)
- [Article 35 - Analyse d'impact (DPIA)](https://gdpr-text.com/fr/read/article-35/)
- [Article 32 - Sécurité du traitement](https://gdpr-text.com/fr/read/article-32/)
#### Guides Pratiques CNIL
- [Guide RGPD du développeur](https://www.cnil.fr/fr/guide-rgpd-du-developpeur)
- [Guide de la sécurité des données personnelles](https://www.cnil.fr/fr/principes-cles/guide-de-la-securite-des-donnees-personnelles)
- [Conformité RGPD : par où commencer](https://www.cnil.fr/fr/rgpd-par-ou-commencer)
- [Outils et méthodes de gestion des risques](https://www.cnil.fr/fr/analyser-les-risques)
#### Outils CNIL
- [PIA (Privacy Impact Assessment) Software](https://www.cnil.fr/fr/outil-pia-telechargez-et-installez-le-logiciel-de-la-cnil)
- [Modèles de registre de traitement](https://www.cnil.fr/fr/RGDP-le-registre-des-activites-de-traitement)
### HDS (Hébergeur de Données de Santé - France)
#### Documents de Référence
- [Référentiel de certification HDS](https://esante.gouv.fr/sites/default/files/media_entity/documents/ans_referentiel_hds_certification.pdf)
- [Procédure de certification](https://esante.gouv.fr/labels-certifications/hds/certification-des-hebergeurs-de-donnees-de-sante)
- [Guide des exigences HDS](https://esante.gouv.fr/sites/default/files/media_entity/documents/ans_referentiel_hds_annexe-exigences.pdf)
#### Ressources ANS (Agence du Numérique en Santé)
- [Liste des hébergeurs certifiés](https://esante.gouv.fr/labels-certifications/hds/liste-des-herbergeurs-certifies)
- [Portail d'accompagnement cybersécurité](https://cyberveille-sante.gouv.fr/)
- [Guide d'accompagnement à la mise en conformité](https://esante.gouv.fr/sites/default/files/media_entity/documents/ans_guide_certification_hds.pdf)
### Standards Internationaux
#### HIPAA (USA)
- [HIPAA Compliance Checklist](https://www.hhs.gov/hipaa/for-professionals/security/guidance/index.html)
- [Guide de sécurité HIPAA](https://www.hhs.gov/sites/default/files/ocr/privacy/hipaa/administrative/securityrule/security101.pdf)
- [Règles de confidentialité](https://www.hhs.gov/hipaa/for-professionals/privacy/laws-regulations/index.html)
#### NHS Digital (UK)
- [Data Security and Protection Toolkit](https://www.dsptoolkit.nhs.uk/)
- [Standards de cybersécurité NHS](https://digital.nhs.uk/cyber-and-data-security)
- [Guide de conformité NHS](https://digital.nhs.uk/data-and-information/looking-after-information/data-security-and-information-governance)
#### NIS2 Directive (EU)
- [Texte officiel de la directive NIS2](https://eur-lex.europa.eu/legal-content/FR/TXT/?uri=CELEX%3A32022L2555)
- [Guide d'implémentation](https://digital-strategy.ec.europa.eu/en/policies/nis2-directive)
- [Mesures de sécurité requises](https://www.enisa.europa.eu/topics/nis-directive)
### Outils de Conformité Recommandés
#### Gestion de la Conformité
- [OneTrust](https://www.onetrust.fr/solutions/healthcare-compliance/)
- [Darktrace](https://www.darktrace.com/solutions/healthcare)
- [IBM Security Guardium](https://www.ibm.com/products/guardium-data-protection)
### Audit et Surveillance
- [Qualys Compliance Suite](https://www.qualys.com/solutions/compliance/)
- [Rapid7 InsightVM](https://www.rapid7.com/products/insightvm/)
- [Tenable.io](https://www.tenable.com/products/tenable-io)
#### Protection des Données
- [Varonis Data Security Platform](https://www.varonis.com/products/data-security-platform)
- [CipherCloud](https://www.ciphercloud.com/solutions/healthcare/)
- [Thales CipherTrust](https://cpl.thalesgroup.com/encryption/ciphertrust-platform)
### Ressources de Formation
#### Formations Certifiantes
- [CISSP Healthcare Security Practitioner](https://www.isc2.org/Certifications/HCISPP)
- [HITRUST Certified CSF Practitioner](https://hitrustalliance.net/hitrust-csf/)
- [Certified HIPAA Professional](https://www.ecfirst.com/certified-hipaa-professional/)
#### Formations Continue
- [ANSSI - SecNumacadémie](https://secnumacademie.gouv.fr/)
- [CNIL - MOOC RGPD](https://atelier-rgpd.cnil.fr/)
- [ANS - Formations e-santé](https://esante-formation.fr/)
### Mise à Jour Réglementaire
#### Sources Officielles
- [Journal officiel de l'UE](https://eur-lex.europa.eu/)
- [Légifrance](https://www.legifrance.gouv.fr/)
- [HHS Office for Civil Rights](https://www.hhs.gov/ocr/index.html)
#### Veille Réglementaire
- [CNIL - Actualités](https://www.cnil.fr/fr/actualites)
- [ANS - Actualités](https://esante.gouv.fr/actualites)
- [ENISA - Publications](https://www.enisa.europa.eu/publications)