Option reverse proxy en frontal : IP réelle des clients (poc_trusted_proxies), exemple Traefik

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
cedricandClaude Opus 5.5 committed 2026-10-27 15:36:03 +01:00
1 parent 0e5426b7c3
commit 17d9ff4b29
3 files changed
+33

No files matched your search

+23
View File
@@ -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. 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 ## Exploitation
```bash ```bash
+5
View File
@@ -16,6 +16,11 @@ poc_tls: selfsigned
poc_letsencrypt_email: "" poc_letsencrypt_email: ""
poc_letsencrypt_staging: false # true pour tester sans consommer les quotas Let's Encrypt 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://<waf>: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 ------------------------------------------------ # --- Exposition publique ------------------------------------------------
# Sites réservés à certaines IP sources (403 pour les autres, sauf challenge ACME). # 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. # Le client de test du PoC est toujours autorisé. Liste vide = pas de restriction.
+5
View File
@@ -28,6 +28,11 @@ bw_global_settings:
LETS_ENCRYPT_CHALLENGE: "http" LETS_ENCRYPT_CHALLENGE: "http"
USE_LETS_ENCRYPT_STAGING: "{{ 'yes' if poc_letsencrypt_staging | bool else 'no' }}" USE_LETS_ENCRYPT_STAGING: "{{ 'yes' if poc_letsencrypt_staging | bool else 'no' }}"
AUTO_REDIRECT_HTTP_TO_HTTPS: "yes" 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) # WAF : ModSecurity + OWASP CRS v4 actifs partout (défaut BunkerWeb)
USE_MODSECURITY: "yes" USE_MODSECURITY: "yes"
USE_MODSECURITY_CRS: "yes" USE_MODSECURITY_CRS: "yes"