Sécurisation, déploiement CI/CD Gitea et documentation INFCDAAL3
CD - Déploiement continu / deploy (push) Successful in 6m44s
CI - Intégration continue / quality-and-tests (push) Failing after 2m30s

- 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>
This commit is contained in:
2026-07-06 11:09:34 +02:00
parent de45e62d20
commit e5e6f72f92
38 changed files with 756 additions and 291 deletions
+99
View File
@@ -0,0 +1,99 @@
# 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.
+109
View File
@@ -0,0 +1,109 @@
# 02 — Plan de déploiement
Projet **(RE)Sources Relationnelles** — Bloc INFCDAAL3
## 1. Stratégie de déploiement
Le déploiement repose sur trois piliers :
1. **Conteneurisation** (Docker) pour un environnement reproductible.
2. **Gestion de version** (Gitea) comme source unique de vérité.
3. **Intégration et déploiement continus** (Gitea Actions) pour automatiser
qualité, tests et mise en production.
Approche retenue : à chaque `push` sur `master`, la CI valide le code
(qualité + tests) ; si tout est vert, le déploiement se déclenche automatiquement
sur le serveur.
## 2. Environnements
| Environnement | Rôle | Hébergement |
|---------------|------|-------------|
| **Local (dev)** | Développement sur le poste | Docker / `php artisan serve` |
| **Test (CI)** | Exécution automatisée des tests | Runner Gitea Actions (base SQLite en mémoire) |
| **Pré-production (QA)** *(recommandé)* | Recette avant mise en ligne | Conteneurs Docker, base dédiée |
| **Production** | Service ouvert aux citoyens | Serveur `app.sam-coffre.duckdns.org` |
> La configuration de chaque environnement est portée par un fichier `.env`
> distinct (jamais versionné). Seul `.env.example` est présent dans le dépôt.
## 3. Architecture de déploiement
```
Internet (HTTPS)
┌───────────────────────────┐
│ Nginx (conteneur web) │ :443 TLS / redirection 80→443
│ laravel_web │
└─────────────┬─────────────┘
│ FastCGI :9000
┌───────────────────────────┐
│ PHP-FPM (conteneur app) │ Laravel 12
│ laravel_php │
└─────────────┬─────────────┘
Base de données MySQL
```
Fichiers concernés : `Dockerfile` (image PHP), `docker-compose.yml`
(orchestration), `nginx.conf` (reverse proxy / TLS).
## 4. Pipeline d'intégration et de déploiement continus (CI/CD)
### 4.1 Intégration continue — `.gitea/workflows/ci.yml`
Déclenchée sur chaque `push` et chaque `pull_request` vers `master` :
1. Récupération du code.
2. Installation de PHP 8.2 et des extensions.
3. Installation des dépendances Composer (avec cache).
4. **Vérification du style de code** : `vendor/bin/pint --test`.
5. **Exécution des tests** : `php artisan test` (PHPUnit).
### 4.2 Déploiement continu — `.gitea/workflows/deploy.yml`
Déclenché sur `push` vers `master`, il se connecte en **SSH** au serveur et exécute :
1. `git pull origin master` — récupération de la nouvelle version.
2. `docker compose up -d --build` — reconstruction des conteneurs.
3. `php artisan migrate --force` — application des migrations de base.
4. `config:cache`, `route:cache`, `view:cache` — optimisations de production.
5. Correction des permissions (`storage`, `bootstrap/cache`).
**Secrets Gitea requis** (Settings → Actions → Secrets) : `SSH_HOST`,
`SSH_USER`, `SSH_PRIVATE_KEY`, `SSH_PORT`.
> Prérequis : un **runner Gitea Actions** doit être enregistré sur l'instance
> (`https://gitea.sam-coffre.duckdns.org/`) et les Actions activées pour le dépôt.
## 5. Plan de déploiement détaillé (étapes, ressources, responsables)
| # | Étape | Ressource / Outil | Responsable | Automatisé ? |
|---|-------|-------------------|-------------|--------------|
| 1 | Développement + commit | Git / Gitea | Développeur | Non |
| 2 | Push sur `master` | Gitea | Développeur | Non |
| 3 | Contrôle qualité (Pint) | Gitea Actions | Runner CI | ✅ Oui |
| 4 | Tests automatisés (PHPUnit) | Gitea Actions | Runner CI | ✅ Oui |
| 5 | Connexion au serveur | SSH | Runner CD | ✅ Oui |
| 6 | Récupération du code | Git | Serveur | ✅ Oui |
| 7 | Build des conteneurs | Docker Compose | Serveur | ✅ Oui |
| 8 | Migrations BDD | Artisan | Serveur | ✅ Oui |
| 9 | Mise en cache config/routes/vues | Artisan | Serveur | ✅ Oui |
| 10 | Vérification post-déploiement | Endpoint `/up` (health check) | Équipe | Semi |
## 6. Retour arrière (rollback)
En cas de problème après un déploiement :
- **Code** : `git revert` ou retour à un tag précédent, puis nouveau déploiement.
- **Base de données** : `php artisan migrate:rollback` (migrations réversibles).
- **Conteneurs** : redéploiement de l'image précédente via `docker compose`.
## 7. Supervision
- **Health check** : endpoint `/up` exposé par Laravel (voir `bootstrap/app.php`).
- **Journaux** : `storage/logs/laravel.log` + logs des conteneurs Docker.
- **Historique des déploiements** : onglet *Actions* de Gitea.
+61
View File
@@ -0,0 +1,61 @@
# 03 — Outil de gestion des versions
Projet **(RE)Sources Relationnelles** — Bloc INFCDAAL3
## 1. Outil choisi : Git + Gitea (auto-hébergé)
Le versionnement du code repose sur **Git**, hébergé sur une instance
**Gitea** auto-hébergée par l'équipe :
- Instance : `https://gitea.sam-coffre.duckdns.org/`
- Motivations du choix :
- **Maîtrise des données** : hébergement sur notre propre serveur (cohérent
avec un contexte ministériel / RGPD, pas de dépendance à un tiers).
- **Léger et open source** : Gitea est simple à administrer et gratuit.
- **Fonctionnalités complètes** : dépôts Git, *pull requests*, *issues*,
*releases*, et **Gitea Actions** (CI/CD) intégrés.
## 2. Organisation du dépôt
- **Branche principale** : `master` (branche de référence, protégée, déployée).
- **Branches de fonctionnalité** *(recommandé)* : une branche par fonctionnalité
(`feature/…`), fusionnée via *pull request* après relecture.
- Fichiers de configuration Git présents : `.gitignore`, `.gitattributes`,
`.editorconfig` (cohérence entre développeurs).
## 3. Convention de nommage des commits
Convention recommandée (type *Conventional Commits*) :
```
<type>: <description courte>
Types : feat, fix, docs, style, refactor, test, chore
Exemples :
feat: ajout de la création de ressources
fix: correction de la redirection HTTPS
docs: rédaction du plan de sécurisation
```
## 4. Flux de travail (workflow) proposé
1. Créer une branche depuis `master` : `git checkout -b feature/ma-fonctionnalite`.
2. Développer + commits atomiques.
3. Pousser la branche : `git push origin feature/ma-fonctionnalite`.
4. Ouvrir une **Pull Request** sur Gitea.
5. La **CI** (Pint + tests) s'exécute automatiquement sur la PR.
6. Relecture par un pair, puis fusion dans `master`.
7. La fusion déclenche le **déploiement automatique** en production.
## 5. Gestion des livraisons (releases)
- Utilisation des **tags Git** pour marquer les versions : `v1.0.0`, `v1.1.0`
- Convention **SemVer** : `MAJEUR.MINEUR.CORRECTIF`.
- Les *Releases* Gitea documentent chaque version livrée (notes de version).
## 6. Sécurité du dépôt
- Aucun secret versionné : `.env`, clés et certificats sont exclus via
`.gitignore`.
- Accès au dépôt restreint aux membres de l'équipe (comptes Gitea).
- Historique complet et traçable (auteur, date, message de chaque modification).
+63
View File
@@ -0,0 +1,63 @@
# 04 — Outil de gestion des demandes d'évolutions et des incidents
Projet **(RE)Sources Relationnelles** — Bloc INFCDAAL3
## 1. Outil choisi : les *Issues* de Gitea
La gestion des évolutions et des incidents s'appuie sur le module **Issues** de
Gitea (déjà utilisé pour le code), ce qui évite d'ajouter un outil externe et
centralise le suivi au même endroit que le code et les déploiements.
- Instance : `https://gitea.sam-coffre.duckdns.org/`
## 2. Typologie des demandes (labels)
Chaque demande est catégorisée par un **label** :
| Label | Usage |
|-------|-------|
| `bug` | Incident / anomalie en production |
| `evolution` | Demande d'évolution fonctionnelle |
| `securite` | Faille ou correctif de sécurité (priorité haute) |
| `documentation` | Mise à jour de documentation |
| `priorite:haute` / `priorite:basse` | Niveau de priorité |
## 3. Cycle de vie d'une demande
```
Ouverte → À traiter → En cours → En test (QA) → Résolue / Fermée
```
- Une *issue* est **liée à une branche et à une Pull Request** ; la fusion de la
PR ferme automatiquement l'issue (mot-clé `Closes #12` dans le commit).
- Le tableau **Projects (Kanban)** de Gitea permet de visualiser l'avancement
(colonnes : À faire / En cours / Terminé).
- Les **Milestones** regroupent les demandes par version cible (ex. `v1.1`).
## 4. Processus de gestion des incidents (maintenance corrective)
1. **Détection** : signalement (utilisateur, supervision, logs).
2. **Qualification** : création d'une issue `bug`, évaluation de la gravité.
3. **Priorisation** : affectation d'un label de priorité et d'un responsable.
4. **Correction** : branche `fix/…`, développement, tests.
5. **Validation** : CI verte + recette en QA.
6. **Déploiement** : fusion sur `master` → mise en production automatique.
7. **Clôture** : fermeture de l'issue, note de version si nécessaire.
## 5. Processus de gestion des évolutions (maintenance évolutive)
1. **Recueil du besoin** : issue `evolution` décrivant le besoin et la valeur.
2. **Analyse et estimation** : faisabilité, impact, charge.
3. **Planification** : affectation à un *milestone* / une version.
4. **Réalisation** : branche `feature/…`, développement + tests.
5. **Revue et intégration** : Pull Request relue, CI validée.
6. **Livraison** : déploiement continu, communication de la nouvelle version.
## 6. Traçabilité
Grâce à Gitea, chaque évolution est traçable de bout en bout :
**Issue → Branche → Commits → Pull Request → CI → Déploiement → Release**
Cette chaîne assure la traçabilité complète exigée pour la maintenance d'une
application manipulant des données sensibles.
Binary file not shown.
+36
View File
@@ -0,0 +1,36 @@
# Dossier de rendu — Bloc INFCDAAL3
**Déployer et sécuriser les applications informatiques**
Projet collaboratif : **(RE)Sources Relationnelles**
Ce dossier regroupe les documents techniques attendus pour le bloc INFCDAAL3.
Il sert de base au **document écrit de 15 à 20 pages** demandé dans les consignes.
## Sommaire
| # | Document | Répond au critère de la grille |
|---|----------|--------------------------------|
| 01 | [Plan de sécurisation](01-plan-de-securisation.md) | Risques de sécurité, RGPD, chiffrement, prévention des risques |
| 02 | [Plan de déploiement](02-plan-de-deploiement.md) | Environnement de déploiement, automatisation, intégration continue, étapes et ressources |
| 03 | [Gestion des versions](03-gestion-des-versions.md) | Outil de gestion des versions (Gitea / Git) |
| 04 | [Gestion des évolutions](04-gestion-des-evolutions.md) | Outil de gestion des demandes d'évolutions et des incidents |
## Correspondance avec la grille d'évaluation
- **Déploiement de l'application** → doc 02 + fichiers `Dockerfile`, `docker-compose.yml`, `nginx.conf`, `.gitea/workflows/`
- **Maintenance** (gestion des versions et des évolutions) → docs 03 et 04
- **Sécurité** (risques, RGPD, bonnes pratiques, plan de sécurisation) → doc 01 + code (`app/Http/Middleware/`, tests, Laravel Pint)
- **Organisation / Prestation orale** → non technique (support de soutenance ~10 slides)
## Éléments techniques livrés dans le dépôt
| Élément | Emplacement | Objectif |
|---------|-------------|----------|
| Intégration continue (qualité + tests) | `.gitea/workflows/ci.yml` | Automatiser Pint + PHPUnit à chaque push |
| Déploiement continu (SSH) | `.gitea/workflows/deploy.yml` | Automatiser la mise en production |
| Conteneurisation | `Dockerfile`, `docker-compose.yml` | Environnement reproductible |
| Serveur web / TLS | `nginx.conf` | Redirection HTTP→HTTPS, HTTPS |
| En-têtes de sécurité | `app/Http/Middleware/SecurityHeaders.php` | HSTS, CSP, X-Frame-Options, etc. |
| Forçage HTTPS | `app/Http/Middleware/ForceHttps.php` | Chiffrement du transport |
| Tests de sécurité | `tests/Feature/SecuriteTest.php` | Vérification automatisée |
| Qualité de code | `laravel/pint` (dev) | Standard PSR / style homogène |
Binary file not shown.