Aller au contenu principal

Playbook Security

StatutActif — v1.0 — 2026-06-27
PrioritéP0
Obligatoire V1Oui
ResponsableSylvain
Voir aussiPlaybook 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 .env commité (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

SecretDevCIProduction
Variables d'environnement.env local (gitignored)Secrets GitHubVariables serveur
Clés API.env.localSecrets GitHub/etc/environment ou .env serveur
Clés SSH~/.ssh/Secrets GitHubCompte 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

  1. Révoquer immédiatement l'ancien secret
  2. Générer le nouveau secret
  3. Mettre à jour sur le serveur
  4. Mettre à jour dans les secrets GitHub
  5. Vérifier le fonctionnement (health check)
  6. 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