Synology Bunkerweb : Reverse Proxy WAF OpenSource

  • Vague de SPAM

    Suite à une vague de spam sur le forum, les inscriptions sont temporairement limitées.

    Après votre inscription, un membre de l'équipe devra valider votre compte avant qu'il ne soit activé. Nous sommes désolés pour la gêne occasionnée et vous remercions de votre patience.

Titux

Apprenti
Membre Confirmé
1 Novembre 2023
50
40
33
Non pas besoin de compte.

J'ai un docker-compose qui me lance bunkerweb via container manager.
Par contre, je n'ai toujours pas eu le temps de faire les tests.
J'ai des doutes sur la configuration pour qu'il puisse lire les logs des autres instances docker et donc faire le bon taff.

Voici le docker-compose
YAML:
# =============================================================================
# FICHIER 1/2 : docker-compose.yml
# =============================================================================
# Configuration BunkerWeb pour Synology avec fichier .env séparé
# Documentation: https://docs.bunkerweb.io/latest/web-ui/
# =============================================================================

version: "3.9"

# Variables communes pour éviter les répétitions
x-bw-env: &bw-env
  TZ: ${TZ:-Europe/Paris}
  API_WHITELIST_IP: ${API_WHITELIST_IP}
  DATABASE_URI: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@bw-db:5432/${POSTGRES_DB}

# Configuration des logs (rotation automatique)
x-logging: &default-logging
  driver: json-file
  options:
    max-size: ${LOG_MAX_SIZE:-10m}
    max-file: ${LOG_MAX_FILE:-10}

services:
  # ---------------------------------------------------------------------------
  # BUNKERWEB - Reverse Proxy WAF Principal
  # ---------------------------------------------------------------------------
  bunkerweb:
    container_name: bunkerweb
    image: bunkerity/bunkerweb:1.6.8
    restart: unless-stopped
    networks:
      - bw-universe
      - bw-services
    ports:
      - "${BW_HTTP_PORT}:8080/tcp"
      - "${BW_HTTPS_PORT}:8443/tcp"
      - "${BW_HTTPS_PORT}:8443/udp"
    environment:
      <<: *bw-env
      # Désactive le serveur par défaut pour éviter les conflits
      DISABLE_DEFAULT_SERVER: ${DISABLE_DEFAULT_SERVER:-yes}
      # Autorise les connexions HTTP sans nom de domaine
      SERVER_NAME: ""
      # Sécurité
      USE_MODSECURITY: ${USE_MODSECURITY:-yes}
      USE_MODSECURITY_CRS: ${USE_MODSECURITY_CRS:-yes}
      USE_ANTIBOT: ${USE_ANTIBOT:-cookie}
      USE_CROWDSEC: ${USE_CROWDSEC:-yes}
      CROWDSEC_API: ${CROWDSEC_API}
      USE_DNSBL: ${USE_DNSBL:-yes}
      USE_COUNTRY: ${USE_COUNTRY:-yes}
      WHITELIST_COUNTRY: ${WHITELIST_COUNTRY:-FR}
      USE_LIMIT_REQ: ${USE_LIMIT_REQ:-yes}
      LIMIT_REQ_RATE: ${LIMIT_REQ_RATE:-20r/s}
    volumes:
      - ${BW_DATA_PATH}:/data
      - ${BW_CACHE_PATH}:/cache
      - ${BW_LOGS_PATH}:/var/log/bunkerweb
    logging: *default-logging
    depends_on:
      bw-db:
        condition: service_healthy

  # ---------------------------------------------------------------------------
  # SCHEDULER - Gestion de la configuration
  # ---------------------------------------------------------------------------
  bw-scheduler:
    container_name: bw-scheduler
    image: bunkerity/bunkerweb-scheduler:1.6.8
    restart: unless-stopped
    networks:
      - bw-universe
      - bw-db-net
    environment:
      <<: *bw-env
      BUNKERWEB_INSTANCES: ${BUNKERWEB_INSTANCES}
      MULTISITE: ${MULTISITE:-yes}
       # SERVER_NAME vide = accès par IP
      SERVER_NAME: ""
      UI_HOST: ${UI_HOST}
      SERVE_FILES: ${SERVE_FILES:-no}
      DISABLE_DEFAULT_SERVER: ${DISABLE_DEFAULT_SERVER:-yes}
      USE_CLIENT_CACHE: ${USE_CLIENT_CACHE:-yes}
      USE_GZIP: ${USE_GZIP:-yes}
       # Autorise l'accès sans nom de domaine
      USE_CUSTOM_HTTPS: "yes"
      CUSTOM_HTTPS_CERT: ""
      CUSTOM_HTTPS_KEY: ""
    volumes:
      - ${BW_DATA_PATH}:/data
      - ${BW_CACHE_PATH}:/cache
    logging: *default-logging
    depends_on:
      - bunkerweb
      - bw-db

  # ---------------------------------------------------------------------------
  # WEB UI - Interface d'administration
  # ---------------------------------------------------------------------------
  bw-ui:
    container_name: bw-ui
    image: bunkerity/bunkerweb-ui:1.6.8
    restart: unless-stopped
    networks:
      - bw-universe
      - bw-db-net
    ports:
      - "${UI_PORT}:7000"
    environment:
      <<: *bw-env
      ADMIN_USERNAME: ${ADMIN_USERNAME}
      ADMIN_PASSWORD: ${ADMIN_PASSWORD}
      #TOTP_ENCRYPTION_KEYS: ${TOTP_ENCRYPTION_KEYS}
    volumes:
      - ${BW_DATA_PATH}:/data
      - ${BW_LOGS_PATH}:/var/log/bunkerweb:ro
    logging: *default-logging
    depends_on:
      - bw-db

  # ---------------------------------------------------------------------------
  # POSTGRESQL - Base de données
  # ---------------------------------------------------------------------------
  bw-db:
    container_name: bw-db
    image: postgres:17
    restart: unless-stopped
    networks:
      - bw-db-net
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      PGDATA: /var/lib/postgresql/data/pgdata
      # Locale compatible avec toutes les images PostgreSQL
      LANG: C.UTF-8
      LC_ALL: C.UTF-8
    volumes:
      - ${BW_DB_PATH}:/var/lib/postgresql/data
    logging: *default-logging
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 30s
      timeout: 10s
      retries: 3
    command:
      - postgres
      - -c
      - max_connections=50
      - -c
      - shared_buffers=128MB
      - -c
      - effective_cache_size=512MB

  # ---------------------------------------------------------------------------
  # CROWDSEC - Protection collaborative
  # ---------------------------------------------------------------------------
  crowdsec:
    container_name: crowdsec
    image: crowdsecurity/crowdsec:latest
    restart: unless-stopped
    networks:
      - bw-universe
    environment:
      TZ: ${TZ:-Europe/Paris}
      COLLECTIONS: ${CROWDSEC_COLLECTIONS}
      LEVEL_INFO: ${CROWDSEC_LOG_LEVEL:-info}
    volumes:
      - ${CROWDSEC_CONFIG_PATH}:/etc/crowdsec
      - ${CROWDSEC_DATA_PATH}:/var/lib/crowdsec/data
      - ${BW_LOGS_PATH}:/var/log/bunkerweb:ro
    logging: *default-logging

