Files
geo/api/docs/API-SECURITY.md
Pierre 3443277d4a feat: Release version 3.1.4 - Mode terrain et génération PDF
 Nouvelles fonctionnalités:
- Ajout du mode terrain pour utilisation mobile hors connexion
- Génération automatique de reçus PDF avec template personnalisé
- Révision complète du système de cartes avec amélioration des performances

🔧 Améliorations techniques:
- Refactoring du module chat avec architecture simplifiée
- Optimisation du système de sécurité NIST SP 800-63B
- Amélioration de la gestion des secteurs géographiques
- Support UTF-8 étendu pour les noms d'utilisateurs

📱 Application mobile:
- Nouveau mode terrain dans user_field_mode_page
- Interface utilisateur adaptative pour conditions difficiles
- Synchronisation offline améliorée

🗺️ Cartographie:
- Optimisation des performances MapBox
- Meilleure gestion des tuiles hors ligne
- Amélioration de l'affichage des secteurs

📄 Documentation:
- Ajout guide Android (ANDROID-GUIDE.md)
- Documentation sécurité API (API-SECURITY.md)
- Guide module chat (CHAT_MODULE.md)

🐛 Corrections:
- Résolution des erreurs 400 lors de la création d'utilisateurs
- Correction de la validation des noms d'utilisateurs
- Fix des problèmes de synchronisation chat

🤖 Generated with Claude Code (https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-19 19:38:03 +02:00

8.5 KiB

API Security & Performance Monitoring

📋 Vue d'ensemble

Système complet de sécurité et monitoring pour l'API GeoSector implémenté et opérationnel.

Fonctionnalités implémentées

  • Détection d'intrusions : Brute force, SQL injection, patterns de scan
  • Monitoring des performances : Temps de réponse, utilisation mémoire, requêtes DB
  • Alertes email intelligentes : Throttling, niveaux de priorité
  • Blocage d'IP automatique : Temporaire ou permanent
  • Traçabilité complète : Historique pour audit et analyse

🏗️ Architecture

Tables de base de données (préfixe sec_)

-- 4 tables créées dans scripts/sql/create_security_tables.sql
sec_alerts                 -- Alertes de sécurité
sec_performance_metrics    -- Métriques de performance
sec_failed_login_attempts  -- Tentatives de connexion échouées
sec_blocked_ips           -- IPs bloquées

Services PHP implémentés

src/Services/Security/
├── AlertService.php        # Gestion centralisée des alertes
├── EmailThrottler.php      # Anti-spam pour emails
├── SecurityMonitor.php     # Détection des menaces
├── PerformanceMonitor.php  # Monitoring des temps
└── IPBlocker.php          # Gestion des blocages IP

Contrôleur d'administration

src/Controllers/SecurityController.php  # Interface d'administration

🚀 Installation

1. Créer les tables

# Exécuter le script SQL sur chaque environnement
mysql -u root -p geo_app < scripts/sql/create_security_tables.sql

2. Configurer le cron de purge

# Ajouter dans crontab (crontab -e)
0 2 * * * /usr/bin/php /var/www/geosector/api/scripts/cron/cleanup_security_data.php >> /var/log/security_cleanup.log 2>&1

3. Tester l'installation

php test_security.php

🔒 Fonctionnement

Détection automatique

Le système détecte et bloque automatiquement :

  • Brute force : 5 tentatives échouées en 5 minutes → IP bloquée 1h
  • SQL injection : Patterns suspects → IP bloquée définitivement
  • Scan de vulnérabilités : Accès aux fichiers sensibles → IP bloquée 1h
  • Rate limiting : Plus de 60 requêtes/minute → Rejet temporaire

Monitoring de performance

Chaque requête est automatiquement monitorée :

// Dans index.php
PerformanceMonitor::startRequest();
// ... traitement ...
PerformanceMonitor::endRequest($endpoint, $method, $statusCode);

Alertes email

Configuration des niveaux :

  • INFO : Log uniquement
  • WARNING : Email avec throttling 1h
  • ERROR : Email avec throttling 15min
  • CRITICAL : Email avec throttling 5min
  • SECURITY : Email immédiat, priorité haute

📊 Endpoints d'administration

Tous les endpoints nécessitent une authentification admin (role >= 2) :

GET  /api/admin/metrics           # Métriques de performance
GET  /api/admin/alerts            # Alertes actives
POST /api/admin/alerts/:id/resolve # Résoudre une alerte
GET  /api/admin/blocked-ips       # IPs bloquées
POST /api/admin/unblock-ip        # Débloquer une IP
POST /api/admin/block-ip          # Bloquer une IP manuellement
GET  /api/admin/security-report   # Rapport complet
POST /api/admin/cleanup           # Nettoyer les anciennes données
POST /api/admin/test-alert        # Tester les alertes

🔧 Configuration

Seuils par défaut (modifiables dans les services)

// PerformanceMonitor.php
const DEFAULT_THRESHOLDS = [
    'response_time_warning' => 1000,    // 1 seconde
    'response_time_critical' => 3000,   // 3 secondes
    'db_time_warning' => 500,           // 500ms
    'db_time_critical' => 1000,         // 1 seconde
    'memory_warning' => 64,             // 64 MB
    'memory_critical' => 128            // 128 MB
];

// SecurityMonitor.php
- Brute force : 5 tentatives en 5 minutes
- Rate limit : 60 requêtes par minute
- 404 pattern : 10 erreurs 404 en 10 minutes

// EmailThrottler.php
const DEFAULT_CONFIG = [
    'max_per_hour' => 10,
    'max_per_day' => 50,
    'digest_after' => 5,
    'cooldown_minutes' => 60
];

Rétention des données

Configurée dans scripts/cron/cleanup_security_data.php :

$RETENTION_DAYS = [
    'performance_metrics' => 30,      // 30 jours
    'failed_login_attempts' => 7,     // 7 jours
    'resolved_alerts' => 90,          // 90 jours
    'expired_blocks' => 0              // Déblocage immédiat
];

📈 Métriques surveillées

Performance

  • Temps de réponse total
  • Temps cumulé des requêtes DB
  • Nombre de requêtes DB
  • Utilisation mémoire (pic et moyenne)
  • Codes HTTP de réponse

Sécurité

  • Tentatives de connexion échouées
  • IPs bloquées (temporaires/permanentes)
  • Patterns d'attaque détectés
  • Alertes par type et niveau

🛡️ Patterns de détection

SQL Injection

// Patterns détectés dans SecurityMonitor.php
- UNION SELECT
- DROP TABLE
- INSERT INTO
- UPDATE SET
- DELETE FROM
- Script tags
- OR 1=1
- Commentaires SQL (--)

Fichiers sensibles

// Patterns de scan détectés
- admin, administrator
- wp-admin, phpmyadmin
- .git, .env
- config.php
- backup, .sql, .zip
- shell.php, eval.php

📝 Exemples d'utilisation

Déclencher une alerte manuelle

use App\Services\Security\AlertService;

AlertService::trigger('CUSTOM_ALERT', [
    'message' => 'Événement important détecté',
    'details' => ['user' => $userId, 'action' => $action]
], 'WARNING');

Bloquer une IP manuellement

use App\Services\Security\IPBlocker;

// Blocage temporaire (1 heure)
IPBlocker::block('192.168.1.100', 3600, 'Comportement suspect');

// Blocage permanent
IPBlocker::blockPermanent('192.168.1.100', 'Attaque confirmée');

Obtenir les statistiques

use App\Services\Security\SecurityMonitor;
use App\Services\Security\PerformanceMonitor;

$securityStats = SecurityMonitor::getSecurityStats();
$perfStats = PerformanceMonitor::getStats(null, 24); // 24h

⚠️ Points d'attention

RGPD

  • Les IPs sont des données personnelles
  • Durée de conservation limitée (voir rétention)
  • Anonymisation après traitement

Performance

  • Overhead < 5ms par requête
  • Optimisation des tables avec index
  • Purge automatique des anciennes données

Sécurité

  • Pas d'exposition de données sensibles dans les alertes
  • Chiffrement des données utilisateur
  • Whitelist pour IPs de confiance (localhost)

🔄 Maintenance

Quotidienne (cron)

# Purge automatique à 2h du matin
0 2 * * * php /var/www/geosector/api/scripts/cron/cleanup_security_data.php

Hebdomadaire

  • Vérifier les alertes actives
  • Analyser les tendances de performance
  • Ajuster les seuils si nécessaire

Mensuelle

  • Analyser le rapport de sécurité
  • Mettre à jour les IPs whitelist/blacklist
  • Optimiser les tables si nécessaire

🐛 Dépannage

Les tables n'existent pas

# Créer les tables
mysql -u root -p geo_app < scripts/sql/create_security_tables.sql

Pas d'alertes email

  • Vérifier la configuration email dans AppConfig
  • Vérifier les logs : tail -f logs/geosector-*.log
  • Tester avec : POST /api/admin/test-alert

IP bloquée par erreur

# Via API
curl -X POST https://dapp.geosector.fr/api/admin/unblock-ip \
  -H "Authorization: Bearer TOKEN" \
  -d '{"ip": "192.168.1.100"}'

# Via MySQL
UPDATE sec_blocked_ips SET unblocked_at = NOW() WHERE ip_address = '192.168.1.100';

📚 Ressources

🎯 Statut d'implémentation

Phase 1 : Infrastructure de base - COMPLÉTÉ

  • Tables créées avec préfixe sec_
  • Services PHP implémentés
  • Intégration dans index.php et Database.php

Phase 2 : Monitoring de Performance - COMPLÉTÉ

  • Chronométrage automatique des requêtes
  • Monitoring des requêtes DB
  • Alertes sur dégradation

Phase 3 : Détection d'intrusions - COMPLÉTÉ

  • Détection brute force
  • Détection SQL injection
  • Blocage IP automatique

Phase 4 : Alertes Email - COMPLÉTÉ

  • Service d'alertes avec throttling
  • Templates d'emails
  • Niveaux de priorité

Phase 5 : Administration - COMPLÉTÉ

  • Endpoints d'administration
  • Interface de gestion
  • Rapports de sécurité

Phase 6 : Maintenance - COMPLÉTÉ

  • Script de purge automatique
  • Optimisation des tables
  • Documentation complète

Dernière mise à jour : 2025-01-17 Version : 1.0.0