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>
This commit is contained in:
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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).
|
||||
@@ -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.
@@ -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.
Reference in New Issue
Block a user