# =============================================================================
# RÉSEAUX - Architecture 3 niveaux
# =============================================================================
networks:
  bw-universe:
    driver: bridge
    enable_ipv6: false
    ipam:
      config:
        - subnet: ${BW_UNIVERSE_SUBNET}
    driver_opts:
      com.docker.network.bridge.name: br-bw-universe
      com.docker.network.bridge.enable_ip_masquerade: "true"

  bw-services:
    driver: bridge
    enable_ipv6: false
    ipam:
      config:
        - subnet: ${BW_SERVICES_SUBNET}
    driver_opts:
      com.docker.network.bridge.name: br-bw-services

  bw-db-net:
    driver: bridge
    enable_ipv6: false
    ipam:
      config:
        - subnet: ${BW_DB_SUBNET}
    driver_opts:
      com.docker.network.bridge.name: br-bw-db

Et le fichier ;env
Markdown (GitHub flavored):
# =============================================================================
# FICHIER 2/2 : .env
# =============================================================================
# Créez ce fichier dans le même répertoire que docker-compose.yml
# Documentation: https://docs.docker.com/compose/environment-variables/
# =============================================================================
# ATTENTION : Ne JAMAIS commiter ce fichier dans Git !
# Ajoutez ".env" dans votre .gitignore
# =============================================================================

# -----------------------------------------------------------------------------
# PORTS SYNOLOGY (80 et 443 sont réservés par DSM)
# -----------------------------------------------------------------------------
BW_HTTP_PORT=          # HTTP - Configurer NAT: 80 externe → 9880 NAS
BW_HTTPS_PORT=         # HTTPS/QUIC - Configurer NAT: 443 externe → 9443 NAS
UI_PORT=7000               # Interface Web UI (accès interne uniquement)

# -----------------------------------------------------------------------------
# CHEMINS DE VOLUMES SYNOLOGY
# -----------------------------------------------------------------------------
BW_DATA_PATH=/volume2/docker/bunkerweb/data
BW_CACHE_PATH=/volume2/docker/bunkerweb/cache
BW_LOGS_PATH=/volume2/docker/bunkerweb/logs
BW_DB_PATH=/volume2/docker/bunkerweb/db
CROWDSEC_CONFIG_PATH=/volume2/docker/bunkerweb/crowdsec/config
CROWDSEC_DATA_PATH=/volume2/docker/bunkerweb/crowdsec/data

