--- # ===================================================================== # Réglages BunkerWeb du PoC # Chaque site met en avant un groupe de fonctionnalités (voir README). # Noms de paramètres vérifiés sur les plugin.json de BunkerWeb 1.6.17. # ===================================================================== # Secrets générés au premier lancement et stockés côté contrôleur # dans ./credentials (ignoré par git). Remplaçables par ansible-vault. bw_db_password: "{{ lookup('ansible.builtin.password', playbook_dir ~ '/../credentials/bw_db_password', chars=['ascii_letters', 'digits'], length=24) }}" bw_ui_admin_user: admin # La politique de l'UI impose majuscule, minuscule, chiffre et caractère spécial. bw_ui_admin_password: "{{ lookup('ansible.builtin.password', playbook_dir ~ '/../credentials/bw_ui_admin_password', chars=['ascii_letters', 'digits'], length=20) }}!Aa9" bw_redis_password: "{{ lookup('ansible.builtin.password', playbook_dir ~ '/../credentials/bw_redis_password', chars=['ascii_letters', 'digits'], length=24) }}" # Bannissement court pour pouvoir rejouer les tests (défaut BunkerWeb : 1d) bw_ban_time: 5m # Réglages globaux (contexte global ou valeurs par défaut de tous les sites) bw_global_settings: MULTISITE: "yes" DISABLE_DEFAULT_SERVER: "yes" # Host inconnu = connexion fermée (444) SERVE_FILES: "no" # TLS : auto-signé (labo fermé) ou Let's Encrypt (domaine public), voir poc_tls GENERATE_SELF_SIGNED_SSL: "{{ 'yes' if poc_tls == 'selfsigned' else 'no' }}" AUTO_LETS_ENCRYPT: "{{ 'yes' if poc_tls == 'letsencrypt' else 'no' }}" EMAIL_LETS_ENCRYPT: "{{ poc_letsencrypt_email }}" LETS_ENCRYPT_CHALLENGE: "http" USE_LETS_ENCRYPT_STAGING: "{{ 'yes' if poc_letsencrypt_staging | bool else 'no' }}" AUTO_REDIRECT_HTTP_TO_HTTPS: "yes" # IP réelle du client derrière un reverse proxy (poc_trusted_proxies) USE_REAL_IP: "{{ 'yes' if poc_trusted_proxies | length > 0 else 'no' }}" REAL_IP_FROM: "{{ poc_trusted_proxies | join(' ') if poc_trusted_proxies | length > 0 else '192.168.0.0/16 172.16.0.0/12 10.0.0.0/8' }}" REAL_IP_HEADER: "X-Forwarded-For" REAL_IP_RECURSIVE: "yes" # WAF : ModSecurity + OWASP CRS v4 actifs partout (défaut BunkerWeb) USE_MODSECURITY: "yes" USE_MODSECURITY_CRS: "yes" MODSECURITY_CRS_VERSION: "4" # Bad behavior : 10 codes 4xx en 1 min = bannissement USE_BAD_BEHAVIOR: "yes" BAD_BEHAVIOR_THRESHOLD: "10" BAD_BEHAVIOR_COUNT_TIME: "1m" BAD_BEHAVIOR_BAN_TIME: "{{ bw_ban_time }}" # Listes noires : listes communautaires + un User-Agent maison, testable à coup sûr USE_BLACKLIST: "yes" BLACKLIST_USER_AGENT: "PoC-EvilBot" # Compression USE_GZIP: "yes" USE_BROTLI: "yes" # Redis : bans et sessions partagés (prêt pour ajouter une 2e instance) USE_REDIS: "yes" REDIS_HOST: "bw-redis" REDIS_PASSWORD: "{{ bw_redis_password }}" SEND_ANONYMOUS_REPORT: "no" # Un dictionnaire par site. "upstream" = clé de apps_ports (ou URL complète). bw_sites: # Vitrine statique : antibot (challenge JavaScript), en-têtes de sécurité, compression www: upstream: www settings: USE_ANTIBOT: "javascript" LIMIT_REQ_RATE: "10r/s" # OWASP Juice Shop : appli volontairement vulnérable, terrain de jeu du WAF CRS shop: upstream: shop settings: REVERSE_PROXY_WS: "yes" # socket.io LIMIT_REQ_RATE: "30r/s" # SPA Angular, beaucoup d'assets COOKIE_FLAGS: "* SameSite=Lax" # l'appli lit certains cookies en JS # go-httpbin : API de test pour méthodes, tailles, limites, bad behavior, règle maison api: upstream: api settings: ALLOWED_METHODS: "GET|POST|HEAD" MAX_CLIENT_SIZE: "1m" LIMIT_REQ_RATE: "5r/s" # Règle ModSecurity maison : ?poc=attack => 403 custom_confs: MODSEC_poc-rule: >- SecRule ARGS:poc "@streq attack" "id:10001,phase:2,deny,status:403,log,msg:'PoC BunkerWeb : regle maison'" # Interface d'administration de BunkerWeb bwui: upstream: "http://bw-ui:7000" settings: USE_TEMPLATE: "ui"