Files
Ressources-relationnel/docs/01-plan-de-securisation.md
sam e5e6f72f92
CD - Déploiement continu / deploy (push) Successful in 6m44s
CI - Intégration continue / quality-and-tests (push) Failing after 2m30s
Sécurisation, déploiement CI/CD Gitea et documentation INFCDAAL3
- CI/CD Gitea Actions: ci.yml (Pint + PHPUnit), deploy.yml (déploiement SSH)
- Suppression de l'ancien workflow GitHub cassé
- En-têtes de sécurité: ajout CSP et Permissions-Policy
- RGPD: droit à l'effacement (anonymisation du compte) + tests
- Correctifs: ForceHttps hors env testing, timestamps du modèle Utilisateur,
  suppression des migrations en doublon (migrate échouait sur base neuve)
- Qualité: formatage Laravel Pint sur l'ensemble du code
- Documentation dossier technique (docs/) + .docx + .pptx

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 11:09:34 +02:00

5.6 KiB

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.