Chapitre 2 — Architecture du SAE ProbatioVault¶
2.1 Architecture logique¶
L'architecture logique du SAE ProbatioVault repose sur une separation stricte des responsabilites entre quatre couches fonctionnelles : presentation, traitement metier, stockage persistant et services cryptographiques. Cette organisation garantit que chaque composant peut evoluer independamment tout en preservant les proprietes probatoires du systeme.
2.1.1 Couche presentation — Application mobile (React Native / Expo)¶
L'application mobile constitue le point d'entree utilisateur du SAE. Developpee en TypeScript strict avec le framework Expo / React Native, elle est deployee sur iOS et Android. Elle assure les fonctions suivantes dans le perimetre du SAE :
- Chiffrement client-side : avant toute transmission reseau, le document est chiffre localement par l'application au moyen de l'algorithme AES-256-GCM. La cle de chiffrement du document (K_doc) est derivee de la cle maitre utilisateur (K_master_user) via HKDF-SHA3-256, avec le document_id comme sel. Le serveur ne recoit jamais le document en clair (principe Zero-Knowledge).
- Gestion du keystore local : la cle maitre utilisateur est conservee dans le Secure Store du terminal (Secure Enclave sur iOS, Android Keystore sur Android), protegee par une cle de chiffrement (K_encryption) derivee du mot de passe utilisateur via Argon2id (64 MiB, t=3, p=4).
- Calcul d'empreintes : le hash SHA3-256 du document chiffre est calcule localement et transmis au backend pour enregistrement dans la base de metadonnees.
- Gestion d'etat : la couche etat applicatif repose sur Zustand, assurant une gestion reactive et previsible des donnees en memoire.
2.1.2 Couche traitement metier — Backend NestJS¶
Le backend constitue le coeur du traitement metier du SAE. Il orchestre les flux documentaires (ingestion, consultation, certification, destruction) et applique les regles metier sans jamais acceder aux documents en clair.
Stack technique :
| Composant | Technologie | Role SAE |
|---|---|---|
| Framework | NestJS 10.x | Orchestration des modules, injection de dependances |
| Langage | TypeScript 5.x (mode strict) | Typage statique, prevention des erreurs |
| ORM | TypeORM 0.3.x | Acces aux metadonnees PostgreSQL, migrations |
| Base de donnees | PostgreSQL 15.x | Metadonnees documentaires, enveloppes de cles, preuves |
| File d'attente | BullMQ (Redis) | Jobs asynchrones (replication, batch cryptographique) |
| HSM | AWS CloudHSM (PKCS#11) | Signature probatoire, key wrapping |
Modules fonctionnels SAE :
| Module | Responsabilite |
|---|---|
| Auth | Authentification OIDC/JWT (PD-26), autorisation hybride roles + scopes, audit des acces |
| Documents | CRUD sur les metadonnees documentaires, validation des empreintes SHA3-256, gestion proprietaire/acces |
| Crypto | Interface PKCS#11 vers le HSM, key wrapping AES-KWP, signature RSA-PSS 4096 bits |
| Storage | Interface S3 unifiee (OVH HOT / AWS COLD), upload/download des documents chiffres, gestion Object Lock |
| Audit | Journalisation immutable (append-only) des actions utilisateur, export pour audit externe |
| Replication | Worker asynchrone BullMQ pour la replication OVH vers AWS Glacier avec Object Lock COMPLIANCE |
2.1.3 Couche stockage persistant¶
Le stockage se decompose en trois sous-systemes complementaires :
- PostgreSQL : base de donnees relationnelle hebergeant les metadonnees documentaires (empreintes, dates, proprietaires), les enveloppes de cles chiffrees (key_envelopes), les preuves composites (hash + signature + horodatage) et les journaux d'audit structures. Le mecanisme Row-Level Security (RLS) assure l'isolation des donnees entre utilisateurs au niveau du SGBD.
- Redis : cache en memoire pour les sessions, les tokens JWT et l'acceleration des lectures frequentes de metadonnees. Redis sert egalement de broker pour les files BullMQ (jobs de replication et de batch cryptographique).
- Stockage objet S3 : couche de persistence des documents chiffres, repartie sur deux fournisseurs cloud (OVH pour l'acces actif, AWS pour l'archivage conforme). Le detail de cette architecture est developpe au chapitre 4.
2.1.4 Couche services cryptographiques¶
Les operations cryptographiques sensibles sont deleguees a un module HSM (Hardware Security Module) AWS CloudHSM certifie FIPS 140-2 Level 3, accessible via l'interface PKCS#11 :
- Signature probatoire : les empreintes documentaires sont signees avec une cle RSA-PSS 4096 bits dont la cle privee ne quitte jamais le HSM (propriete non-exportable).
- Key wrapping : les cles de chiffrement utilisateur sont encapsulees via AES-KWP (NIST SP 800-38F) avant stockage dans la base de donnees.
- Horodatage qualifie : apres signature HSM, un jeton d'horodatage RFC 3161 est obtenu aupres d'une autorite de confiance (TSA) conforme eIDAS, completant la preuve composite.
Diagramme : Architecture C4 niveau conteneurs¶
Le diagramme suivant presente les composants principaux du SAE ProbatioVault et leurs interactions a l'echelle des conteneurs (niveau 2 du modele C4).
graph TB
subgraph Clients["Clients mobiles"]
APP["Application React Native<br/>Chiffrement AES-256-GCM<br/>Keystore local"]
end
subgraph Backend["Backend NestJS"]
API["API REST /api/v1<br/>Auth OIDC + RLS"]
CRYPTO["Module Crypto<br/>PKCS#11 / Key Wrapping"]
STORAGE["Module Storage<br/>Interface S3 unifiee"]
AUDIT["Module Audit<br/>Journalisation append-only"]
REPL["Worker Replication<br/>BullMQ async"]
end
subgraph Persistance["Stockage persistant"]
PG["PostgreSQL 15<br/>Metadonnees + RLS"]
REDIS["Redis<br/>Cache + BullMQ"]
OVH["OVH S3 HOT<br/>Gravelines, France"]
AWS["AWS S3 / Glacier<br/>Paris, France"]
end
HSM["AWS CloudHSM<br/>PKCS#11 / FIPS 140-2 L3"]
APP -->|"HTTPS / TLS 1.3"| API
API --> CRYPTO
API --> STORAGE
API --> AUDIT
CRYPTO --> HSM
STORAGE --> OVH
REPL --> OVH
REPL --> AWS
AUDIT --> AWS
API --> PG
REPL --> REDIS
API --> REDIS Legende : Les fleches representent les flux de donnees entre composants. Toutes les communications externes transitent par TLS 1.3. Le HSM est accessible uniquement depuis le module Crypto du backend. Les documents chiffres circulent du client vers OVH S3 (acces actif), puis sont repliques de maniere asynchrone vers AWS Glacier (archivage conforme). Les journaux d'audit sont ecrits directement dans AWS S3 en mode append-only avec Object Lock COMPLIANCE.
2.2 Architecture physique¶
L'infrastructure physique du SAE ProbatioVault repose sur une strategie multi-cloud combinant OVH Cloud (souverainete et performance) et AWS (conformite WORM et resilience geographique). Cette repartition est motivee par trois contraintes cumulatives :
- OVH ne supporte pas S3 Object Lock natif : l'immutabilite WORM hardware-backed exigee par les normes NF Z42-013 et ISO 14641 impose AWS S3 Object Lock en mode COMPLIANCE.
- AWS Glacier present une latence de restauration de 12 a 48 heures : l'acces quotidien aux documents necessite un stockage actif a faible latence, assure par OVH S3 (acces inferieur a 100 ms).
- La resilience geographique requiert une replication cross-region : la conformite RGPD et la protection contre la perte de donnees imposent une copie dans un second centre de donnees europeen (AWS Frankfurt).
2.2.1 Zone OVH Cloud — Stockage actif (HOT)¶
Le stockage actif est heberge dans le centre de donnees OVH de Gravelines (region GRA), en France. Il constitue le point d'ecriture principal et le point de lecture par defaut pour les documents utilisateurs.
| Ressource | Configuration |
|---|---|
| Serveur backend | VPS OVH (Gravelines), NestJS, firewall UFW, SSH par cle uniquement, Fail2ban |
Bucket documents-hot | S3, versioning active, chiffrement AES-256 automatique, pas de lifecycle (conservation permanente) |
Bucket backups | S3, backups quotidiens PostgreSQL, lifecycle expiration 30 jours |
Bucket temp-uploads | S3, staging des uploads, lifecycle expiration 7 jours |
| Endpoint S3 | https://s3.gra.cloud.ovh.net |
| Latence lecture | Inferieure a 100 ms |
| SLA disponibilite | 99.9% |
2.2.2 Zone AWS Paris — Archivage conforme (COLD)¶
L'archivage conforme est heberge dans la region AWS eu-west-3 (Paris), en France. Il assure l'immutabilite WORM des documents et des journaux d'audit via S3 Object Lock en mode COMPLIANCE.
| Ressource | Configuration |
|---|---|
Bucket documents-cold | Object Lock COMPLIANCE 50 ans, versioning obligatoire, transition Glacier Deep Archive a J+1, durabilite 99,999999999% (11 nines) |
Bucket audit-logs | Object Lock COMPLIANCE 50 ans, classe Standard (acces rapide pour audit), politique IAM write-only (append), suppression interdite |
Bucket s3-access-logs | Logs d'acces S3, lifecycle expiration 90 jours |
| HSM | AWS CloudHSM (cluster FIPS 140-2 Level 3), cles non-exportables |
| Endpoint S3 | https://s3.eu-west-3.amazonaws.com |
| Cout archivage | Environ 1 USD/TB/mois apres transition Glacier Deep Archive |
2.2.3 Zone AWS Frankfurt — Resilience geographique (CRR)¶
La replication cross-region (CRR) est configuree depuis le bucket documents-cold de Paris vers le bucket archives-frankfurt dans la region AWS eu-central-1 (Frankfurt), en Allemagne.
| Parametre | Valeur |
|---|---|
| Bucket destination | archives-frankfurt |
| Classe de stockage | DEEP_ARCHIVE (directement) |
| Object Lock | COMPLIANCE repliquee depuis Paris |
| SLA de replication (RTC) | 15 minutes maximum |
| Replication des delete markers | Desactivee (protection WORM) |
| Replication Object Lock | Activee (retention preservee) |
La CRR assure qu'en cas de perte de la region Paris, les archives restent accessibles depuis Frankfurt avec les memes garanties d'immutabilite. Les delete markers ne sont pas repliques pour empecher toute propagation de tentative de suppression.
Diagramme : Deploiement multi-cloud¶
Le diagramme suivant presente la repartition physique des composants du SAE entre les trois zones d'hebergement, ainsi que les flux de replication.
graph TB
subgraph OVH_GRA["OVH Cloud — Gravelines, France"]
VPS["VPS Backend NestJS<br/>UFW + Fail2ban"]
S3_HOT["S3 documents-hot<br/>Acces < 100 ms<br/>Versioning active"]
S3_BKP["S3 backups<br/>PostgreSQL dump 30j"]
PG_DB["PostgreSQL 15<br/>Metadonnees + RLS"]
REDIS_C["Redis<br/>Cache + BullMQ"]
end
subgraph AWS_PARIS["AWS — Paris eu-west-3"]
S3_COLD["S3 documents-cold<br/>Object Lock COMPLIANCE 50 ans<br/>Glacier Deep Archive J+1"]
S3_AUDIT["S3 audit-logs<br/>Object Lock COMPLIANCE 50 ans<br/>Append-only"]
HSM_P["CloudHSM<br/>FIPS 140-2 L3"]
end
subgraph AWS_FRANKFURT["AWS — Frankfurt eu-central-1"]
S3_CRR["S3 archives-frankfurt<br/>DEEP_ARCHIVE<br/>Object Lock COMPLIANCE"]
end
VPS -->|"Lecture/Ecriture"| S3_HOT
VPS -->|"Replication async<br/>BullMQ worker"| S3_COLD
VPS -->|"Append-only"| S3_AUDIT
VPS --> PG_DB
VPS --> REDIS_C
VPS -->|"PKCS#11"| HSM_P
S3_COLD -->|"CRR 15 min SLA"| S3_CRR Legende : Le VPS OVH communique avec les services AWS via HTTPS/TLS. La replication des documents d'OVH vers AWS Glacier est asynchrone, pilotee par un worker BullMQ. La CRR (Cross-Region Replication) de Paris vers Frankfurt est geree nativement par AWS avec un SLA de 15 minutes et preservation de l'Object Lock. Toutes les donnees restent dans l'Union europeenne (France et Allemagne).
2.3 Interfaces entre composants¶
Cette section detaille les protocoles, formats et regles de communication entre les composants du SAE. Chaque interface est documentee avec ses contraintes de securite et ses proprietes probatoires.
2.3.1 Interface Client — Backend (API REST)¶
| Propriete | Valeur |
|---|---|
| Protocole | HTTPS / TLS 1.3, cipher suite TLS_AES_256_GCM_SHA384 |
| Format | JSON (corps de requete et reponse) |
| Authentification | JWT signe RS256 via OIDC/JWKS (PD-26) |
| Autorisation | Hybride roles + scopes, guards NestJS (OidcJwtAuthGuard, AuthorizationGuard, ThrottlerGuard) |
| Prefixe de routes | /api/v1/ |
| Rate limiting | ThrottlerGuard (configurable par endpoint) |
| HSTS | Active (force HTTPS) |
| CORS | Configure par environnement |
Flux de donnees : les documents sont chiffres cote client (AES-256-GCM) avant transmission. Le backend recoit exclusivement des blobs chiffres accompagnes de metadonnees (empreinte SHA3-256, taille, type). Il ne possede aucune cle permettant de dechiffrer le contenu documentaire.
Pipeline de traitement d'une requete :
- Middlewares (Helmet, CORS, compression)
- Guard d'authentification (validation JWT via JWKS)
- Intercepteurs (journalisation, transformation)
- Validation du DTO (class-validator)
- Controleur (routage)
- Service (logique metier)
- Repository (acces TypeORM / PostgreSQL)
2.3.2 Interface Backend — PostgreSQL¶
| Propriete | Valeur |
|---|---|
| Protocole | TCP/SSL (connexion chiffree) |
| ORM | TypeORM 0.3.x avec migrations versionees |
| Isolation | Row-Level Security (RLS) par utilisateur |
| Schema | vault_secure |
Regles RLS : a chaque requete HTTP authentifiee, le backend configure le parametre de session app.current_user_id via un intercepteur NestJS. Les politiques RLS de PostgreSQL filtrent automatiquement les lignes accessibles, assurant que chaque utilisateur n'accede qu'a ses propres documents.
Entites principales du schema SAE :
| Entite | Role |
|---|---|
users | Comptes utilisateurs, profils, cles d'acces |
documents | Metadonnees documentaires (empreinte, taille, proprietaire, s3_key) |
key_envelopes | Cles de chiffrement encapsulees (AES-KWP via HSM) |
proofs | Preuves composites (hash + signature HSM + horodatage TSA) |
shares | Partages de documents entre utilisateurs |
replication_status | Etat de replication de chaque document (OVH vers AWS) |
2.3.3 Interface Backend — Stockage S3 (OVH et AWS)¶
| Propriete | OVH S3 HOT | AWS S3 COLD |
|---|---|---|
| Protocole | HTTPS (S3 API compatible) | HTTPS (AWS S3 API) |
| Authentification | Cles d'acces S3 (Access Key / Secret Key) | IAM User avec politique least-privilege |
| Chiffrement au repos | AES-256 automatique (S3 managed) | AES-256 (SSE-S3) |
| Object Lock | Non supporte | COMPLIANCE mode, retention 50 ans |
| Operations autorisees (backend) | PutObject, GetObject, ListBucket | PutObject, PutObjectRetention, GetObject, ListBucket |
| Operations interdites | — | DeleteObject, DeleteBucket, BypassGovernanceRetention |
| Multipart upload | Oui (fichiers superieurs a 100 Mo) | Oui |
Flux d'ecriture : le backend ecrit le document chiffre dans le bucket OVH documents-hot. Un evenement declenche un job BullMQ dans la file replication. Le worker telecharge le document depuis OVH, le transfere vers le bucket AWS documents-cold avec les metadonnees Object Lock (mode COMPLIANCE, retention calculee selon le type de document), puis met a jour la table replication_status.
Flux de lecture : le backend interroge d'abord le cache Redis (TTL 1 heure pour les documents chiffres). En cas d'absence, il telecharge depuis OVH S3 HOT (latence inferieure a 100 ms). En dernier recours (purge manuelle d'OVH), une restauration depuis AWS Glacier est possible mais avec un delai de 12 a 48 heures.
2.3.4 Interface Backend — HSM (PKCS#11)¶
| Propriete | Valeur |
|---|---|
| Protocole | PKCS#11 via SDK CloudHSM |
| Operations | Signature (RSA-PSS 4096 bits), Key Wrapping (AES-KWP 256 bits), generation de cles |
| Propriete des cles | Non-exportables (cle privee jamais hors du HSM) |
| Certification | FIPS 140-2 Level 3 |
| Labels de cles | pv-master-* (production), pv-test-* (tests) |
Flux de signature probatoire :
- Le backend prepare les donnees a signer (empreinte SHA3-256 du document chiffre).
- Le module Crypto invoque le HSM via PKCS#11 pour obtenir la signature RSA-PSS.
- Le backend demande un jeton d'horodatage RFC 3161 aupres de la TSA.
- La preuve composite (empreinte + signature + horodatage + identifiant de cle) est enregistree en base.
2.3.5 Interface Backend — Redis¶
| Propriete | Valeur |
|---|---|
| Protocole | TCP (port 6379, mode protege) |
| Usages | Cache documentaire (TTL 1h), broker BullMQ (files de replication et batch crypto), sessions |
| Persistance | RDB snapshotting (recuperation post-redemarrage) |
2.3.6 Interface Backend — Services d'horodatage (TSA)¶
| Propriete | Valeur |
|---|---|
| Protocole | HTTPS |
| Standard | RFC 3161 |
| Conformite | eIDAS (autorite qualifiee) |
| Donnee transmise | Empreinte SHA3-256 + signature HSM |
| Donnee recue | Jeton d'horodatage signe par la TSA |
2.3.7 Synthese des flux de donnees¶
Le tableau suivant resume les principaux flux de donnees du SAE, leur direction, leur protocole et leur propriete de securite.
| Flux | Source | Destination | Protocole | Securite |
|---|---|---|---|---|
| Upload document chiffre | App mobile | Backend API | HTTPS / TLS 1.3 | AES-256-GCM client-side |
| Stockage actif | Backend | OVH S3 HOT | HTTPS (S3 API) | SSE AES-256 |
| Replication conforme | Worker BullMQ | AWS S3 COLD | HTTPS (AWS S3 API) | Object Lock COMPLIANCE |
| CRR geographique | AWS Paris | AWS Frankfurt | AWS interne (CRR) | Object Lock preservee |
| Journalisation | Backend | AWS S3 audit-logs | HTTPS (AWS S3 API) | Append-only + Object Lock |
| Signature probatoire | Backend Crypto | HSM CloudHSM | PKCS#11 | Cle non-exportable |
| Horodatage qualifie | Backend | TSA | HTTPS (RFC 3161) | Jeton signe eIDAS |
| Consultation document | App mobile | Backend API | HTTPS / TLS 1.3 | JWT + RLS + dechiffrement client |
| Metadonnees | Backend | PostgreSQL | TCP/SSL | RLS par utilisateur |
| Cache | Backend | Redis | TCP | Donnees chiffrees en cache |
Invariants couverts par ce chapitre :
- INV-249-01 : Ce chapitre est le deuxieme des 10 chapitres contractuels du manuel SAE.
- INV-249-02 : Les composants SAE documentes sont le backend NestJS, l'application React Native, l'infrastructure OVH/AWS, le HSM CloudHSM, PostgreSQL et Redis.
- INV-249-03 : Deux diagrammes Mermaid maintenables accompagnent les composants decrits (architecture C4 et deploiement multi-cloud).
- INV-249-06 : Le contenu consolide et synthetise les informations issues de multiples sources (infra, backend, storage) avec references croisees, sans reproduction verbatim superieure a 30%.
- INV-249-07 : Le chapitre est exploitable sans acces au code source ; les regles, protocoles et configurations sont documentes de maniere autonome.