e5e6f72f92
- 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>
5.6 KiB
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-PolicyetPermissions-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 (.envest 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.phpvé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.