# -----------------------------------------------------------------------------
# CONFIGURATION RÉSEAU
# -----------------------------------------------------------------------------
# Subnets pour les 3 réseaux Docker isolés
BW_UNIVERSE_SUBNET=10.20.30.0/24      # Gestion BunkerWeb
BW_SERVICES_SUBNET=10.20.31.0/24      # Applications web
BW_DB_SUBNET=10.20.32.0/24            # Base de données

# API Whitelist - CRITIQUE : doit inclure le réseau bw-universe
#API_WHITELIST_IP=API_WHITELIST_IP=127.0.0.0/8 10.20.30.0/24

# -----------------------------------------------------------------------------
# POSTGRESQL - BASE DE DONNÉES
# -----------------------------------------------------------------------------
#  CHANGEZ CES VALEURS AVANT LE DÉPLOIEMENT !
POSTGRES_DB=db
POSTGRES_USER=bunkerweb
POSTGRES_PASSWORD=

# -----------------------------------------------------------------------------
# WEB UI - INTERFACE D'ADMINISTRATION
# -----------------------------------------------------------------------------
#  CHANGEZ CES VALEURS AVANT LE DÉPLOIEMENT !
# Le mot de passe doit contenir au moins 8 caractères avec :
# - 1 minuscule, 1 majuscule, 1 chiffre, 1 caractère spécial
ADMIN_USERNAME=
ADMIN_PASSWORD=

# Clé de chiffrement pour 2FA (TOTP)
# Générer avec : python3 -c "from passlib import totp; print(totp.generate_secret())"
#  GÉNÉREZ UNE NOUVELLE CLÉ AVANT LE DÉPLOIEMENT !
#TOTP_ENCRYPTION_KEYS=CHANGEME_GENERATE_WITH_PASSLIB

# -----------------------------------------------------------------------------
# BUNKERWEB - CONFIGURATION
# -----------------------------------------------------------------------------
BUNKERWEB_INSTANCES=bunkerweb
MULTISITE=yes
SERVER_NAME=                           # Défini via l'UI
UI_HOST=http://192.168.*.***:7000
SERVE_FILES=no
DISABLE_DEFAULT_SERVER=yes
USE_CLIENT_CACHE=yes
USE_GZIP=yes

# -----------------------------------------------------------------------------
# SÉCURITÉ - MODSECURITY
# -----------------------------------------------------------------------------
USE_MODSECURITY=yes
USE_MODSECURITY_CRS=yes
USE_ANTIBOT=cookie

# -----------------------------------------------------------------------------
# SÉCURITÉ - CROWDSEC
# -----------------------------------------------------------------------------
USE_CROWDSEC=yes
CROWDSEC_API=http://crowdsec:8080
CROWDSEC_COLLECTIONS=crowdsecurity/nginx crowdsecurity/http-cve bunkerity/bunkerweb Dominic-Wagner/vaultwarden crowdsecurity/base-http-scenarios
CROWDSEC_LOG_LEVEL=info

# -----------------------------------------------------------------------------
# SÉCURITÉ - FILTRES GÉOGRAPHIQUES ET RATE LIMITING
# -----------------------------------------------------------------------------
USE_DNSBL=yes
USE_COUNTRY=yes
WHITELIST_COUNTRY=FR                   # Code ISO pays autorisés (séparés par espaces)
USE_LIMIT_REQ=yes
LIMIT_REQ_RATE=20r/s                   # Taux de requêtes maximum

# -----------------------------------------------------------------------------
# LOGS - ROTATION
# -----------------------------------------------------------------------------
LOG_MAX_SIZE=10m                       # Taille max par fichier de log
LOG_MAX_FILE=10                        # Nombre de fichiers conservés

# -----------------------------------------------------------------------------
# FUSEAU HORAIRE
# -----------------------------------------------------------------------------
TZ=Europe/Paris

Mais on est bien hors sujet. Je suis partant pour créer un sujet reverse proxy.
D'autre ici utilise NPMPlus + Crowdsec + Fail2ban + geoipupdate. Je serais curieux de voir comment ils ont fait sur un Synology.
Pok @EVO @PackTu @MilesTEG (et autre) partant pour discuter du sujet ? On le fait dans quelle rubrique ?
 
  • J'aime
Réactions: morgyann
@Titux
Je pense qu’il serait préférable de faire un nouveau sujet.
Je vais déplacer ton message mais tu le veux dans quelle section ? Tu vas mettre bunkerweb sur le Syno ?
 
  • J'aime
Réactions: morgyann