From 2d33e9d442a5981179429eb5be4bae78c3aaf8e9 Mon Sep 17 00:00:00 2001 From: Imugiii Date: Mon, 15 Jun 2026 08:27:34 +0000 Subject: [PATCH] chore(security): SbD parameters in .env.example + hardened php.ini --- .env.example | 44 ++++++++++++++++++++++++++++++++++++++++++ docker/php-fpm/php.ini | 25 +++++++++++++++++++++++- 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 0e2cb55..10d3c84 100644 --- a/.env.example +++ b/.env.example @@ -66,6 +66,50 @@ CORS_ALLOWED_ORIGIN=https://kiosk.example.com # argon2id recommande depuis PHP 7.3 pour les nouveaux projets. PASSWORD_ALGO=argon2id +# Parametres de cout argon2id (password_hash options). +# Defauts alignes sur les recommandations OWASP Password Storage Cheat Sheet +# (memoire >= 19 MiB, >= 2 iterations). 65536 KiB = 64 MiB, marge confortable. +# Ces valeurs servent aussi au hash du PIN equipier (pin_hash, actions sensibles). +ARGON2_MEMORY_COST=65536 # KiB (64 MiB) +ARGON2_TIME_COST=4 # nombre d'iterations +ARGON2_THREADS=1 # parallelisme (1 = portable, deterministe) + +# =================================================================== +# Anti brute-force - throttling de connexion (security-by-design) +# =================================================================== +# Deux gardes complementaires (cf. docs/merise/mld.md 4.21 + PROJECT_CONTEXT 19) : +# 1. par compte : colonnes user.failed_login_attempts / user.lockout_until +# 2. par IP source : table login_throttle (entite 21) +# Backoff degressif (pas de lock definitif) : evite le DoS sur compte legitime. + +# Compteur par compte : nombre d'echecs avant declenchement du backoff. +ACCOUNT_LOCKOUT_THRESHOLD=5 +# Duree de base du backoff (secondes). Croit de facon degressive a chaque +# palier d'echecs supplementaires (ex : 60 -> 300 -> 900). +ACCOUNT_LOCKOUT_BASE_SECONDS=60 +ACCOUNT_LOCKOUT_MAX_SECONDS=900 # plafond du backoff (15 min) + +# Gate par IP : fenetre glissante et plafond de tentatives sur cette fenetre. +IP_THROTTLE_WINDOW_SECONDS=900 # 15 min +IP_THROTTLE_MAX_ATTEMPTS=20 # par IP sur la fenetre + +# PIN equipier pour actions sensibles (annulation, override). Longueur minimale. +STAFF_PIN_MIN_LENGTH=4 + +# Expiration du token de reinitialisation de mot de passe (secondes). +PASSWORD_RESET_TTL=3600 # 1h + +# =================================================================== +# Retention des donnees (RGPD - minimisation et limitation de conservation) +# =================================================================== +# Purges executees par le service cron (docker/cron/crontab). +# Justification documentee : interet legitime / obligations probatoires. + +AUDIT_LOG_RETENTION_DAYS=365 # journal d'audit ~12 mois +THROTTLE_PURGE_AFTER_HOURS=24 # login_throttle : lignes sans lockout actif > 24h +ORDER_RETENTION_DAYS=1095 # commandes (historique/stats) ~3 ans +# Purge des sessions expirees : deja geree par le cron */15 (voir crontab). + # =================================================================== # Upload images produits # =================================================================== diff --git a/docker/php-fpm/php.ini b/docker/php-fpm/php.ini index bc210d1..dc53cee 100644 --- a/docker/php-fpm/php.ini +++ b/docker/php-fpm/php.ini @@ -41,8 +41,31 @@ session.cookie_secure = 1 ; Persistance inter-container non necessaire : chaque session est liee a une ; instance unique du service wakdo-app (pas de scale horizontal pour ce projet). -; --- Expose_php = Off : ne pas leak la version PHP dans l'entete HTTP --- +; session.gc_maxlifetime : filet de securite cote serveur (l'idle reel est +; pilote par l'appli via SESSION_LIFETIME_IDLE). 4h. +session.gc_maxlifetime = 14400 +; IDs de session longs et a forte entropie (anti-prediction/fixation). +session.sid_length = 48 +session.sid_bits_per_character = 6 +; Pas de cache navigateur sur les pages avec session (anti-fuite via cache). +session.cache_limiter = nocache + +; --- Durcissement general (security-by-design, cf. PROJECT_CONTEXT 19) --- +; Expose_php = Off : ne pas leak la version PHP dans l'entete HTTP. expose_php = Off +; Anti RFI/SSRF : interdire l'ouverture d'URL distantes et leur inclusion. +allow_url_fopen = Off +allow_url_include = Off +; FPM : ne pas deviner le script a partir du PATH_INFO (anti exploitation +; d'upload mal route vers l'interpreteur). Le routage passe par le front controller. +cgi.fix_pathinfo = 0 +; Interdire le chargement dynamique d'extensions au runtime. +enable_dl = Off +; Ne pas inclure les arguments dans les stack traces (anti-fuite de secrets). +zend.exception_ignore_args = On +; Desactiver les fonctions d'execution systeme : l'appli n'en a aucun usage +; legitime (anti-RCE en cas d'injection). Les scripts d'ops vivent cote cron/host. +disable_functions = exec,passthru,shell_exec,system,proc_open,popen ; --- OPcache (perf + stabilite) --- [opcache]