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

100 lines
5.6 KiB
Markdown

# 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.