Sécurité¶
⬇️ Télécharger cette page en Markdown
Introduction¶
Documentation complète de la sécurité : multi-tenant, RGPD, conformité ANSSI, Active Directory.
Contenu¶
Multi-tenant¶
Audit sécurité complet : isolation par mairie, endpoints API, vulnérabilités corrigées, tests recommandés.
Floutage visages¶
Face blurring RGPD : détection (PHP facedetect / Haar Cascade), algorithme (pixellisation + Gaussian blur), installation, monitoring.
Conformité ANSSI¶
Checklist ANSSI : TLS 1.3, permissions fichiers, sessions sécurisées, prepared statements, password hashing.
Active Directory¶
Intégration SSO LDAP : authentification AD, synchronisation utilisateurs, permissions hybrides.
Principes de Sécurité¶
Secure by Default
Tous les composants suivent les recommandations ANSSI par défaut.
1. Multi-Tenant Isolation¶
Principe : Aucune donnée ne fuit entre mairies.
Mécanismes :
- Filtrage SQL strict par mairie_id
- Validation API par code_postal
- Permissions service-based
- Cache avec préfixe mairie_id
2. RGPD Compliance¶
Face Blurring : - Détection automatique visages - Anonymisation obligatoire - Pas de conservation originaux - Traçabilité BDD
Données Personnelles : - Citoyens anonymes par défaut - Soft delete (préservation stats) - Exports chiffrés
3. ANSSI Recommendations¶
| Règle | Implémentation |
|---|---|
| TLS 1.3+ | Reverse proxy |
| En-têtes HTTP | CSP, HSTS (2 ans), X-Frame, X-Content-Type, Referrer, Permissions-Policy |
| CORS | Whitelist stricte via SecurityHelpers::setCorsHeaders() — plus de wildcard |
| Permissions | 0755 dirs, 0644 files (0777 banni) |
| Sessions | HttpOnly, SameSite Strict, use_strict_mode |
| SQL | Prepared statements + mapping statique pour les noms de colonnes |
| Passwords | bcrypt (cost 12) |
| PHP config | display_errors=Off, expose_php=Off, allow_url_fopen=Off |
| JWT | Secret obligatoire dans .env — aucun fallback faible |
| Erreurs | Messages génériques côté client, détails loggés serveur |
| Uploads | Validation MIME par magic bytes + exécution PHP bloquée dans /uploads/ |
| Path traversal | Validation realpath() sur toute récupération de fichier |
Audit Sécurité v2.0¶
Vulnérabilité Corrigée¶
Endpoint : get_all_unresolved_incidents.php
Avant :
// ❌ Retournait incidents de TOUTES les mairies sans auth
$incidents = $db->fetchAll("SELECT * FROM incidents WHERE statut != 'resolu'");
Après :
// ✅ Auth obligatoire + filtrage strict
Auth::requireAuth();
$mairie = MairieService::getByCodePostal($_GET['code_postal']);
$incidents = $db->fetchAll(
"SELECT * FROM incidents WHERE statut != 'resolu' AND mairie_id = ?",
[$mairie['id']]
);
Tests Sécurité Recommandés¶
Tests Multi-Tenant¶
# Test 1: Tentative accès mairie différente
curl -H "X-Fingerprint: test" \
"http://localhost:8080/api/get_incidents.php?code_postal=06000"
curl -H "X-Fingerprint: test" \
"http://localhost:8080/api/get_incidents.php?code_postal=75001"
# Vérifier : aucun incident de 06000 dans réponse 75001
Tests Injection SQL¶
# Test injection dans code_postal
curl "http://localhost:8080/api/get_types.php?code_postal=06000' OR '1'='1"
# Attendu : 400 Bad Request ou []
Checklist Production¶
- Changer TOUS les mots de passe (DB, Redis, SMTP)
- Générer
JWT_SECRETfort :openssl rand -hex 32 - Définir
APP_ENV=production(exclut localhost de la whitelist CORS) -
APP_DEBUG=false - TLS 1.3 activé (reverse proxy)
- Ports DB/Redis non exposés
- phpMyAdmin désactivé (pas de
--profile admin) - Face blurring activé
- Backups chiffrés
- Logs centralisés
- Rate limiting activé
- WAF configuré (optionnel)
- Rebuild Docker après changement de config :
docker-compose up -d --build
Navigation Rapide¶
| Document | Description |
|---|---|
| Multi-tenant | Audit isolation mairies |
| Face Blurring | RGPD anonymisation |
| ANSSI | Conformité ANSSI |
| Active Directory | SSO LDAP |