diff --git a/README.md b/README.md index e5767fd..d53533a 100644 --- a/README.md +++ b/README.md @@ -248,6 +248,29 @@ poc_allowed_sources: ["203.0.113.10"] # IP autorisées sur les sites de poc_re La restriction par IP est une règle ModSecurity par site (id 10002) qui laisse passer le challenge ACME. Le client de test est toujours autorisé. Ajoutez `shop` à `poc_restricted_sites` pour ne pas exposer Juice Shop à tout Internet. +### Derrière un reverse proxy existant (Traefik) + +Si 80/443 sont déjà pris par un Traefik, il termine le TLS public (ses propres certificats Let's Encrypt) et relaie vers le WAF en HTTPS (certificat auto-signé du PoC) : garder `poc_tls: selfsigned` et déclarer son IP dans `poc_trusted_proxies` pour que BunkerWeb voie l'IP réelle des clients (sinon un bannissement viserait Traefik, donc tout le monde). Exemple de configuration dynamique Traefik (fichier) : + +```yaml +http: + routers: + bwpoc: + rule: "Host(`www.lab.naoned.net`) || Host(`shop.lab.naoned.net`) || Host(`api.lab.naoned.net`) || Host(`bwui.lab.naoned.net`)" + entryPoints: [websecure] + service: bwpoc + tls: { certResolver: letsencrypt } + services: + bwpoc: + loadBalancer: + passHostHeader: true + serversTransport: bwpoc-insecure + servers: [{ url: "https://192.168.200.155:443" }] + serversTransports: + bwpoc-insecure: + insecureSkipVerify: true +``` + ## Exploitation ```bash diff --git a/inventory/group_vars/all.yml b/inventory/group_vars/all.yml index fdad2ab..08439d9 100644 --- a/inventory/group_vars/all.yml +++ b/inventory/group_vars/all.yml @@ -16,6 +16,11 @@ poc_tls: selfsigned poc_letsencrypt_email: "" poc_letsencrypt_staging: false # true pour tester sans consommer les quotas Let's Encrypt +# Reverse proxy en frontal (Traefik, HAProxy...) qui termine le TLS public et relaie vers +# le WAF (https://:443, certificat auto-signé à accepter côté proxy) : ses IP, pour +# que BunkerWeb prenne l'IP réelle du client dans X-Forwarded-For (bans, limites, listes). +poc_trusted_proxies: [] # ex. ["192.168.200.10"] + # --- Exposition publique ------------------------------------------------ # Sites réservés à certaines IP sources (403 pour les autres, sauf challenge ACME). # Le client de test du PoC est toujours autorisé. Liste vide = pas de restriction. diff --git a/inventory/group_vars/bunkerweb.yml b/inventory/group_vars/bunkerweb.yml index 7ea2b10..70e66dd 100644 --- a/inventory/group_vars/bunkerweb.yml +++ b/inventory/group_vars/bunkerweb.yml @@ -28,6 +28,11 @@ bw_global_settings: 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"