# 01 — Plan de sécurisation Projet **(RE)Sources Relationnelles** — Bloc INFCDAAL3 > Contexte : plateforme ministérielle manipulant des **données personnelles** > (comptes citoyens, ressources privées, échanges modérés). La sécurité et la > conformité **RGPD** sont donc des exigences fortes. ## 1. Identification des risques de sécurité Analyse inspirée du **Top 10 OWASP** et adaptée au projet. | Risque | Exemple sur le projet | Gravité | Traitement mis en place | |--------|-----------------------|---------|-------------------------| | Injection SQL | Recherche / filtres de ressources | Élevée | ORM Eloquent (requêtes préparées), validation des entrées | | XSS (injection de scripts) | Commentaires, ressources créées par les citoyens | Élevée | Échappement Blade `{{ }}`, en-tête **CSP** | | CSRF | Formulaires (login, création de ressource) | Élevée | Jeton CSRF Laravel automatique sur les formulaires | | Vol de session | Cookies de session | Élevée | Cookies `HttpOnly` + `Secure`, HTTPS forcé, `session.regenerate()` à la connexion | | Mots de passe faibles / en clair | Comptes citoyens | Élevée | Hachage **bcrypt** (`hashed` cast), min. 8 caractères | | Contrôle d'accès défaillant | Accès Back Office / pages profil | Élevée | Middleware `auth`, rôles (Citoyen / Modérateur / Admin / Super-Admin) | | Man-in-the-middle | Transport des données | Élevée | **TLS/HTTPS** obligatoire + **HSTS** | | Exposition d'informations | Messages d'erreur, debug | Moyenne | `APP_DEBUG=false` et `APP_ENV=production` en prod | | Clickjacking | Intégration en iframe | Moyenne | En-tête `X-Frame-Options: SAMEORIGIN` | | Dépendances vulnérables | Paquets Composer / npm | Moyenne | `composer audit` / mises à jour régulières | ## 2. Mesures de prévention des risques ### 2.1 Sécurité applicative (implémentée dans le code) - **Authentification** : hachage bcrypt des mots de passe, régénération de session à la connexion, invalidation à la déconnexion (`app/Http/Controllers/LoginController.php`). - **Contrôle d'accès** : les routes sensibles sont regroupées derrière le middleware `auth` (`routes/web.php`), avec un modèle de **rôles** (`app/Models/Role.php`). - **Validation des entrées** : toutes les données reçues sont validées (règles `required`, `email`, `unique`, `min:8`, `confirmed`…). - **Protection CSRF** : activée par défaut sur tous les formulaires POST/PUT. - **En-têtes de sécurité HTTP** (`app/Http/Middleware/SecurityHeaders.php`) : - `Strict-Transport-Security` (HSTS) — impose HTTPS, - `Content-Security-Policy` (CSP) — limite les sources de scripts (anti-XSS), - `X-Content-Type-Options: nosniff`, - `X-Frame-Options: SAMEORIGIN` (anti-clickjacking), - `Referrer-Policy` et `Permissions-Policy`. - **Forçage HTTPS** (`app/Http/Middleware/ForceHttps.php`) : redirection automatique de HTTP vers HTTPS hors environnement local/test. ### 2.2 Sécurité du transport et de l'infrastructure - **TLS/HTTPS** terminé au niveau du reverse proxy (`nginx.conf`) : le port 80 redirige en 301 vers le port 443. - Nom de domaine du service : `https://app.sam-coffre.duckdns.org`. - Séparation des rôles conteneurs : PHP-FPM (`laravel_php`) et serveur web (`laravel_web`) isolés (`docker-compose.yml`). ## 3. Chiffrement des données | Donnée | État au repos | En transit | |--------|---------------|-----------| | Mots de passe | Hachage **bcrypt** (non réversible) | HTTPS | | Sessions / cookies | Chiffrés via `APP_KEY` (AES-256), `SESSION_ENCRYPT=true` en prod | HTTPS + cookie `Secure`/`HttpOnly` | | Données personnelles sensibles | Chiffrables via les *casts* `encrypted` d'Eloquent | HTTPS | | Communications client ↔ serveur | — | **TLS 1.2+** obligatoire | > Laravel chiffre en **AES-256-CBC** à partir de la clé `APP_KEY`. Cette clé est > stockée hors dépôt (`.env` est dans `.gitignore`) et ne doit jamais être versionnée. ## 4. Conformité RGPD - **Minimisation** : seules les données nécessaires sont collectées (pseudo, e-mail). - **Base légale et information** : pages légales présentes (`resources/views/legal/mentions.blade.php`, `resources/views/legal/politique.blade.php`). - **Droit d'accès / rectification** : espace profil (`/profile/settings`, `ProfileController`). - **Droit à l'effacement / anonymisation** : implémenté. Depuis son espace profil, l'utilisateur peut supprimer son compte (confirmation par mot de passe) ; ses données personnelles (e-mail, pseudo, mot de passe) sont alors anonymisées de façon irréversible via `Utilisateur::anonymiser()` (`app/Http/Controllers/ProfileController@destroy`), tout en préservant l'intégrité référentielle des contributions. - **Sécurité par défaut** (privacy by design) : chiffrement, HTTPS, contrôle d'accès. - **Sous-traitance et hébergement** : hébergement maîtrisé, journalisation des accès. ## 5. Bonnes pratiques de développement - **Style de code homogène** : **Laravel Pint** (PSR-12), vérifié en CI (`vendor/bin/pint --test`). - **Commentaires** : le code de sécurité (middlewares) est documenté en français. - **Tests automatisés** : `tests/Feature/SecuriteTest.php` vérifie les en-têtes de sécurité et le contrôle d'accès aux pages protégées. - **Séparation des environnements** : configuration via `.env` (jamais de secret en dur). - **Architecture MVC** : contrôleurs / modèles / vues séparés. ## 6. Synthèse — traçabilité risque → mesure Chaque risque du §1 est couvert par au moins une mesure du §2/§3/§4, et les mesures critiques (en-têtes, contrôle d'accès) sont **vérifiées automatiquement** par la CI à chaque évolution du code.