ProbatioVault - Documentation Conformité Stockage¶
PD-4: Stockage Hybride OVH + AWS avec Object Lock COMPLIANCE
1. Normes de Conformité¶
1.1 NF Z42-013 (Archivage électronique français)¶
Exigences: - ✅ Traçabilité des opérations (audit logs immuables) - ✅ Intégrité des documents (versioning + Object Lock) - ✅ Pérennité de l'archivage (AWS Glacier Deep Archive 99.999999999% durabilité) - ✅ Sécurité d'accès (IAM policies, TLS 1.2+, chiffrement AES-256) - ✅ Horodatage fiable (metadata S3 LastModified + Object Lock RetainUntilDate)
Implémentation ProbatioVault:
Documents → Chiffrement client (AES-256-GCM)
→ Upload OVH S3 (HOT)
→ Réplication AWS Glacier (COLD + Object Lock COMPLIANCE)
→ Audit logs append-only (AWS S3 Object Lock 50 ans)
1.2 ISO 14641 (Conservation documents électroniques)¶
Exigences: - ✅ Authenticité (signatures + metadata immuables) - ✅ Fiabilité (Object Lock hardware-backed COMPLIANCE mode) - ✅ Intégrité (versioning + checksum ETag) - ✅ Exploitabilité (accès < 12h via Glacier Deep Archive restore)
Points clés: - Object Lock COMPLIANCE = Hardware-backed immutability (WORM) - Même AWS root ne peut supprimer avant expiration retention - Glacier Deep Archive = 11 9's durabilité (99.999999999%)
1.3 Code du Travail L3243-4 (Bulletins de paie)¶
Obligation légale:
L'employeur conserve une copie des bulletins de paie des salariés ou des documents équivalents pendant 5 ans (nouvelle loi 2024).
Ancienne obligation (pré-2024): 50 ans pour traçabilité retraite
Implémentation ProbatioVault:
# Tag-based retention: 50 ans pour bulletins paie
aws_s3_bucket_lifecycle_configuration "documents_cold_lifecycle" {
rule {
id = "payslips-50-years-retention"
filter {
tag {
key = "DocumentType"
value = "payslip"
}
}
expiration {
days = 18250 # 50 ans
}
}
}
Backend tagging:
// Lors de l'upload d'un bulletin de paie
await s3Client.putObject({
Bucket: 'probatiovault-documents-cold-dev',
Key: `payslips/${userId}/${year}/${month}.pdf.enc`,
Body: encryptedBuffer,
ObjectLockMode: 'COMPLIANCE',
ObjectLockRetainUntilDate: new Date(Date.now() + 50 * 365 * 24 * 60 * 60 * 1000),
Tagging: 'DocumentType=payslip&RetentionYears=50',
});
1.4 Code de Commerce L123-22 (Factures)¶
Obligation légale:
Les documents comptables et les pièces justificatives sont conservés pendant 10 ans.
Implémentation:
rule {
id = "invoices-10-years-retention"
filter {
tag {
key = "DocumentType"
value = "invoice"
}
}
expiration {
days = 3650 # 10 ans
}
}
1.5 RGPD (Règlement Général Protection Données)¶
Exigence RGPD vs Object Lock: - Droit à l'oubli (Article 17) : Supprimer données personnelles sur demande - Object Lock COMPLIANCE : Interdit suppression avant expiration
Dérogation RGPD Article 17.3.b:
Le droit à l'effacement ne s'applique pas si le traitement est nécessaire pour respecter une obligation légale.
✅ Bulletins de paie (50 ans) : Exception légale (Code du travail) ✅ Factures (10 ans) : Exception légale (Code de commerce) ✅ Audit logs (50 ans) : Exception légale (traçabilité)
Implémentation conformité RGPD: 1. Pseudonymisation des documents (chiffrement avec K_doc unique) 2. Metadata minimales (pas de noms dans keys S3) 3. Base de données séparée (identité vs documents chiffrés) 4. Droit d'accès via backend (pas d'accès direct S3)
2. Architecture de Sécurité¶
2.1 Defense in Depth¶
Couche 1: Chiffrement Client (Backend)
├── AES-256-GCM (K_doc dérivée de K_master_user)
├── HMAC-SHA256 (intégrité)
└── IV unique par document
Couche 2: TLS 1.2+ (Transport)
├── Certificats TLS valides
├── Cipher suites modernes (TLS_AES_256_GCM_SHA384)
└── HSTS activé
Couche 3: Chiffrement au repos (S3/Glacier)
├── AWS: AES-256 (S3 Managed Keys)
├── OVH: AES-256 (automatic)
└── Bucket keys activées (optimisation coûts)
Couche 4: IAM Policies (Accès)
├── Least Privilege (backend user minimal permissions)
├── Deny DeleteObject (Object Lock enforcement)
├── Deny BypassGovernanceRetention
└── MFA Delete (versioning protection)
Couche 5: Object Lock COMPLIANCE (Immutabilité)
├── Hardware-backed (impossible à contourner)
├── Versioning obligatoire
├── Retention 50 ans par défaut
└── Legal Hold si besoin (cas judiciaires)
2.2 Contrôles de Sécurité Implémentés¶
| Contrôle | OVH S3 HOT | AWS S3/Glacier COLD |
|---|---|---|
| Chiffrement transit | ✅ TLS 1.2+ | ✅ TLS 1.2+ |
| Chiffrement repos | ✅ AES-256 (auto) | ✅ AES-256 (S3 Managed) |
| Versioning | ✅ Enabled | ✅ Enabled (requis Object Lock) |
| Object Lock WORM | ❌ Non supporté OVH | ✅ COMPLIANCE 50 ans |
| Access Logs | ⚠️ Backend logs | ✅ S3 Access Logs |
| Lifecycle Policies | ⚠️ Manuel (s3cmd) | ✅ Auto (Glacier 90 jours) |
| Public Access Block | ✅ Bucket privé | ✅ Bucket Policy DENY |
| IAM Least Privilege | ⚠️ Credentials S3 | ✅ IAM Policies granulaires |
| Inventory Audit | ❌ Non disponible | ✅ Daily inventory CSV |
3. Procédures de Validation Conformité¶
3.1 Tests de Non-Suppression (Object Lock)¶
Test 1: Suppression impossible avant expiration
# Tenter de supprimer un objet verrouillé
aws s3api delete-object \
--bucket probatiovault-documents-cold-dev \
--key test-locked-document.pdf.enc
# Résultat attendu: AccessDenied (Object Lock COMPLIANCE active)
Test 2: Modification impossible (versioning + Object Lock)
# Tenter d'overwrite un objet verrouillé
aws s3 cp new-file.txt s3://probatiovault-documents-cold-dev/test-locked-document.pdf.enc
# Résultat attendu: Nouvelle version créée (versioning), ancienne version TOUJOURS verrouillée
Test 3: Suppression versioning impossible
# Tenter de désactiver versioning (requis pour Object Lock)
aws s3api put-bucket-versioning \
--bucket probatiovault-documents-cold-dev \
--versioning-configuration Status=Suspended
# Résultat attendu: AccessDenied (Bucket Policy DENY)
3.2 Tests de Rétention Légale¶
Test 4: Vérifier rétention 50 ans bulletins paie
# Upload bulletin de paie avec tag
aws s3api put-object \
--bucket probatiovault-documents-cold-dev \
--key payslips/user-123/2024/01.pdf.enc \
--body bulletin-chiffre.pdf \
--object-lock-mode COMPLIANCE \
--object-lock-retain-until-date "2074-01-01T00:00:00Z" \
--tagging "DocumentType=payslip&RetentionYears=50"
# Vérifier retention
aws s3api get-object-retention \
--bucket probatiovault-documents-cold-dev \
--key payslips/user-123/2024/01.pdf.enc
# Résultat attendu: Mode=COMPLIANCE, RetainUntilDate=2074-01-01
Test 5: Vérifier rétention 10 ans factures
aws s3api put-object \
--bucket probatiovault-documents-cold-dev \
--key invoices/company-456/2024/INV-001.pdf.enc \
--body facture-chiffree.pdf \
--object-lock-mode COMPLIANCE \
--object-lock-retain-until-date "2034-01-01T00:00:00Z" \
--tagging "DocumentType=invoice&RetentionYears=10"
3.3 Tests Audit Logs (Append-Only)¶
Test 6: Audit logs append-only (write-only)
# Upload audit log
aws s3api put-object \
--bucket probatiovault-audit-logs-dev \
--key audit/2024/01/access.log \
--body audit-log.json \
--object-lock-mode COMPLIANCE \
--object-lock-retain-until-date "2074-01-01T00:00:00Z"
# Tenter de supprimer audit log
aws s3api delete-object \
--bucket probatiovault-audit-logs-dev \
--key audit/2024/01/access.log
# Résultat attendu: AccessDenied (Bucket Policy DENY delete)
3.4 Tests Lifecycle Transition Glacier¶
Test 7: Vérifier transition Glacier Deep Archive après 90 jours
# Upload document
aws s3 cp document.pdf.enc s3://probatiovault-documents-cold-dev/
# Attendre 90 jours (ou modifier lifecycle pour test à 1 jour)
# Vérifier storage class
aws s3api head-object \
--bucket probatiovault-documents-cold-dev \
--key document.pdf.enc \
--query 'StorageClass'
# Résultat attendu après 90 jours: "DEEP_ARCHIVE"
4. Rapport de Conformité (Template)¶
4.1 Checklist NF Z42-013¶
- Traçabilité: Audit logs immuables (Object Lock 50 ans)
- Intégrité: Versioning S3 + Object Lock COMPLIANCE
- Pérennité: Glacier Deep Archive (11 9's durabilité)
- Sécurité: TLS 1.2+, AES-256, IAM policies
- Horodatage: Metadata S3 (LastModified, RetainUntilDate)
- Non-répudiation: Object Lock hardware-backed (irréversible)
4.2 Checklist ISO 14641¶
- Authenticité: Metadata + signatures (TODO: implement digital signatures)
- Fiabilité: Object Lock COMPLIANCE (hardware-backed WORM)
- Intégrité: ETag checksum + versioning
- Exploitabilité: Restore Glacier < 12h (Standard retrieval)
4.3 Checklist Rétention Légale¶
- Bulletins paie: 50 ans (Code travail L3243-4) → Tag-based lifecycle
- Factures: 10 ans (Code commerce L123-22) → Tag-based lifecycle
- Audit logs: 50 ans (traçabilité) → Object Lock COMPLIANCE
- Documents généraux: Configurable per-document (Object Lock custom retention)
4.4 Checklist RGPD¶
- Pseudonymisation: Chiffrement client AES-256-GCM
- Minimisation données: Metadata minimales (pas de PII dans keys S3)
- Droit accès: API backend (pas d'accès direct S3)
- Exception effacement: Obligations légales (Code travail, Code commerce)
- Traçabilité: Audit logs append-only
5. Références Légales¶
5.1 Textes de Loi¶
- Code du travail L3243-4: Conservation bulletins paie (50 ans pré-2024, 5 ans depuis 2024)
- Code de commerce L123-22: Conservation documents comptables (10 ans)
- RGPD Article 17.3.b: Exception droit à l'effacement (obligations légales)
- NF Z42-013: Norme française archivage électronique
- ISO 14641: Norme internationale conservation documents
5.2 Documentation AWS¶
- S3 Object Lock Overview
- S3 Object Lock COMPLIANCE vs GOVERNANCE
- Glacier Deep Archive
- S3 Lifecycle Policies
5.3 Documentation OVH¶
6. Responsabilités et Audits¶
6.1 Responsable de Conformité¶
Rôle: Valider conformité trimestrielle Actions: 1. Exécuter tests de non-suppression (Section 3.1) 2. Vérifier inventory S3 (objets verrouillés = 100%) 3. Auditer access logs S3 (détection accès non autorisés) 4. Rapport conformité annuel (template Section 4)
6.2 Audit Externe (Recommandé)¶
Fréquence: Annuel Auditeur: Cabinet spécialisé archivage électronique Scope: - Validation NF Z42-013 - Validation ISO 14641 - Pentest infrastructure S3/Glacier - Revue IAM policies
6.3 Conservation Preuves Conformité¶
Localisation: AWS S3 bucket audit-logs (Object Lock 50 ans) Contenu: - Rapports de tests (Section 3) - Rapports d'audit externe - Inventory S3 trimestriels - Access logs S3 - Changelog infrastructure Terraform
Document rédigé le: 2024-01-19 Version: 1.0 Auteur: Claude Code (PD-4) Validation: En attente audit externe