PoC BunkerWeb 1.6.17 : docker-compose sur Proxmox, déployé par Ansible

Stack BunkerWeb (scheduler, UI, MariaDB, Redis), sites de test (nginx,
Juice Shop, go-httpbin), filtrage DOCKER-USER, script de tests, README
et schéma d'architecture.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
claude BotandClaude Opus 5.5 committed 2026-10-27 11:11:07 +01:00
commit 099584c95c
42 files changed
+4260

No files matched your search

+62
View File
@@ -0,0 +1,62 @@
---
# =====================================================================
# Variables communes du PoC BunkerWeb
# Les valeurs marquées "A ADAPTER" dépendent de votre infra.
# =====================================================================
# --- Domaine de test -------------------------------------------------
# Les sites seront www.<domaine>, shop.<domaine>, api.<domaine>, bwui.<domaine>
# ".internal" est réservé par l'ICANN pour l'usage privé : pas de collision possible.
poc_domain: bwpoc.internal # A ADAPTER si vous avez une zone DNS de labo
# --- Réseau des VM (cloud-init) --------------------------------------
poc_net_prefix: 24 # A ADAPTER
poc_net_gateway: 192.168.200.1 # A ADAPTER
poc_net_dns: [192.168.200.1] # A ADAPTER
poc_net_searchdomain: "{{ poc_domain }}"
# --- Proxmox ----------------------------------------------------------
pve_storage: local-lvm # A ADAPTER : stockage des disques VM
pve_bridge: vmbr0 # A ADAPTER
pve_vlan_tag: "" # vide = pas de VLAN, sinon ex. "200"
pve_template_vmid: 9100
pve_template_name: debian13-cloud
pve_image_url: https://cloud.debian.org/images/cloud/trixie/latest/debian-13-genericcloud-amd64.qcow2
pve_image_path: /var/lib/vz/template/debian-13-genericcloud-amd64.qcow2
# --- Accès aux VM -----------------------------------------------------
poc_vm_user: debian
poc_ssh_pubkey_file: "~/.ssh/id_ed25519.pub" # clé injectée par cloud-init
# --- Versions (épinglées) --------------------------------------------
bunkerweb_version: "1.6.17"
mariadb_image: "mariadb:11"
redis_image: "redis:8-alpine"
juiceshop_image: "bkimminich/juice-shop:v20.3.0"
httpbin_image: "mccutchen/go-httpbin:2.26.0"
nginx_image: "nginx:1.30-alpine"
# --- Arborescence sur les VM -----------------------------------------
poc_base_dir: /opt/bwpoc
# --- Ports publiés par la VM applis (mode split) ---------------------
apps_ports:
www: 8081
shop: 8082
api: 8083
# Ports d'écoute dans les conteneurs (utilisés en mode single)
apps_internal_ports:
www: 80
shop: 3000
api: 8080
# Sources autorisées à joindre directement les applis, en plus du WAF.
# Ajoutez l'IP du client pour comparer "avec / sans WAF" (voir README).
apps_direct_access_sources: []
# Mode calculé : "single" si WAF et applis sont sur le même hôte.
poc_mode: "{{ 'single' if (groups['apps'] | first) == (groups['bunkerweb'] | first) else 'split' }}"
waf_ip: "{{ hostvars[groups['bunkerweb'] | first]['ansible_host'] }}"
apps_ip: "{{ hostvars[groups['apps'] | first]['ansible_host'] }}"
client_ip: "{{ hostvars[groups['client'] | first]['ansible_host'] }}"
+79
View File
@@ -0,0 +1,79 @@
---
# =====================================================================
# 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 : certificats auto-signés par site (pas d'ACME en labo fermé)
GENERATE_SELF_SIGNED_SSL: "yes"
AUTO_REDIRECT_HTTP_TO_HTTPS: "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"