chore(security): SbD parameters in .env.example + hardened php.ini
This commit is contained in:
parent
fae5c23722
commit
2d33e9d442
2 changed files with 68 additions and 1 deletions
44
.env.example
44
.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
|
||||
# ===================================================================
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue