Playbook Security
| Statut | Actif — v1.0 — 2026-06-27 |
| Priorité | P0 |
| Obligatoire V1 | Oui |
| Responsable | Sylvain |
| Voir aussi | Playbook CI · Template Security · Sécurité applicative |
:::info Périmètre Ce playbook couvre la sécurité du cycle de développement : CI/CD, dépendances, secrets, GitHub. La sécurité applicative (RBAC, RLS, API, RGPD) est documentée dans la section Sécurité. :::
GitHub Branch Protection
Activer sur main de chaque repo :
✅ Require a pull request before merging
✅ Require status checks to pass
✅ Require branches to be up to date
✅ Do not allow bypassing the above settings
✅ Restrict who can push to matching branches (admins seulement)
Jamais de force push sur main. Jamais de --no-verify en production.
Secret Scanning
GitHub Secret Scanning doit être activé sur tous les repos (Settings → Security → Secret scanning).
GitHub détecte automatiquement les patterns de secrets courants (clés AWS, tokens GitHub, clés Stripe, etc.) et bloque le push.
En complément, Gitleaks tourne en CI sur chaque PR via le template security.yml.
Règles absolues
- Jamais de secret dans le code source
- Jamais de
.envcommité (vérifier.gitignore) - Les secrets de production ne passent que par les variables d'environnement du serveur ou les secrets GitHub
Dépendances vulnérables
npm audit
npm audit --audit-level=high
Tourne en CI sur chaque PR. Bloque uniquement sur les vulnérabilités high et critical. Les moderate sont à traiter dans la semaine.
composer audit
composer audit
Même logique. Tourne en CI sur les repos Laravel.
Politique de mise à jour
- Mettre à jour les dépendances au minimum mensuellement
- Priorité aux patches de sécurité (traiter sous 48h)
- Ne pas bloquer une release pour une mise à jour non critique
Dependabot (optionnel)
Activer Dependabot via .github/dependabot.yml pour les projets matures :
version: 2
updates:
- package-ecosystem: npm
directory: "/"
schedule:
interval: weekly
- package-ecosystem: composer
directory: "/"
schedule:
interval: weekly
CodeQL (optionnel)
CodeQL (analyse statique de sécurité) est disponible gratuitement pour les repos publics GitHub. Pour les repos privés, activer via GitHub Advanced Security si disponible.
À activer sur les projets qui gèrent des données sensibles.
Headers HTTP
La configuration Nginx du VPS définit les headers de sécurité. Référence dans deployment/nginx.conf.
Headers obligatoires :
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header Referrer-Policy strict-origin-when-cross-origin;
add_header X-XSS-Protection "1; mode=block";
Content Security Policy (CSP)
La CSP est définie au niveau Nginx ou dans next.config.ts. Commencer permissif puis durcir progressivement.
Tester avec csp-evaluator.withgoogle.com.
Cookies sécurisés
Tous les cookies de session doivent avoir :
Secure; HttpOnly; SameSite=Lax
Laravel Sanctum configure cela automatiquement. Vérifier config/session.php.
CORS
Configurer strictement dans config/cors.php :
'allowed_origins' => [
'https://monvillage.fr',
'https://espace.monvillage.fr',
],
En développement uniquement : ['*'] peut être utilisé mais jamais en production.
Rate Limiting
Les routes API sensibles doivent avoir un rate limiting Laravel :
Route::middleware(['throttle:api'])->group(function () {
// routes publiques
});
Route::middleware(['throttle:60,1'])->group(function () {
// routes authentifiées
});
Vérifier aussi la configuration Nginx (limit_req_zone).
Validation Laravel
Toute entrée utilisateur doit passer par un FormRequest ou $request->validate(). Pas de confiance aveugle aux données entrantes.
$validated = $request->validate([
'email' => ['required', 'email', 'max:255'],
'nom' => ['required', 'string', 'max:100'],
]);
Gestion des secrets
Environnements
| Secret | Dev | CI | Production |
|---|---|---|---|
| Variables d'environnement | .env local (gitignored) | Secrets GitHub | Variables serveur |
| Clés API | .env.local | Secrets GitHub | /etc/environment ou .env serveur |
| Clés SSH | ~/.ssh/ | Secrets GitHub | Compte deploy dédié |
Rotation des clés
Événements déclenchant une rotation immédiate :
- Suspicion de fuite (secret visible dans les logs, commité par erreur)
- Départ d'un accès admin
- Incident de sécurité
Rotation périodique :
- Clés SSH de déploiement : tous les 12 mois
- APP_KEY Laravel : lors des migrations de serveur
Procédure de rotation d'urgence
- Révoquer immédiatement l'ancien secret
- Générer le nouveau secret
- Mettre à jour sur le serveur
- Mettre à jour dans les secrets GitHub
- Vérifier le fonctionnement (health check)
- Auditer les logs pour détecter un usage suspect
Permissions GitHub
Membres de l'organisation
- Développeurs : Write sur leurs repos
- Admins : Admin seulement sur les repos qu'ils maintiennent
- Bots/automation : Read ou Write selon le besoin strict
GitHub Actions
permissions:
contents: read # minimum par défaut
Jamais permissions: write-all. Chaque workflow déclare uniquement ce dont il a besoin.
Tokens Personal Access Token
- Utiliser des fine-grained tokens (pas les classic tokens)
- Scope minimal nécessaire
- Expiration à 90 jours maximum
- Jamais partagés entre plusieurs personnes