chore(security): SbD parameters in .env.example + hardened php.ini

This commit is contained in:
Imugiii 2026-06-15 08:27:34 +00:00
parent fae5c23722
commit 2d33e9d442
2 changed files with 68 additions and 1 deletions

View file

@ -66,6 +66,50 @@ CORS_ALLOWED_ORIGIN=https://kiosk.example.com
# argon2id recommande depuis PHP 7.3 pour les nouveaux projets. # argon2id recommande depuis PHP 7.3 pour les nouveaux projets.
PASSWORD_ALGO=argon2id 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 # Upload images produits
# =================================================================== # ===================================================================

View file

@ -41,8 +41,31 @@ session.cookie_secure = 1
; Persistance inter-container non necessaire : chaque session est liee a une ; Persistance inter-container non necessaire : chaque session est liee a une
; instance unique du service wakdo-app (pas de scale horizontal pour ce projet). ; 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 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 (perf + stabilite) ---
[opcache] [opcache]