Zum Inhalt

Fortgeschrittene Nutzungen

Viele Beispiele für reale Anwendungsfälle sind im Ordner examples des GitHub-Repositorys verfügbar.

Wir stellen auch zahlreiche Boilerplates zur Verfügung, wie z. B. YAML-Dateien für verschiedene Integrationen und Datenbanktypen. Diese sind im Ordner misc/integrations verfügbar.

Dieser Abschnitt konzentriert sich nur auf fortgeschrittene Nutzungen und Sicherheits-Tuning. Informationen zu allen verfügbaren Einstellungen finden Sie im Features-Abschnitt der Dokumentation.

Anwendungsfälle

Testen

Um schnelle Tests durchzuführen, wenn der Multisite-Modus aktiviert ist (und wenn Sie nicht die richtigen DNS-Einträge für die Domains eingerichtet haben), können Sie curl mit dem HTTP-Host-Header Ihrer Wahl verwenden:

curl -H "Host: app1.example.com" http://ip-oder-fqdn-des-servers

Wenn Sie HTTPS verwenden, müssen Sie mit SNI spielen:

curl -H "Host: app1.example.com" --resolve example.com:443:ip-des-servers https://example.com

Hinter einem Load Balancer oder Reverse Proxy

Echte IP

Wenn BunkerWeb selbst hinter einem Load Balancer oder einem Reverse Proxy steht, müssen Sie es so konfigurieren, dass es die echte IP-Adresse der Clients erhält. Wenn Sie dies nicht tun, werden die Sicherheitsfunktionen die IP-Adresse des Load Balancers oder Reverse Proxys anstelle der des Clients blockieren.

BunkerWeb unterstützt tatsächlich zwei Methoden, um die echte IP-Adresse des Clients abzurufen:

  • Verwendung des PROXY-Protokolls
  • Verwendung eines HTTP-Headers wie X-Forwarded-For

Die folgenden Einstellungen können verwendet werden:

  • USE_REAL_IP: Aktivieren/Deaktivieren des Abrufs der echten IP
  • USE_PROXY_PROTOCOL: Aktivieren/Deaktivieren der Unterstützung des PROXY-Protokolls.
  • REAL_IP_FROM: Liste der vertrauenswürdigen IP-/Netzwerkadressen, die uns die "echte IP" senden dürfen
  • REAL_IP_HEADER: Der HTTP-Header, der die echte IP enthält, oder der spezielle Wert proxy_protocol bei Verwendung des PROXY-Protokolls

Weitere Einstellungen zur echten IP finden Sie im Features-Abschnitt der Dokumentation.

Wir gehen von Folgendem bezüglich der Load Balancer oder Reverse Proxys aus (Sie müssen die Einstellungen entsprechend Ihrer Konfiguration anpassen):

  • Sie verwenden den X-Forwarded-For-Header, um die echte IP festzulegen
  • Sie haben IPs in den Netzwerken 1.2.3.0/24 und 100.64.0.0/10

Navigieren Sie zur Seite Globale Konfiguration, wählen Sie das Plugin Real IP und füllen Sie die folgenden Einstellungen aus:

Real IP Einstellungen (Header) mit Web-UI
Real IP Einstellungen (Header) mit Web-UI

Bitte beachten Sie, dass es empfohlen wird, BunkerWeb neu zu starten, wenn Sie Einstellungen im Zusammenhang mit der echten IP ändern.

Sie müssen die Einstellungen zur Datei /etc/bunkerweb/variables.env hinzufügen:

...
USE_REAL_IP=yes
REAL_IP_FROM=1.2.3.0/24 100.64.0.0/16
REAL_IP_HEADER=X-Forwarded-For
...

Bitte beachten Sie, dass es empfohlen wird, einen Neustart anstelle eines Neuladens durchzuführen, wenn Sie Einstellungen im Zusammenhang mit der echten IP konfigurieren:

sudo systemctl restart bunkerweb && \
sudo systemctl restart bunkerweb-scheduler

Sie müssen die Einstellungen zu den Umgebungsvariablen hinzufügen, wenn Sie den All-in-one-Container ausführen:

docker run -d \
    --name bunkerweb-aio \
    -v bw-storage:/data \
    -e USE_REAL_IP="yes" \
    -e REAL_IP_FROM="1.2.3.0/24 100.64.0.0/10" \
    -e REAL_IP_HEADER="X-Forwarded-For" \
    -p 80:8080/tcp \
    -p 443:8443/tcp \
    -p 443:8443/udp \
    bunkerity/bunkerweb-all-in-one:1.6.5

Bitte beachten Sie, dass Sie, wenn Ihr Container bereits erstellt wurde, ihn löschen und neu erstellen müssen, damit die neuen Umgebungsvariablen aktualisiert werden.

Sie müssen die Einstellungen zu den Umgebungsvariablen sowohl des BunkerWeb- als auch des Scheduler-Containers hinzufügen:

bunkerweb:
  image: bunkerity/bunkerweb:1.6.5
  ...
  environment:
    USE_REAL_IP: "yes"
    REAL_IP_FROM: "1.2.3.0/24 100.64.0.0/10"
    REAL_IP_HEADER: "X-Forwarded-For"
  ...
bw-scheduler:
  image: bunkerity/bunkerweb-scheduler:1.6.5
  ...
  environment:
    USE_REAL_IP: "yes"
    REAL_IP_FROM: "1.2.3.0/24 100.64.0.0/10"
    REAL_IP_HEADER: "X-Forwarded-For"
  ...

Bitte beachten Sie, dass Sie, wenn Ihr Container bereits erstellt wurde, ihn löschen und neu erstellen müssen, damit die neuen Umgebungsvariablen aktualisiert werden.

Sie müssen die Einstellungen zu den Umgebungsvariablen sowohl des BunkerWeb- als auch des Scheduler-Containers hinzufügen:

bunkerweb:
  image: bunkerity/bunkerweb:1.6.5
  ...
  environment:
    USE_REAL_IP: "yes"
    REAL_IP_FROM: "1.2.3.0/24 100.64.0.0/10"
    REAL_IP_HEADER: "X-Forwarded-For"
  ...
bw-scheduler:
  image: bunkerity/bunkerweb-scheduler:1.6.5
  ...
  environment:
    USE_REAL_IP: "yes"
    REAL_IP_FROM: "1.2.3.0/24 100.64.0.0/10"
    REAL_IP_HEADER: "X-Forwarded-For"
  ...

Bitte beachten Sie, dass Sie, wenn Ihr Container bereits erstellt wurde, ihn löschen und neu erstellen müssen, damit die neuen Umgebungsvariablen aktualisiert werden.

Sie müssen die Einstellungen zu den Umgebungsvariablen sowohl der BunkerWeb- als auch der Scheduler-Pods hinzufügen.

Hier ist der entsprechende Teil Ihrer values.yaml-Datei, den Sie verwenden können:

bunkerweb:
  extraEnvs:
    - name: USE_REAL_IP
      value: "yes"
    - name: REAL_IP_FROM
      value: "1.2.3.0/24 100.64.0.0/10"
    - name: REAL_IP_HEADER
      value: "X-Forwarded-For"
scheduler:
  extraEnvs:
    - name: USE_REAL_IP
      value: "yes"
    - name: REAL_IP_FROM
      value: "1.2.3.0/24 100.64.0.0/10"
    - name: REAL_IP_HEADER
      value: "X-Forwarded-For"

Veraltet

Die Swarm-Integration ist veraltet und wird in einer zukünftigen Version entfernt. Bitte erwägen Sie stattdessen die Verwendung der Kubernetes-Integration.

Weitere Informationen finden Sie in der Swarm-Integrationsdokumentation.

Sie müssen die Einstellungen zu den Umgebungsvariablen sowohl der BunkerWeb- als auch der Scheduler-Dienste hinzufügen:

bunkerweb:
  image: bunkerity/bunkerweb:1.6.5
  ...
  environment:
    USE_REAL_IP: "yes"
    REAL_IP_FROM: "1.2.3.0/24 100.64.0.0/10"
    REAL_IP_HEADER: "X-Forwarded-For"
  ...
bw-scheduler:
  image: bunkerity/bunkerweb-scheduler:1.6.5
  ...
  environment:
    USE_REAL_IP: "yes"
    REAL_IP_FROM: "1.2.3.0/24 100.64.0.0/10"
    REAL_IP_HEADER: "X-Forwarded-For"
  ...

Bitte beachten Sie, dass Sie, wenn Ihr Dienst bereits erstellt wurde, ihn löschen und neu erstellen müssen, damit die neuen Umgebungsvariablen aktualisiert werden.

Sorgfältig lesen

Verwenden Sie das PROXY-Protokoll nur, wenn Sie sicher sind, dass Ihr Load Balancer oder Reverse Proxy es sendet. Wenn Sie es aktivieren und es nicht verwendet wird, erhalten Sie Fehler.

Wir gehen von Folgendem bezüglich der Load Balancer oder Reverse Proxys aus (Sie müssen die Einstellungen entsprechend Ihrer Konfiguration anpassen):

  • Sie verwenden das PROXY-Protokoll v1 oder v2, um die echte IP festzulegen
  • Sie haben IPs in den Netzwerken 1.2.3.0/24 und 100.64.0.0/10

Navigieren Sie zur Seite Globale Konfiguration, wählen Sie das Plugin Real IP und füllen Sie die folgenden Einstellungen aus:

Real IP Einstellungen (PROXY-Protokoll) mit Web-UI
Real IP Einstellungen (PROXY-Protokoll) mit Web-UI

Bitte beachten Sie, dass es empfohlen wird, BunkerWeb neu zu starten, wenn Sie Einstellungen im Zusammenhang mit der echten IP ändern.

Sie müssen die Einstellungen zur Datei /etc/bunkerweb/variables.env hinzufügen:

...
USE_REAL_IP=yes
USE_PROXY_PROTOCOL=yes
REAL_IP_FROM=1.2.3.0/24 100.64.0.0/16
REAL_IP_HEADER=proxy_protocol
...

Bitte beachten Sie, dass es empfohlen wird, einen Neustart anstelle eines Neuladens durchzuführen, wenn Sie Einstellungen im Zusammenhang mit Proxy-Protokollen konfigurieren:

sudo systemctl restart bunkerweb && \
sudo systemctl restart bunkerweb-scheduler

Sie müssen die Einstellungen zu den Umgebungsvariablen hinzufügen, wenn Sie den All-in-one-Container ausführen:

docker run -d \
    --name bunkerweb-aio \
    -v bw-storage:/data \
    -e USE_REAL_IP="yes" \
    -e USE_PROXY_PROTOCOL="yes" \
    -e REAL_IP_FROM="1.2.3.0/24 100.64.0.0/10" \
    -e REAL_IP_HEADER="proxy_protocol" \
    -p 80:8080/tcp \
    -p 443:8443/tcp \
    -p 443:8443/udp \
    bunkerity/bunkerweb-all-in-one:1.6.5

Bitte beachten Sie, dass Sie, wenn Ihr Container bereits erstellt wurde, ihn löschen und neu erstellen müssen, damit die neuen Umgebungsvariablen aktualisiert werden.

Sie müssen die Einstellungen zu den Umgebungsvariablen sowohl des BunkerWeb- als auch des Scheduler-Containers hinzufügen:

bunkerweb:
  image: bunkerity/bunkerweb:1.6.5
  ...
  environment:
    USE_REAL_IP: "yes"
    USE_PROXY_PROTOCOL: "yes"
    REAL_IP_FROM: "1.2.3.0/24 100.64.0.0/10"
    REAL_IP_HEADER: "proxy_protocol"
  ...
...
bw-scheduler:
  image: bunkerity/bunkerweb-scheduler:1.6.5
  ...
  environment:
    USE_REAL_IP: "yes"
    USE_PROXY_PROTOCOL: "yes"
    REAL_IP_FROM: "1.2.3.0/24 100.64.0.0/10"
    REAL_IP_HEADER: "proxy_protocol"
  ...

Bitte beachten Sie, dass Sie, wenn Ihr Container bereits erstellt wurde, ihn löschen und neu erstellen müssen, damit die neuen Umgebungsvariablen aktualisiert werden.

Sie müssen die Einstellungen zu den Umgebungsvariablen sowohl des BunkerWeb- als auch des Scheduler-Containers hinzufügen:

bunkerweb:
  image: bunkerity/bunkerweb:1.6.5
  ...
  environment:
    USE_REAL_IP: "yes"
    USE_PROXY_PROTOCOL: "yes"
    REAL_IP_FROM: "1.2.3.0/24 100.64.0.0/10"
    REAL_IP_HEADER: "proxy_protocol"
  ...
...
bw-scheduler:
  image: bunkerity/bunkerweb-scheduler:1.6.5
  ...
  environment:
    USE_REAL_IP: "yes"
    USE_PROXY_PROTOCOL: "yes"
    REAL_IP_FROM: "1.2.3.0/24 100.64.0.0/10"
    REAL_IP_HEADER: "proxy_protocol"
  ...

Bitte beachten Sie, dass Sie, wenn Ihr Container bereits erstellt wurde, ihn löschen und neu erstellen müssen, damit die neuen Umgebungsvariablen aktualisiert werden.

Sie müssen die Einstellungen zu den Umgebungsvariablen sowohl der BunkerWeb- als auch der Scheduler-Pods hinzufügen.

Hier ist der entsprechende Teil Ihrer values.yaml-Datei, den Sie verwenden können:

bunkerweb:
  extraEnvs:
    - name: USE_REAL_IP
      value: "yes"
    - name: USE_PROXY_PROTOCOL
      value: "yes"
    - name: REAL_IP_FROM
      value: "1.2.3.0/24 100.64.0.0/10"
    - name: REAL_IP_HEADER
      value: "proxy_protocol"
scheduler:
  extraEnvs:
    - name: USE_REAL_IP
      value: "yes"
    - name: USE_PROXY_PROTOCOL
      value: "yes"
    - name: REAL_IP_FROM
      value: "1.2.3.0/24 100.64.0.0/10"
    - name: REAL_IP_HEADER
      value: "proxy_protocol"

Veraltet

Die Swarm-Integration ist veraltet und wird in einer zukünftigen Version entfernt. Bitte erwägen Sie stattdessen die Verwendung der Kubernetes-Integration.

Weitere Informationen finden Sie in der Swarm-Integrationsdokumentation.

Sie müssen die Einstellungen zu den Umgebungsvariablen sowohl der BunkerWeb- als auch der Scheduler-Dienste hinzufügen.

bunkerweb:
  image: bunkerity/bunkerweb:1.6.5
  ...
  environment:
    USE_REAL_IP: "yes"
    USE_PROXY_PROTOCOL: "yes"
    REAL_IP_FROM: "1.2.3.0/24 100.64.0.0/10"
    REAL_IP_HEADER: "proxy_protocol"
  ...
...
bw-scheduler:
  image: bunkerity/bunkerweb-scheduler:1.6.5
  ...
  environment:
    USE_REAL_IP: "yes"
    USE_PROXY_PROTOCOL: "yes"
    REAL_IP_FROM: "1.2.3.0/24 100.64.0.0/10"
    REAL_IP_HEADER: "proxy_protocol"
  ...

Bitte beachten Sie, dass Sie, wenn Ihr Dienst bereits erstellt wurde, ihn löschen und neu erstellen müssen, damit die neuen Umgebungsvariablen aktualisiert werden.

Verwendung benutzerdefinierter DNS-Auflösungsmechanismen

BunkerWebs NGINX-Konfiguration kann angepasst werden, um je nach Ihren Bedürfnissen unterschiedliche DNS-Resolver zu verwenden. Dies kann in verschiedenen Szenarien besonders nützlich sein:

  1. Um Einträge in Ihrer lokalen /etc/hosts-Datei zu berücksichtigen
  2. Wenn Sie für bestimmte Domains benutzerdefinierte DNS-Server verwenden müssen
  3. Zur Integration mit lokalen DNS-Caching-Lösungen

Verwendung von systemd-resolved

Viele moderne Linux-Systeme verwenden systemd-resolved für die DNS-Auflösung. Wenn Sie möchten, dass BunkerWeb den Inhalt Ihrer /etc/hosts-Datei respektiert und den DNS-Auflösungsmechanismus des Systems verwendet, können Sie es so konfigurieren, dass es den lokalen systemd-resolved DNS-Dienst verwendet.

Um zu überprüfen, ob systemd-resolved auf Ihrem System läuft, können Sie Folgendes verwenden:

systemctl status systemd-resolved

Um systemd-resolved als Ihren DNS-Resolver in BunkerWeb zu aktivieren, setzen Sie die Einstellung DNS_RESOLVERS auf 127.0.0.53, was die Standard-Listenadresse für systemd-resolved ist:

Navigieren Sie zur Seite Globale Konfiguration und setzen Sie die DNS-Resolver auf 127.0.0.53

DNS-Resolver-Einstellung mit Web-UI
DNS-Resolver-Einstellung mit Web-UI

Sie müssen die Datei /etc/bunkerweb/variables.env ändern:

...
DNS_RESOLVERS=127.0.0.53
...

Nach dieser Änderung laden Sie den Scheduler neu, um die Konfiguration anzuwenden:

sudo systemctl reload bunkerweb-scheduler

Verwendung von dnsmasq

dnsmasq ist ein leichtgewichtiger DNS-, DHCP- und TFTP-Server, der häufig für lokales DNS-Caching und Anpassungen verwendet wird. Er ist besonders nützlich, wenn Sie mehr Kontrolle über Ihre DNS-Auflösung benötigen, als systemd-resolved bietet.

Installieren und konfigurieren Sie zuerst dnsmasq auf Ihrem Linux-System:

# dnsmasq installieren
sudo apt-get update && sudo apt-get install dnsmasq

# dnsmasq so konfigurieren, dass es nur auf localhost lauscht
echo "listen-address=127.0.0.1" | sudo tee -a /etc/dnsmasq.conf
echo "bind-interfaces" | sudo tee -a /etc/dnsmasq.conf

# Bei Bedarf benutzerdefinierte DNS-Einträge hinzufügen
echo "address=/custom.example.com/192.168.1.10" | sudo tee -a /etc/dnsmasq.conf

# dnsmasq neu starten
sudo systemctl restart dnsmasq
sudo systemctl enable dnsmasq
# dnsmasq installieren
sudo dnf install dnsmasq

# dnsmasq so konfigurieren, dass es nur auf localhost lauscht
echo "listen-address=127.0.0.1" | sudo tee -a /etc/dnsmasq.conf
echo "bind-interfaces" | sudo tee -a /etc/dnsmasq.conf

# Bei Bedarf benutzerdefinierte DNS-Einträge hinzufügen
echo "address=/custom.example.com/192.168.1.10" | sudo tee -a /etc/dnsmasq.conf

# dnsmasq neu starten
sudo systemctl restart dnsmasq
sudo systemctl enable dnsmasq

Konfigurieren Sie dann BunkerWeb, um dnsmasq zu verwenden, indem Sie DNS_RESOLVERS auf 127.0.0.1 setzen:

Navigieren Sie zur Seite Globale Konfiguration, wählen Sie das NGINX-Plugin und setzen Sie die DNS-Resolver auf 127.0.0.1.

DNS-Resolver-Einstellung mit Web-UI
DNS-Resolver-Einstellung mit Web-UI

Sie müssen die Datei /etc/bunkerweb/variables.env ändern:

...
DNS_RESOLVERS=127.0.0.1
...

Nach dieser Änderung laden Sie den Scheduler neu:

sudo systemctl reload bunkerweb-scheduler

Wenn Sie den All-in-one-Container verwenden, führen Sie dnsmasq in einem separaten Container aus und konfigurieren Sie BunkerWeb, um ihn zu verwenden:

# Ein benutzerdefiniertes Netzwerk für die DNS-Kommunikation erstellen
docker network create bw-dns

# dnsmasq-Container mit dockurr/dnsmasq und Quad9 DNS ausführen
# Quad9 bietet sicherheitsorientierte DNS-Auflösung mit Malware-Blockierung
docker run -d \
    --name dnsmasq \
    --network bw-dns \
    -e DNS1="9.9.9.9" \
    -e DNS2="149.112.112.112" \
    -p 53:53/udp \
    -p 53:53/tcp \
    --cap-add=NET_ADMIN \
    --restart=always \
    dockurr/dnsmasq

# BunkerWeb All-in-one mit dnsmasq DNS-Resolver ausführen
docker run -d \
    --name bunkerweb-aio \
    --network bw-dns \
    -v bw-storage:/data \
    -e DNS_RESOLVERS="dnsmasq" \
    -p 80:8080/tcp \
    -p 443:8443/tcp \
    -p 443:8443/udp \
    bunkerity/bunkerweb-all-in-one:1.6.5

Fügen Sie einen dnsmasq-Dienst zu Ihrer docker-compose-Datei hinzu und konfigurieren Sie BunkerWeb, um ihn zu verwenden:

services:
  dnsmasq:
    image: dockurr/dnsmasq
    container_name: dnsmasq
    environment:
      # Verwendung von Quad9 DNS-Servern für verbesserte Sicherheit und Datenschutz
      # Primär: 9.9.9.9 (Quad9 mit Malware-Blockierung)
      # Sekundär: 149.112.112.112 (Quad9 Backup-Server)
      DNS1: "9.9.9.9"
      DNS2: "149.112.112.112"
    ports:
      - 53:53/udp
      - 53:53/tcp
    cap_add:
      - NET_ADMIN
    restart: always
    networks:
      - bw-dns

  bunkerweb:
    image: bunkerity/bunkerweb:1.6.5
    ...
    environment:
      DNS_RESOLVERS: "dnsmasq"
    ...
    networks:
      - bw-universe
      - bw-services
      - bw-dns

  bw-scheduler:
    image: bunkerity/bunkerweb-scheduler:1.6.5
    ...
    environment:
      DNS_RESOLVERS: "dnsmasq"
    ...
    networks:
      - bw-universe
      - bw-dns

networks:
  # ...vorhandene Netzwerke...
  bw-dns:
    name: bw-dns

Benutzerdefinierte Konfigurationen

Um benutzerdefinierte Konfigurationen zu BunkerWeb hinzuzufügen und anzupassen, können Sie die NGINX-Grundlage nutzen. Benutzerdefinierte NGINX-Konfigurationen können in verschiedenen NGINX-Kontexten hinzugefügt werden, einschließlich Konfigurationen für die ModSecurity Web Application Firewall (WAF), die eine Kernkomponente von BunkerWeb ist. Weitere Details zu ModSecurity-Konfigurationen finden Sie hier.

Hier sind die verfügbaren Typen von benutzerdefinierten Konfigurationen:

  • http: Konfigurationen auf der HTTP-Ebene von NGINX.
  • server-http: Konfigurationen auf der HTTP/Server-Ebene von NGINX.
  • default-server-http: Konfigurationen auf der Server-Ebene von NGINX, speziell für den "default server", wenn der angegebene Client-Name mit keinem Servernamen in SERVER_NAME übereinstimmt.
  • modsec-crs: Konfigurationen, die angewendet werden, bevor das OWASP Core Rule Set geladen wird.
  • modsec: Konfigurationen, die angewendet werden, nachdem das OWASP Core Rule Set geladen wurde, oder die verwendet werden, wenn das Core Rule Set nicht geladen ist.
  • crs-plugins-before: Konfigurationen für die CRS-Plugins, die angewendet werden, bevor die CRS-Plugins geladen werden.
  • crs-plugins-after: Konfigurationen für die CRS-Plugins, die angewendet werden, nachdem die CRS-Plugins geladen wurden.
  • stream: Konfigurationen auf der Stream-Ebene von NGINX.
  • server-stream: Konfigurationen auf der Stream/Server-Ebene von NGINX.

Benutzerdefinierte Konfigurationen können global oder spezifisch für einen bestimmten Server angewendet werden, abhängig vom anwendbaren Kontext und ob der Multisite-Modus aktiviert ist.

Die Methode zum Anwenden benutzerdefinierter Konfigurationen hängt von der verwendeten Integration ab. Der zugrunde liegende Prozess besteht jedoch darin, Dateien mit der .conf-Endung zu bestimmten Ordnern hinzuzufügen. Um eine benutzerdefinierte Konfiguration für einen bestimmten Server anzuwenden, sollte die Datei in einem Unterordner platziert werden, der nach dem primären Servernamen benannt ist.

Einige Integrationen bieten bequemere Möglichkeiten zum Anwenden von Konfigurationen, wie z. B. die Verwendung von Configs in Docker Swarm oder ConfigMap in Kubernetes. Diese Optionen bieten einfachere Ansätze zur Verwaltung und Anwendung von Konfigurationen.

Navigieren Sie zur Seite Konfigurationen, klicken Sie auf Neue benutzerdefinierte Konfiguration erstellen, Sie können dann wählen, ob es sich um eine globale oder eine für einen Dienst spezifische Konfiguration handelt, den Konfigurationstyp und den Konfigurationsnamen:

Benutzerdefinierte Konfigurationen mit Web-UI
Benutzerdefinierte Konfigurationen mit Web-UI

Vergessen Sie nicht, auf die Schaltfläche 💾 Speichern zu klicken.

Bei Verwendung der Linux-Integration müssen benutzerdefinierte Konfigurationen in den Ordner /etc/bunkerweb/configs geschrieben werden.

Hier ist ein Beispiel für server-http/hello-world.conf:

location /hello {
  default_type 'text/plain';
  content_by_lua_block {
    ngx.say('world')
  }
}

Da BunkerWeb als unprivilegierter Benutzer (nginx:nginx) läuft, müssen Sie die Berechtigungen bearbeiten:

chown -R root:nginx /etc/bunkerweb/configs && \
chmod -R 770 /etc/bunkerweb/configs

Überprüfen wir nun den Status des Schedulers:

systemctl status bunkerweb-scheduler

Wenn er bereits läuft, können wir ihn neu laden:

systemctl reload bunkerweb-scheduler

Andernfalls müssen wir ihn starten:

systemctl start bunkerweb-scheduler

Bei Verwendung des All-in-one-Images haben Sie zwei Möglichkeiten, benutzerdefinierte Konfigurationen hinzuzufügen:

  • Verwendung spezifischer Einstellungen *_CUSTOM_CONF_* als Umgebungsvariablen beim Ausführen des Containers (empfohlen).
  • Schreiben von .conf-Dateien in das Verzeichnis /data/configs/ innerhalb des an /data gemounteten Volumes.

Verwendung von Einstellungen (Umgebungsvariablen)

Die zu verwendenden Einstellungen müssen dem Muster <SITE>_CUSTOM_CONF_<TYPE>_<NAME> folgen:

  • <SITE>: Optionaler primärer Servername, wenn der Multisite-Modus aktiviert ist und die Konfiguration auf einen bestimmten Dienst angewendet werden soll.
  • <TYPE>: Der Typ der Konfiguration, akzeptierte Werte sind HTTP, DEFAULT_SERVER_HTTP, SERVER_HTTP, MODSEC, MODSEC_CRS, CRS_PLUGINS_BEFORE, CRS_PLUGINS_AFTER, STREAM und SERVER_STREAM.
  • <NAME>: Der Name der Konfiguration ohne die .conf-Endung.

Hier ist ein Dummy-Beispiel beim Ausführen des All-in-one-Containers:

docker run -d \
    --name bunkerweb-aio \
    -v bw-storage:/data \
    -e "CUSTOM_CONF_SERVER_HTTP_hello-world=location /hello { \
        default_type 'text/plain'; \
        content_by_lua_block { \
          ngx.say('world'); \
        } \
      }" \
    -p 80:8080/tcp \
    -p 443:8443/tcp \
    bunkerity/bunkerweb-all-in-one:1.6.5

Bitte beachten Sie, dass Sie, wenn Ihr Container bereits erstellt wurde, ihn löschen und neu erstellen müssen, damit die neuen Umgebungsvariablen angewendet werden.

Verwendung von Dateien

Als Erstes müssen Sie die Ordner erstellen:

mkdir -p ./bw-data/configs/server-http

Sie können nun Ihre Konfigurationen schreiben:

echo "location /hello {
  default_type 'text/plain';
  content_by_lua_block {
    ngx.say('world')
  }
}" > ./bw-data/configs/server-http/hello-world.conf

Da der Scheduler als unprivilegierter Benutzer mit UID und GID 101 läuft, müssen Sie die Berechtigungen bearbeiten:

chown -R root:101 bw-data && \
chmod -R 770 bw-data

Beim Starten des Scheduler-Containers müssen Sie den Ordner an /data mounten:

docker run -d \
    --name bunkerweb-aio \
    -v ./bw-data:/data \
    -p 80:8080/tcp \
    -p 443:8443/tcp \
    -p 443:8443/udp \
    bunkerity/bunkerweb-all-in-one:1.6.5

Bei Verwendung der Docker-Integration haben Sie zwei Möglichkeiten, benutzerdefinierte Konfigurationen hinzuzufügen:

  • Verwendung spezifischer Einstellungen *_CUSTOM_CONF_* als Umgebungsvariablen (empfohlen)
  • Schreiben von .conf-Dateien in das an /data des Schedulers gemountete Volume

Verwendung von Einstellungen

Die zu verwendenden Einstellungen müssen dem Muster <SITE>_CUSTOM_CONF_<TYPE>_<NAME> folgen:

  • <SITE>: Optionaler primärer Servername, wenn der Multisite-Modus aktiviert ist und die Konfiguration auf einen bestimmten Dienst angewendet werden soll
  • <TYPE>: Der Typ der Konfiguration, akzeptierte Werte sind HTTP, DEFAULT_SERVER_HTTP, SERVER_HTTP, MODSEC, MODSEC_CRS, CRS_PLUGINS_BEFORE, CRS_PLUGINS_AFTER, STREAM und SERVER_STREAM
  • <NAME>: Der Name der Konfiguration ohne die .conf-Endung

Hier ist ein Dummy-Beispiel mit einer docker-compose-Datei:

...
bw-scheduler:
  image: bunkerity/bunkerweb-scheduler:1.6.5
  environment:
    - |
      CUSTOM_CONF_SERVER_HTTP_hello-world=
      location /hello {
        default_type 'text/plain';
        content_by_lua_block {
          ngx.say('world')
        }
      }
  ...

Verwendung von Dateien

Als Erstes müssen Sie die Ordner erstellen:

mkdir -p ./bw-data/configs/server-http

Sie können nun Ihre Konfigurationen schreiben:

echo "location /hello {
  default_type 'text/plain';
  content_by_lua_block {
    ngx.say('world')
  }
}" > ./bw-data/configs/server-http/hello-world.conf

Da der Scheduler als unprivilegierter Benutzer mit UID und GID 101 läuft, müssen Sie die Berechtigungen bearbeiten:

chown -R root:101 bw-data && \
chmod -R 770 bw-data

Beim Starten des Scheduler-Containers müssen Sie den Ordner an /data mounten:

bw-scheduler:
  image: bunkerity/bunkerweb-scheduler:1.6.5
  volumes:
    - ./bw-data:/data
  ...

Bei Verwendung der Docker-Autoconf-Integration haben Sie zwei Möglichkeiten, benutzerdefinierte Konfigurationen hinzuzufügen:

  • Verwendung spezifischer Einstellungen *_CUSTOM_CONF_* als Labels (am einfachsten)
  • Schreiben von .conf-Dateien in das an /data des Schedulers gemountete Volume

Verwendung von Labels

Einschränkungen bei der Verwendung von Labels

Bei der Verwendung von Labels mit der Docker-Autoconf-Integration können Sie nur benutzerdefinierte Konfigurationen für den entsprechenden Webdienst anwenden. Das Anwenden von http-, default-server-http-, stream- oder globalen Konfigurationen (wie server-http oder server-stream für alle Dienste) ist nicht möglich: Dafür müssen Sie Dateien mounten.

Die zu verwendenden Labels müssen dem Muster bunkerweb.CUSTOM_CONF_<TYPE>_<NAME> folgen:

  • <TYPE>: Der Typ der Konfiguration, akzeptierte Werte sind SERVER_HTTP, MODSEC, MODSEC_CRS, CRS_PLUGINS_BEFORE, CRS_PLUGINS_AFTER und SERVER_STREAM
  • <NAME>: Der Name der Konfiguration ohne die .conf-Endung

Hier ist ein Dummy-Beispiel mit einer docker-compose-Datei:

myapp:
  image: nginxdemos/nginx-hello
  labels:
    - |
      bunkerweb.CUSTOM_CONF_SERVER_HTTP_hello-world=
      location /hello {
        default_type 'text/plain';
        content_by_lua_block {
            ngx.say('world')
        }
      }
  ...

Verwendung von Dateien

Als Erstes müssen Sie die Ordner erstellen:

mkdir -p ./bw-data/configs/server-http

Sie können nun Ihre Konfigurationen schreiben:

echo "location /hello {
  default_type 'text/plain';
  content_by_lua_block {
    ngx.say('world')
  }
}" > ./bw-data/configs/server-http/hello-world.conf

Da der Scheduler als unprivilegierter Benutzer mit UID und GID 101 läuft, müssen Sie die Berechtigungen bearbeiten:

chown -R root:101 bw-data && \
chmod -R 770 bw-data

Beim Starten des Scheduler-Containers müssen Sie den Ordner an /data mounten:

bw-scheduler:
  image: bunkerity/bunkerweb-scheduler:1.6.5
  volumes:
    - ./bw-data:/data
  ...

Bei Verwendung der Kubernetes-Integration werden benutzerdefinierte Konfigurationen über ConfigMap verwaltet.

Um es einfach zu halten, müssen Sie die ConfigMap nicht einmal mit einem Pod verwenden (z. B. als Umgebungsvariable oder Volume): Der Autoconf-Pod lauscht auf ConfigMap-Ereignisse und aktualisiert die benutzerdefinierten Konfigurationen bei Bedarf.

Beim Erstellen einer ConfigMap müssen Sie spezielle Labels hinzufügen:

  • bunkerweb.io/CONFIG_TYPE: Muss auf einen gültigen Typ für benutzerdefinierte Konfigurationen gesetzt werden (http, server-http, default-server-http, modsec, modsec-crs, crs-plugins-before, crs-plugins-after, stream oder server-stream)
  • bunkerweb.io/CONFIG_SITE: Auf einen Servernamen setzen, um die Konfiguration auf diesen spezifischen Server anzuwenden (optional, wird global angewendet, wenn nicht gesetzt)

Hier ist das Beispiel:

apiVersion: v1
kind: ConfigMap
metadata:
  name: cfg-bunkerweb-all-server-http
  annotations:
    bunkerweb.io/CONFIG_TYPE: "server-http"
data:
  myconf: |
  location /hello {
    default_type 'text/plain';
    content_by_lua_block {
      ngx.say('world')
    }
  }

Benutzerdefinierte zusätzliche Konfiguration

Seit Version 1.6.0 können Sie Einstellungen über die Annotation bunkerweb.io/CONFIG_TYPE=settings hinzufügen/überschreiben. Hier ist ein Beispiel:

apiVersion: v1
kind: ConfigMap
metadata:
  name: cfg-bunkerweb-extra-settings
  annotations:
    bunkerweb.io/CONFIG_TYPE: "settings"
data:
  USE_ANTIBOT: "captcha" # Multisite-Einstellung, die auf alle Dienste angewendet wird, die sie nicht überschreiben
  USE_REDIS: "yes" # Globale Einstellung, die global angewendet wird
  ...

Veraltet

Die Swarm-Integration ist veraltet und wird in einer zukünftigen Version entfernt. Bitte erwägen Sie stattdessen die Verwendung der Kubernetes-Integration.

Weitere Informationen finden Sie in der Swarm-Integrationsdokumentation.

Bei Verwendung der Swarm-Integration werden benutzerdefinierte Konfigurationen über Docker Configs verwaltet.

Um es einfach zu halten, müssen Sie die Config nicht einmal an einen Dienst anhängen: Der Autoconf-Dienst lauscht auf Config-Ereignisse und aktualisiert die benutzerdefinierten Konfigurationen bei Bedarf.

Beim Erstellen einer Config müssen Sie spezielle Labels hinzufügen:

  • bunkerweb.CONFIG_TYPE: Muss auf einen gültigen Typ für benutzerdefinierte Konfigurationen gesetzt werden (http, server-http, default-server-http, modsec, modsec-crs, crs-plugins-before, crs-plugins-after, stream oder server-stream)
  • bunkerweb.CONFIG_SITE: Auf einen Servernamen setzen, um die Konfiguration auf diesen spezifischen Server anzuwenden (optional, wird global angewendet, wenn nicht gesetzt)

Hier ist das Beispiel:

echo "location /hello {
  default_type 'text/plain';
  content_by_lua_block {
    ngx.say('world')
  }
}" | docker config create -l bunkerweb.CONFIG_TYPE=server-http my-config -

Es gibt keinen Aktualisierungsmechanismus: Die Alternative besteht darin, eine vorhandene Konfiguration mit docker config rm zu entfernen und sie dann neu zu erstellen.

Viele Dienste in der Produktion betreiben

Globales CRS

CRS-Plugins

Wenn das CRS global geladen wird, werden CRS-Plugins nicht unterstützt. Wenn Sie sie verwenden müssen, müssen Sie das CRS pro Dienst laden.

Wenn Sie BunkerWeb in der Produktion mit einer großen Anzahl von Diensten verwenden und die ModSecurity-Funktion global mit CRS-Regeln aktivieren, kann die zum Laden der BunkerWeb-Konfigurationen erforderliche Zeit zu lang werden, was möglicherweise zu einem Timeout führt.

Die Problemumgehung besteht darin, die CRS-Regeln global anstatt pro Dienst zu laden. Dieses Verhalten ist aus Gründen der Abwärtskompatibilität standardmäßig nicht aktiviert und weil es einen Nachteil hat: Wenn Sie das globale Laden von CRS-Regeln aktivieren, ist es nicht mehr möglich, modsec-crs-Regeln (die vor den CRS-Regeln ausgeführt werden) pro Dienst zu definieren. Diese Einschränkung kann jedoch umgangen werden, indem globale modsec-crs-Ausschlussregeln wie diese geschrieben werden:

SecRule REQUEST_FILENAME "@rx ^/somewhere$" "nolog,phase:4,allow,id:1010,chain"
SecRule REQUEST_HEADERS:Host "@rx ^app1\.example\.com$" "nolog"

Sie können das globale Laden von CRS-Regeln aktivieren, indem Sie USE_MODSECURITY_GLOBAL_CRS auf yes setzen.

max_allowed_packet für MariaDB/MySQL anpassen

Es scheint, dass der Standardwert für den Parameter max_allowed_packet in MariaDB- und MySQL-Datenbankservern nicht ausreicht, wenn BunkerWeb mit einer großen Anzahl von Diensten verwendet wird.

Wenn Sie Fehler wie diesen feststellen, insbesondere auf dem Scheduler:

[Warning] Aborted connection 5 to db: 'db' user: 'bunkerweb' host: '172.20.0.4' (Got a packet bigger than 'max_allowed_packet' bytes)

Sie müssen den max_allowed_packet auf Ihrem Datenbankserver erhöhen.

Persistenz von Sperren und Berichten

Standardmäßig speichert BunkerWeb Sperren und Berichte in einem lokalen Lua-Datenspeicher. Obwohl dies einfach und effizient ist, bedeutet diese Einrichtung, dass Daten verloren gehen, wenn die Instanz neu gestartet wird. Um sicherzustellen, dass Sperren und Berichte über Neustarts hinweg bestehen bleiben, können Sie BunkerWeb so konfigurieren, dass ein entfernter Redis- oder Valkey-Server verwendet wird.

Warum Redis/Valkey verwenden?

Redis und Valkey sind leistungsstarke In-Memory-Datenspeicher, die häufig als Datenbanken, Caches und Message Broker verwendet werden. Sie sind hoch skalierbar und unterstützen eine Vielzahl von Datenstrukturen, darunter:

  • Strings: Grundlegende Schlüssel-Wert-Paare.
  • Hashes: Feld-Wert-Paare innerhalb eines einzelnen Schlüssels.
  • Listen: Geordnete Sammlungen von Zeichenketten.
  • Mengen: Ungeordnete Sammlungen von eindeutigen Zeichenketten.
  • Sortierte Mengen: Geordnete Sammlungen mit Bewertungen.

Durch die Nutzung von Redis oder Valkey kann BunkerWeb Sperren, Berichte und Cache-Daten dauerhaft speichern und so Haltbarkeit und Skalierbarkeit gewährleisten.

Aktivieren der Redis/Valkey-Unterstützung

Um die Unterstützung für Redis oder Valkey zu aktivieren, konfigurieren Sie die folgenden Einstellungen in Ihrer BunkerWeb-Konfigurationsdatei:

# Redis/Valkey-Unterstützung aktivieren
USE_REDIS=yes

# Redis/Valkey-Server-Hostname oder IP-Adresse
REDIS_HOST=<hostname>

# Redis/Valkey-Server-Portnummer (Standard: 6379)
REDIS_PORT=6379

# Redis/Valkey-Datenbanknummer (Standard: 0)
REDIS_DATABASE=0
  • USE_REDIS: Auf yes setzen, um die Redis/Valkey-Integration zu aktivieren.
  • REDIS_HOST: Geben Sie den Hostnamen oder die IP-Adresse des Redis/Valkey-Servers an.
  • REDIS_PORT: Geben Sie die Portnummer für den Redis/Valkey-Server an. Standard ist 6379.
  • REDIS_DATABASE: Geben Sie die zu verwendende Redis/Valkey-Datenbanknummer an. Standard ist 0.

Wenn Sie erweiterte Einstellungen wie Authentifizierung, SSL/TLS-Unterstützung oder den Sentinel-Modus benötigen, finden Sie detaillierte Anleitungen in der Dokumentation zu den Redis-Plugin-Einstellungen.

UDP/TCP-Anwendungen schützen

Experimentelles Feature

Dieses Feature ist nicht produktionsreif. Fühlen Sie sich frei, es zu testen und uns Fehler über Issues im GitHub-Repository zu melden.

BunkerWeb bietet die Möglichkeit, als generischer UDP/TCP-Reverse-Proxy zu fungieren, sodass Sie alle netzwerkbasierten Anwendungen schützen können, die mindestens auf Schicht 4 des OSI-Modells arbeiten. Anstelle des "klassischen" HTTP-Moduls verwendet BunkerWeb das Stream-Modul von NGINX.

Es ist wichtig zu beachten, dass nicht alle Einstellungen und Sicherheitsfunktionen bei Verwendung des Stream-Moduls verfügbar sind. Weitere Informationen hierzu finden Sie in den Features-Abschnitten der Dokumentation.

Die Konfiguration eines einfachen Reverse-Proxys ist der HTTP-Einrichtung sehr ähnlich, da dieselben Einstellungen verwendet werden: USE_REVERSE_PROXY=yes und REVERSE_PROXY_HOST=myapp:9000. Selbst wenn BunkerWeb hinter einem Load Balancer positioniert ist, bleiben die Einstellungen gleich (wobei das PROXY-Protokoll aus offensichtlichen Gründen die unterstützte Option ist).

Darüber hinaus werden die folgenden spezifischen Einstellungen verwendet:

  • SERVER_TYPE=stream: aktiviert den stream-Modus (generisches UDP/TCP) anstelle des http-Modus (Standard)
  • LISTEN_STREAM_PORT=4242: der lauschende "einfache" (ohne SSL/TLS) Port, auf dem BunkerWeb lauschen wird
  • LISTEN_STREAM_PORT_SSL=4343: der lauschende "ssl/tls"-Port, auf dem BunkerWeb lauschen wird
  • USE_UDP=no: lauscht auf UDP-Pakete und leitet sie anstelle von TCP weiter

Eine vollständige Liste der Einstellungen für den stream-Modus finden Sie im Abschnitt Features der Dokumentation.

mehrere lauschende Ports

Seit Version 1.6.0 unterstützt BunkerWeb mehrere lauschende Ports für den stream-Modus. Sie können sie mit den Einstellungen LISTEN_STREAM_PORT und LISTEN_STREAM_PORT_SSL angeben.

Hier ist ein Beispiel:

...
LISTEN_STREAM_PORT=4242
LISTEN_STREAM_PORT_SSL=4343
LISTEN_STREAM_PORT_1=4244
LISTEN_STREAM_PORT_SSL_1=4344
...

Sie müssen die Einstellungen zu den Umgebungsvariablen hinzufügen, wenn Sie den All-in-one-Container ausführen. Sie müssen auch die Stream-Ports freigeben.

Dieses Beispiel konfiguriert BunkerWeb, um zwei Stream-basierte Anwendungen, app1.example.com und app2.example.com, zu proxieren.

docker run -d \
    --name bunkerweb-aio \
    -v bw-storage:/data \
    -e SERVICE_UI="no" \
    -e SERVER_NAME="app1.example.com app2.example.com" \
    -e MULTISITE="yes" \
    -e USE_REVERSE_PROXY="yes" \
    -e SERVER_TYPE="stream" \
    -e app1.example.com_REVERSE_PROXY_HOST="myapp1:9000" \
    -e app1.example.com_LISTEN_STREAM_PORT="10000" \
    -e app2.example.com_REVERSE_PROXY_HOST="myapp2:9000" \
    -e app2.example.com_LISTEN_STREAM_PORT="20000" \
    -p 80:8080/tcp \
    -p 443:8443/tcp \
    -p 443:8443/udp \
    -p 10000:10000/tcp \
    -p 20000:20000/tcp \
    bunkerity/bunkerweb-all-in-one:1.6.5

Bitte beachten Sie, dass Sie, wenn Ihr Container bereits erstellt wurde, ihn löschen und neu erstellen müssen, damit die neuen Umgebungsvariablen angewendet werden.

Ihre Anwendungen (myapp1, myapp2) sollten in separaten Containern laufen (oder anderweitig erreichbar sein) und ihre Hostnamen/IPs (z. B. myapp1, myapp2, die in _REVERSE_PROXY_HOST verwendet werden) müssen vom bunkerweb-aio-Container aus auflösbar und erreichbar sein. Dies geschieht typischerweise, indem sie mit einem gemeinsamen Docker-Netzwerk verbunden werden.

UI-Dienst deaktivieren

Es wird empfohlen, den UI-Dienst zu deaktivieren (z. B. durch Setzen von SERVICE_UI=no als Umgebungsvariable), da die Web-UI nicht mit SERVER_TYPE=stream kompatibel ist.

Bei Verwendung der Docker-Integration ist der einfachste Weg, bestehende Netzwerkanwendungen zu schützen, die Dienste zum bw-services-Netzwerk hinzuzufügen:

x-bw-api-env: &bw-api-env
  # Wir verwenden einen Anker, um die Wiederholung derselben Einstellungen für alle Dienste zu vermeiden
  API_WHITELIST_IP: "127.0.0.0/8 10.20.30.0/24"
  # Optionaler API-Token für authentifizierte API-Aufrufe
  API_TOKEN: ""

services:
  bunkerweb:
    image: bunkerity/bunkerweb:1.6.5
    ports:
      - "80:8080" # Behalten, wenn Sie die Let's Encrypt-Automatisierung mit dem http-Challenge-Typ verwenden möchten
      - "10000:10000" # app1
      - "20000:20000" # app2
    labels:
      - "bunkerweb.INSTANCE=yes"
    environment:
      <<: *bw-api-env
    restart: "unless-stopped"
    networks:
      - bw-universe
      - bw-services

  bw-scheduler:
    image: bunkerity/bunkerweb-scheduler:1.6.5
    environment:
      <<: *bw-api-env
      BUNKERWEB_INSTANCES: "bunkerweb" # Diese Einstellung ist obligatorisch, um die BunkerWeb-Instanz anzugeben
      SERVER_NAME: "app1.example.com app2.example.com"
      MULTISITE: "yes"
      USE_REVERSE_PROXY: "yes" # Wird auf alle Dienste angewendet
      SERVER_TYPE: "stream" # Wird auf alle Dienste angewendet
      app1.example.com_REVERSE_PROXY_HOST: "myapp1:9000"
      app1.example.com_LISTEN_STREAM_PORT: "10000"
      app2.example.com_REVERSE_PROXY_HOST: "myapp2:9000"
      app2.example.com_LISTEN_STREAM_PORT: "20000"
    volumes:
      - bw-storage:/data # Wird verwendet, um den Cache und andere Daten wie Backups zu persistieren
    restart: "unless-stopped"
    networks:
      - bw-universe

  myapp1:
    image: istio/tcp-echo-server:1.3
    command: [ "9000", "app1" ]
    networks:
      - bw-services

  myapp2:
    image: istio/tcp-echo-server:1.3
    command: [ "9000", "app2" ]
    networks:
      - bw-services

volumes:
  bw-storage:

networks:
  bw-universe:
    name: bw-universe
    ipam:
      driver: default
      config:
        - subnet: 10.20.30.0/24
  bw-services:
    name: bw-services

Bevor Sie den Docker-Autoconf-Integrations-Stack auf Ihrer Maschine ausführen, müssen Sie die Ports bearbeiten:

services:
  bunkerweb:
    image: bunkerity/bunkerweb:1.6.5
    ports:
      - "80:8080" # Behalten, wenn Sie die Let's Encrypt-Automatisierung mit dem http-Challenge-Typ verwenden möchten
      - "10000:10000" # app1
      - "20000:20000" # app2
...

Sobald der Stack läuft, können Sie Ihre bestehenden Anwendungen mit dem bw-services-Netzwerk verbinden und BunkerWeb mit Labels konfigurieren:

services:
  myapp1:
    image: istio/tcp-echo-server:1.3
    command: [ "9000", "app1" ]
    networks:
      - bw-services
    labels:
      - "bunkerweb.SERVER_NAME=app1.example.com"
      - "bunkerweb.SERVER_TYPE=stream"
      - "bunkerweb.USE_REVERSE_PROXY=yes"
      - "bunkerweb.REVERSE_PROXY_HOST=myapp1:9000"
      - "bunkerweb.LISTEN_STREAM_PORT=10000"

  myapp2:
    image: istio/tcp-echo-server:1.3
    command: [ "9000", "app2" ]
    networks:
      - bw-services
    labels:
      - "bunkerweb.SERVER_NAME=app2.example.com"
      - "bunkerweb.SERVER_TYPE=stream"
      - "bunkerweb.USE_REVERSE_PROXY=yes"
      - "bunkerweb.REVERSE_PROXY_HOST=myapp2:9000"
      - "bunkerweb.LISTEN_STREAM_PORT=20000"

networks:
  bw-services:
    external: true
    name: bw-services

Experimentelles Feature

Im Moment unterstützen Ingresses den stream-Modus nicht. Was wir hier tun, ist ein Workaround, um es zum Laufen zu bringen.

Fühlen Sie sich frei, es zu testen und uns Fehler über Issues im GitHub-Repository zu melden.

Bevor Sie den Kubernetes-Integrations-Stack auf Ihrer Maschine ausführen, müssen Sie die Ports an Ihrem Load Balancer öffnen:

apiVersion: v1
kind: Service
metadata:
  name: lb
spec:
  type: LoadBalancer
  ports:
    - name: http # Behalten, wenn Sie die Let's Encrypt-Automatisierung mit dem http-Challenge-Typ verwenden möchten
      port: 80
      targetPort: 8080
    - name: app1
      port: 10000
      targetPort: 10000
    - name: app2
      port: 20000
      targetPort: 20000
  selector:
    app: bunkerweb

Sobald der Stack läuft, können Sie Ihre Ingress-Ressourcen erstellen:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
  namespace: services
  annotations:
    bunkerweb.io/SERVER_TYPE: "stream" # Wird auf alle Dienste angewendet
    bunkerweb.io/app1.example.com_LISTEN_STREAM_PORT: "10000"
    bunkerweb.io/app2.example.com_LISTEN_STREAM_PORT: "20000"
spec:
  rules:
    - host: app1.example.com
      http:
        paths:
          - path: / # Wird im Stream-Modus nicht verwendet, ist aber erforderlich
            pathType: Prefix
            backend:
              service:
                name: svc-app1
                port:
                  number: 9000
    - host: app2.example.com
      http:
        paths:
          - path: / # Wird im Stream-Modus nicht verwendet, ist aber erforderlich
            pathType: Prefix
            backend:
              service:
                name: svc-app2
                port:
                  number: 9000
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app1
  namespace: services
  labels:
    app: app1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app1
  template:
    metadata:
      labels:
        app: app1
    spec:
      containers:
        - name: app1
          image: istio/tcp-echo-server:1.3
          args: ["9000", "app1"]
          ports:
            - containerPort: 9000
---
apiVersion: v1
kind: Service
metadata:
  name: svc-app1
  namespace: services
spec:
  selector:
    app: app1
  ports:
    - protocol: TCP
      port: 9000
      targetPort: 9000
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app2
  namespace: services
  labels:
    app: app2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app2
  template:
    metadata:
      labels:
        app: app2
    spec:
      containers:
        - name: app2
          image: istio/tcp-echo-server:1.3
          args: ["9000", "app2"]
          ports:
            - containerPort: 9000
---
apiVersion: v1
kind: Service
metadata:
  name: svc-app2
  namespace: services
spec:
  selector:
    app: app2
  ports:
    - protocol: TCP
      port: 9000
      targetPort: 9000

Sie müssen die Einstellungen zur Datei /etc/bunkerweb/variables.env hinzufügen:

...
SERVER_NAME=app1.example.com app2.example.com
MULTISITE=yes
USE_REVERSE_PROXY=yes
SERVER_TYPE=stream
app1.example.com_REVERSE_PROXY_HOST=myapp1.domain.or.ip:9000
app1.example.com_LISTEN_STREAM_PORT=10000
app2.example.com_REVERSE_PROXY_HOST=myapp2.domain.or.ip:9000
app2.example.com_LISTEN_STREAM_PORT=20000
...

Überprüfen wir nun den Status des Schedulers:

systemctl status bunkerweb-scheduler

Wenn er bereits läuft, können wir ihn neu laden:

systemctl reload bunkerweb-scheduler

Andernfalls müssen wir ihn starten:

systemctl start bunkerweb-scheduler

Veraltet

Die Swarm-Integration ist veraltet und wird in einer zukünftigen Version entfernt. Bitte erwägen Sie stattdessen die Verwendung der Kubernetes-Integration.

Weitere Informationen finden Sie in der Swarm-Integrationsdokumentation.

Bevor Sie den Swarm-Integrations-Stack auf Ihrer Maschine ausführen, müssen Sie die Ports bearbeiten:

services:
  bunkerweb:
    image: bunkerity/bunkerweb:1.6.5
    ports:
      # Behalten, wenn Sie die Let's Encrypt-Automatisierung mit dem http-Challenge-Typ verwenden möchten
      - published: 80
        target: 8080
        mode: host
        protocol: tcp
      # app1
      - published: 10000
        target: 10000
        mode: host
        protocol: tcp
      # app2
      - published: 20000
        target: 20000
        mode: host
        protocol: tcp
...

Sobald der Stack läuft, können Sie Ihre bestehenden Anwendungen mit dem bw-services-Netzwerk verbinden und BunkerWeb mit Labels konfigurieren:

services:

  myapp1:
    image: istio/tcp-echo-server:1.3
    command: [ "9000", "app1" ]
    networks:
      - bw-services
    deploy:
      placement:
        constraints:
          - "node.role==worker"
      labels:
        - "bunkerweb.SERVER_NAME=app1.example.com"
        - "bunkerweb.SERVER_TYPE=stream"
        - "bunkerweb.USE_REVERSE_PROXY=yes"
        - "bunkerweb.REVERSE_PROXY_HOST=myapp1:9000"
        - "bunkerweb.LISTEN_STREAM_PORT=10000"

  myapp2:
    image: istio/tcp-echo-server:1.3
    command: [ "9000", "app2" ]
    networks:
      - bw-services
    deploy:
      placement:
        constraints:
          - "node.role==worker"
      labels:
        - "bunkerweb.SERVER_NAME=app2.example.com"
        - "bunkerweb.SERVER_TYPE=stream"
        - "bunkerweb.USE_REVERSE_PROXY=yes"
        - "bunkerweb.REVERSE_PROXY_HOST=myapp2:9000"
        - "bunkerweb.LISTEN_STREAM_PORT=20000"

networks:
  bw-services:
    external: true
    name: bw-services

PHP

Experimentelles Feature

Im Moment ist die PHP-Unterstützung mit BunkerWeb noch in der Beta-Phase und wir empfehlen Ihnen, wenn möglich eine Reverse-Proxy-Architektur zu verwenden. Übrigens wird PHP für einige Integrationen wie Kubernetes überhaupt nicht unterstützt.

BunkerWeb unterstützt PHP über externe oder entfernte PHP-FPM-Instanzen. Wir gehen davon aus, dass Sie bereits mit der Verwaltung solcher Dienste vertraut sind.

Die folgenden Einstellungen können verwendet werden:

  • REMOTE_PHP : Hostname der entfernten PHP-FPM-Instanz.
  • REMOTE_PHP_PATH : Stammordner mit Dateien in der entfernten PHP-FPM-Instanz.
  • REMOTE_PHP_PORT : Port der entfernten PHP-FPM-Instanz (Standard ist 9000).
  • LOCAL_PHP : Pfad zur lokalen Socket-Datei der PHP-FPM-Instanz.
  • LOCAL_PHP_PATH : Stammordner mit Dateien in der lokalen PHP-FPM-Instanz.

Bei Verwendung des All-in-one-Images müssen Sie zur Unterstützung von PHP-Anwendungen Folgendes tun:

  • Mounten Sie Ihre PHP-Dateien in den Ordner /var/www/html von BunkerWeb.
  • Richten Sie einen PHP-FPM-Container für Ihre Anwendung ein und mounten Sie den Ordner mit den PHP-Dateien.
  • Verwenden Sie die spezifischen Einstellungen REMOTE_PHP und REMOTE_PHP_PATH als Umgebungsvariablen beim Ausführen von BunkerWeb.

Wenn Sie den Multisite-Modus aktivieren, müssen Sie separate Verzeichnisse für jede Ihrer Anwendungen erstellen. Jedes Unterverzeichnis sollte nach dem ersten Wert von SERVER_NAME benannt werden. Hier ist ein Dummy-Beispiel:

www
├── app1.example.com
│   └── index.php
└── app2.example.com
    └── index.php

2 Verzeichnisse, 2 Dateien

Wir gehen davon aus, dass sich Ihre PHP-Apps in einem Ordner namens www befinden. Bitte beachten Sie, dass Sie die Berechtigungen korrigieren müssen, damit BunkerWeb (UID/GID 101) zumindest Dateien lesen und Ordner auflisten kann und PHP-FPM (UID/GID 33, wenn Sie das php:fpm-Image verwenden) der Eigentümer der Dateien und Ordner ist:

chown -R 33:101 ./www && \
find ./www -type f -exec chmod 0640 {} \; && \
find ./www -type d -exec chmod 0750 {} \;

Sie können nun BunkerWeb ausführen, es für Ihre PHP-Anwendung konfigurieren und auch die PHP-Apps ausführen. Sie müssen ein benutzerdefiniertes Docker-Netzwerk erstellen, damit BunkerWeb mit Ihren PHP-FPM-Containern kommunizieren kann.

# Ein benutzerdefiniertes Netzwerk erstellen
docker network create php-network

# PHP-FPM-Container ausführen
docker run -d --name myapp1-php --network php-network -v ./www/app1.example.com:/app php:fpm
docker run -d --name myapp2-php --network php-network -v ./www/app2.example.com:/app php:fpm

# BunkerWeb All-in-one ausführen
docker run -d \
    --name bunkerweb-aio \
    --network php-network \
    -v ./www:/var/www/html \
    -v bw-storage:/data \
    -e SERVER_NAME="app1.example.com app2.example.com" \
    -e MULTISITE="yes" \
    -e REMOTE_PHP_PATH="/app" \
    -e app1.example.com_REMOTE_PHP="myapp1-php" \
    -e app2.example.com_REMOTE_PHP="myapp2-php" \
    -p 80:8080/tcp \
    -p 443:8443/tcp \
    -p 443:8443/udp \
    bunkerity/bunkerweb-all-in-one:1.6.5

Bitte beachten Sie, dass Sie, wenn Ihr Container bereits erstellt wurde, ihn löschen und neu erstellen müssen, damit die neuen Umgebungsvariablen angewendet werden.

Bei Verwendung der Docker-Integration müssen Sie zur Unterstützung von PHP-Anwendungen Folgendes tun:

  • Mounten Sie Ihre PHP-Dateien in den Ordner /var/www/html von BunkerWeb
  • Richten Sie einen PHP-FPM-Container für Ihre Anwendung ein und mounten Sie den Ordner mit den PHP-Dateien
  • Verwenden Sie die spezifischen Einstellungen REMOTE_PHP und REMOTE_PHP_PATH als Umgebungsvariablen beim Starten von BunkerWeb

Wenn Sie den Multisite-Modus aktivieren, müssen Sie separate Verzeichnisse für jede Ihrer Anwendungen erstellen. Jedes Unterverzeichnis sollte nach dem ersten Wert von SERVER_NAME benannt werden. Hier ist ein Dummy-Beispiel:

www
├── app1.example.com
│   └── index.php
├── app2.example.com
│   └── index.php
└── app3.example.com
    └── index.php

3 Verzeichnisse, 3 Dateien

Wir gehen davon aus, dass sich Ihre PHP-Apps in einem Ordner namens www befinden. Bitte beachten Sie, dass Sie die Berechtigungen korrigieren müssen, damit BunkerWeb (UID/GID 101) zumindest Dateien lesen und Ordner auflisten kann und PHP-FPM (UID/GID 33, wenn Sie das php:fpm-Image verwenden) der Eigentümer der Dateien und Ordner ist:

chown -R 33:101 ./www && \
find ./www -type f -exec chmod 0640 {} \; && \
find ./www -type d -exec chmod 0750 {} \;

Sie können nun BunkerWeb ausführen, es für Ihre PHP-Anwendung konfigurieren und auch die PHP-Apps ausführen:

x-bw-api-env: &bw-api-env
  # Wir verwenden einen Anker, um die Wiederholung derselben Einstellungen für alle Dienste zu vermeiden
  API_WHITELIST_IP: "127.0.0.0/8 10.20.30.0/24"

services:
  bunkerweb:
    image: bunkerity/bunkerweb:1.6.5
    ports:
      - "80:8080/tcp"
      - "443:8443/tcp"
      - "443:8443/udp" # QUIC
    environment:
      <<: *bw-api-env
    volumes:
      - ./www:/var/www/html
    restart: "unless-stopped"
    networks:
      - bw-universe
      - bw-services

  bw-scheduler:
    image: bunkerity/bunkerweb-scheduler:1.6.5
    environment:
      <<: *bw-api-env
      BUNKERWEB_INSTANCES: "bunkerweb" # Diese Einstellung ist obligatorisch, um die BunkerWeb-Instanz anzugeben
      SERVER_NAME: "app1.example.com app2.example.com"
      MULTISITE: "yes"
      REMOTE_PHP_PATH: "/app" # Wird dank der MULTISITE-Einstellung auf alle Dienste angewendet
      app1.example.com_REMOTE_PHP: "myapp1"
      app2.example.com_REMOTE_PHP: "myapp2"
      app3.example.com_REMOTE_PHP: "myapp3"
    volumes:
      - bw-storage:/data # Wird verwendet, um den Cache und andere Daten wie Backups zu persistieren
    restart: "unless-stopped"
    networks:
      - bw-universe

  myapp1:
    image: php:fpm
    volumes:
      - ./www/app1.example.com:/app
    networks:
      - bw-services

  myapp2:
    image: php:fpm
    volumes:
      - ./www/app2.example.com:/app
    networks:
      - bw-services

  myapp3:
    image: php:fpm
    volumes:
      - ./www/app3.example.com:/app
    networks:
      - bw-services

volumes:
  bw-storage:

networks:
  bw-universe:
    name: bw-universe
    ipam:
      driver: default
      config:
        - subnet: 10.20.30.0/24
  bw-services:
    name: bw-services

Multisite-Modus aktiviert

Die Docker-Autoconf-Integration impliziert die Verwendung des Multisite-Modus: Das Schützen einer PHP-Anwendung ist dasselbe wie das Schützen mehrerer.

Bei Verwendung der Docker-Autoconf-Integration müssen Sie zur Unterstützung von PHP-Anwendungen Folgendes tun:

  • Mounten Sie Ihre PHP-Dateien in den Ordner /var/www/html von BunkerWeb
  • Richten Sie PHP-FPM-Container für Ihre Anwendungen ein und mounten Sie den Ordner mit den PHP-Apps
  • Verwenden Sie die spezifischen Einstellungen REMOTE_PHP und REMOTE_PHP_PATH als Labels für Ihren PHP-FPM-Container

Da die Docker-Autoconf die Verwendung des Multisite-Modus impliziert, müssen Sie separate Verzeichnisse für jede Ihrer Anwendungen erstellen. Jedes Unterverzeichnis sollte nach dem ersten Wert von SERVER_NAME benannt werden. Hier ist ein Dummy-Beispiel:

www
├── app1.example.com
│   └── index.php
├── app2.example.com
│   └── index.php
└── app3.example.com
    └── index.php

3 Verzeichnisse, 3 Dateien

Sobald die Ordner erstellt sind, kopieren Sie Ihre Dateien und korrigieren Sie die Berechtigungen, damit BunkerWeb (UID/GID 101) zumindest Dateien lesen und Ordner auflisten kann und PHP-FPM (UID/GID 33, wenn Sie das php:fpm-Image verwenden) der Eigentümer der Dateien und Ordner ist:

chown -R 33:101 ./www && \
find ./www -type f -exec chmod 0640 {} \; && \
find ./www -type d -exec chmod 0750 {} \;

Wenn Sie den BunkerWeb-Autoconf-Stack starten, mounten Sie den Ordner www in /var/www/html für den Scheduler-Container:

x-bw-api-env: &bw-api-env
  # Wir verwenden einen Anker, um die Wiederholung derselben Einstellungen für alle Dienste zu vermeiden
  AUTOCONF_MODE: "yes"
  API_WHITELIST_IP: "127.0.0.0/8 10.20.30.0/24"

services:
  bunkerweb:
    image: bunkerity/bunkerweb:1.6.5
    labels:
      - "bunkerweb.INSTANCE=yes"
    environment:
      <<: *bw-api-env
    volumes:
      - ./www:/var/www/html
    restart: "unless-stopped"
    networks:
      - bw-universe
      - bw-services

  bw-scheduler:
    image: bunkerity/bunkerweb-scheduler:1.6.5
    environment:
      <<: *bw-api-env
      BUNKERWEB_INSTANCES: "" # Wir müssen die BunkerWeb-Instanz hier nicht angeben, da sie automatisch vom Autoconf-Dienst erkannt werden
      SERVER_NAME: "" # Der Servername wird über Dienst-Labels gefüllt
      MULTISITE: "yes" # Obligatorische Einstellung für Autoconf
      DATABASE_URI: "mariadb+pymysql://bunkerweb:changeme@bw-db:3306/db" # Denken Sie daran, ein stärkeres Passwort für die Datenbank festzulegen
    volumes:
      - bw-storage:/data # Wird verwendet, um den Cache und andere Daten wie Backups zu persistieren
    restart: "unless-stopped"
    networks:
      - bw-universe
      - bw-db

  bw-autoconf:
    image: bunkerity/bunkerweb-autoconf:1.6.5
    depends_on:
      - bunkerweb
      - bw-docker
    environment:
      AUTOCONF_MODE: "yes"
      DATABASE_URI: "mariadb+pymysql://bunkerweb:changeme@bw-db:3306/db" # Denken Sie daran, ein stärkeres Passwort für die Datenbank festzulegen
      DOCKER_HOST: "tcp://bw-docker:2375" # Der Docker-Socket
    restart: "unless-stopped"
    networks:
      - bw-universe
      - bw-docker
      - bw-db

  bw-docker:
    image: tecnativa/docker-socket-proxy:nightly
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      CONTAINERS: "1"
      LOG_LEVEL: "warning"
    networks:
      - bw-docker

  bw-db:
    image: mariadb:11
    # Wir setzen die maximal zulässige Paketgröße, um Probleme mit großen Abfragen zu vermeiden
    command: --max-allowed-packet=67108864
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: "yes"
      MYSQL_DATABASE: "db"
      MYSQL_USER: "bunkerweb"
      MYSQL_PASSWORD: "changeme" # Denken Sie daran, ein stärkeres Passwort für die Datenbank festzulegen
    volumes:
      - bw-data:/var/lib/mysql
    networks:
      - bw-docker

volumes:
  bw-data:
  bw-storage:

networks:
  bw-universe:
    name: bw-universe
    ipam:
      driver: default
      config:
        - subnet: 10.20.30.0/24
  bw-services:
    name: bw-services
  bw-docker:
    name: bw-docker

Sie können nun Ihre PHP-FPM-Container erstellen, die richtigen Unterordner mounten und Labels verwenden, um BunkerWeb zu konfigurieren:

services:
  myapp1:
      image: php:fpm
      volumes:
        - ./www/app1.example.com:/app
      networks:
        bw-services:
            aliases:
              - myapp1
      labels:
        - "bunkerweb.SERVER_NAME=app1.example.com"
        - "bunkerweb.REMOTE_PHP=myapp1"
        - "bunkerweb.REMOTE_PHP_PATH=/app"

  myapp2:
      image: php:fpm
      volumes:
        - ./www/app2.example.com:/app
      networks:
        bw-services:
            aliases:
              - myapp2
      labels:
        - "bunkerweb.SERVER_NAME=app2.example.com"
        - "bunkerweb.REMOTE_PHP=myapp2"
        - "bunkerweb.REMOTE_PHP_PATH=/app"

  myapp3:
      image: php:fpm
      volumes:
        - ./www/app3.example.com:/app
      networks:
        bw-services:
            aliases:
              - myapp3
      labels:
        - "bunkerweb.SERVER_NAME=app3.example.com"
        - "bunkerweb.REMOTE_PHP=myapp3"
        - "bunkerweb.REMOTE_PHP_PATH=/app"

networks:
  bw-services:
    external: true
    name: bw-services

PHP wird für Kubernetes nicht unterstützt

Die Kubernetes-Integration ermöglicht die Konfiguration über Ingress und der BunkerWeb-Controller unterstützt im Moment nur HTTP-Anwendungen.

Wir gehen davon aus, dass Sie bereits den Linux-Integrations-Stack auf Ihrer Maschine laufen haben.

Standardmäßig sucht BunkerWeb nach Web-Dateien im Ordner /var/www/html. Sie können ihn verwenden, um Ihre PHP-Anwendungen zu speichern. Bitte beachten Sie, dass Sie Ihren PHP-FPM-Dienst so konfigurieren müssen, dass er den Benutzer/die Gruppe der laufenden Prozesse und die UNIX-Socket-Datei, die zur Kommunikation mit BunkerWeb verwendet wird, abruft oder festlegt.

Zunächst müssen Sie sicherstellen, dass Ihre PHP-FPM-Instanz auf die Dateien im Ordner /var/www/html zugreifen kann und dass BunkerWeb auf die UNIX-Socket-Datei zugreifen kann, um mit PHP-FPM zu kommunizieren. Wir empfehlen, einen anderen Benutzer wie www-data für den PHP-FPM-Dienst festzulegen und der nginx-Gruppe Zugriff auf die UNIX-Socket-Datei zu geben. Hier ist die entsprechende PHP-FPM-Konfiguration:

...
[www]
user = www-data
group = www-data
listen = /run/php/php-fpm.sock
listen.owner = www-data
listen.group = nginx
listen.mode = 0660
...

Vergessen Sie nicht, Ihren PHP-FPM-Dienst neu zu starten:

systemctl restart php-fpm

Wenn Sie den Multisite-Modus aktivieren, müssen Sie separate Verzeichnisse für jede Ihrer Anwendungen erstellen. Jedes Unterverzeichnis sollte nach dem ersten Wert von SERVER_NAME benannt werden. Hier ist ein Dummy-Beispiel:

/var/www/html
├── app1.example.com
│   └── index.php
├── app2.example.com
│   └── index.php
└── app3.example.com
    └── index.php

3 Verzeichnisse, 3 Dateien

Bitte beachten Sie, dass Sie die Berechtigungen korrigieren müssen, damit BunkerWeb (Gruppe nginx) zumindest Dateien lesen und Ordner auflisten kann und PHP-FPM (Benutzer www-data, kann je nach System unterschiedlich sein) der Eigentümer der Dateien und Ordner ist:

chown -R www-data:nginx /var/www/html && \
find /var/www/html -type f -exec chmod 0640 {} \; && \
find /var/www/html -type d -exec chmod 0750 {} \;

Sie können nun die Datei /etc/bunkerweb/variable.env bearbeiten:

HTTP_PORT=80
HTTPS_PORT=443
DNS_RESOLVERS=9.9.9.9 8.8.8.8 8.8.4.4
API_LISTEN_IP=127.0.0.1
MULTISITE=yes
SERVER_NAME=app1.example.com app2.example.com app3.example.com
app1.example.com_LOCAL_PHP=/run/php/php-fpm.sock
app1.example.com_LOCAL_PHP_PATH=/var/www/html/app1.example.com
app2.example.com_LOCAL_PHP=/run/php/php-fpm.sock
app2.example.com_LOCAL_PHP_PATH=/var/www/html/app2.example.com
app3.example.com_LOCAL_PHP=/run/php/php-fpm.sock
app3.example.com_LOCAL_PHP_PATH=/var/www/html/app3.example.com

Überprüfen wir nun den Status des Schedulers:

systemctl status bunkerweb-scheduler

Wenn er bereits läuft, können wir ihn neu laden:

systemctl reload bunkerweb-scheduler

Andernfalls müssen wir ihn starten:

systemctl start bunkerweb-scheduler

Veraltet

Die Swarm-Integration ist veraltet und wird in einer zukünftigen Version entfernt. Bitte erwägen Sie stattdessen die Verwendung der Kubernetes-Integration.

Weitere Informationen finden Sie in der Swarm-Integrationsdokumentation.

Multisite-Modus aktiviert

Die Swarm-Integration impliziert die Verwendung des Multisite-Modus: Das Schützen einer PHP-Anwendung ist dasselbe wie das Schützen mehrerer.

Geteiltes Volume

Die Verwendung von PHP mit der Docker Swarm-Integration erfordert ein geteiltes Volume zwischen allen BunkerWeb- und PHP-FPM-Instanzen, was in dieser Dokumentation nicht behandelt wird.

Bei Verwendung von Swarm müssen Sie zur Unterstützung von PHP-Anwendungen Folgendes tun:

  • Mounten Sie Ihre PHP-Dateien in den Ordner /var/www/html von BunkerWeb
  • Richten Sie PHP-FPM-Container für Ihre Anwendungen ein und mounten Sie den Ordner mit den PHP-Apps
  • Verwenden Sie die spezifischen Einstellungen REMOTE_PHP und REMOTE_PHP_PATH als Labels für Ihren PHP-FPM-Container

Da die Swarm-Integration die Verwendung des Multisite-Modus impliziert, müssen Sie separate Verzeichnisse für jede Ihrer Anwendungen erstellen. Jedes Unterverzeichnis sollte nach dem ersten Wert von SERVER_NAME benannt werden. Hier ist ein Dummy-Beispiel:

www
├── app1.example.com
│   └── index.php
├── app2.example.com
│   └── index.php
└── app3.example.com
    └── index.php

3 Verzeichnisse, 3 Dateien

Als Beispiel gehen wir davon aus, dass Sie einen freigegebenen Ordner auf Ihren Worker-Knoten am Endpunkt /shared gemountet haben.

Sobald die Ordner erstellt sind, kopieren Sie Ihre Dateien und korrigieren Sie die Berechtigungen, damit BunkerWeb (UID/GID 101) zumindest Dateien lesen und Ordner auflisten kann und PHP-FPM (UID/GID 33, wenn Sie das php:fpm-Image verwenden) der Eigentümer der Dateien und Ordner ist:

chown -R 33:101 /shared/www && \
find /shared/www -type f -exec chmod 0640 {} \; && \
find /shared/www -type d -exec chmod 0750 {} \;

Wenn Sie den BunkerWeb-Stack starten, mounten Sie den Ordner /shared/www in /var/www/html für den Scheduler-Container:

services:
  bunkerweb:
    image: bunkerity/bunkerweb:1.6.5
    volumes:
      - /shared/www:/var/www/html
...

Sie können nun Ihre PHP-FPM-Dienste erstellen, die richtigen Unterordner mounten und Labels verwenden, um BunkerWeb zu konfigurieren:

services:
  myapp1:
      image: php:fpm
      volumes:
        - ./www/app1.example.com:/app
      networks:
        bw-services:
            aliases:
              - myapp1
      deploy:
        placement:
          constraints:
            - "node.role==worker"
        labels:
          - "bunkerweb.SERVER_NAME=app1.example.com"
          - "bunkerweb.REMOTE_PHP=myapp1"
          - "bunkerweb.REMOTE_PHP_PATH=/app"

  myapp2:
      image: php:fpm
      volumes:
        - ./www/app2.example.com:/app
      networks:
        bw-services:
            aliases:
              - myapp2
      deploy:
        placement:
          constraints:
            - "node.role==worker"
        labels:
          - "bunkerweb.SERVER_NAME=app2.example.com"
          - "bunkerweb.REMOTE_PHP=myapp2"
          - "bunkerweb.REMOTE_PHP_PATH=/app"

  myapp3:
      image: php:fpm
      volumes:
        - ./www/app3.example.com:/app
      networks:
        bw-services:
            aliases:
              - myapp3
      deploy:
        placement:
          constraints:
            - "node.role==worker"
        labels:
          - "bunkerweb.SERVER_NAME=app3.example.com"
          - "bunkerweb.REMOTE_PHP=myapp3"
          - "bunkerweb.REMOTE_PHP_PATH=/app"

networks:
  bw-services:
    external: true
    name: bw-services

IPv6

Experimentelles Feature

Dieses Feature ist nicht produktionsreif. Fühlen Sie sich frei, es zu testen und uns Fehler über Issues im GitHub-Repository zu melden.

Standardmäßig lauscht BunkerWeb nur auf IPv4-Adressen und verwendet kein IPv6 für die Netzwerkkommunikation. Wenn Sie die IPv6-Unterstützung aktivieren möchten, müssen Sie USE_IPV6=yes setzen. Bitte beachten Sie, dass die IPv6-Konfiguration Ihres Netzwerks und Ihrer Umgebung außerhalb des Geltungsbereichs dieser Dokumentation liegt.

Zunächst müssen Sie Ihren Docker-Daemon so konfigurieren, dass er die IPv6-Unterstützung für Container aktiviert und bei Bedarf ip6tables verwendet. Hier ist eine Beispielkonfiguration für Ihre /etc/docker/daemon.json-Datei:

{
  "experimental": true,
  "ipv6": true,
  "ip6tables": true,
  "fixed-cidr-v6": "fd00:dead:beef::/48"
}

Sie können nun den Docker-Dienst neu starten, um die Änderungen zu übernehmen:

systemctl restart docker

Sobald Docker für die Unterstützung von IPv6 eingerichtet ist, können Sie die Einstellung USE_IPV6 hinzufügen und die bw-services für IPv6 konfigurieren:

services:
  bw-scheduler:
    image: bunkerity/bunkerweb-scheduler:1.6.5
    environment:
      USE_IPv6: "yes"

...

networks:
  bw-services:
    name: bw-services
    enable_ipv6: true
    ipam:
      config:
        - subnet: fd00:13:37::/48
          gateway: fd00:13:37::1

...

Sie müssen die Einstellungen zur Datei /etc/bunkerweb/variables.env hinzufügen:

...
USE_IPV6=yes
...

Überprüfen wir den Status von BunkerWeb:

systemctl status bunkerweb

Wenn er bereits läuft, können wir ihn neu starten:

systemctl restart bunkerweb

Andernfalls müssen wir ihn starten:

systemctl start bunkerweb

Docker Logging Best Practices

Bei der Verwendung von Docker ist es wichtig, die Container-Protokolle zu verwalten, um zu verhindern, dass sie übermäßig viel Speicherplatz beanspruchen. Standardmäßig verwendet Docker den json-file-Protokollierungstreiber, der bei fehlender Konfiguration zu sehr großen Protokolldateien führen kann.

Um dies zu vermeiden, können Sie die Protokollrotation konfigurieren. Dies kann für bestimmte Dienste in Ihrer docker-compose.yml-Datei oder global für den Docker-Daemon erfolgen.

Konfiguration pro Dienst

Sie können den Protokollierungstreiber für Ihre Dienste in Ihrer docker-compose.yml-Datei so konfigurieren, dass die Protokolle automatisch rotiert werden. Hier ist ein Beispiel, das bis zu 10 Protokolldateien mit jeweils 20 MB aufbewahrt:

services:
  bunkerweb:
    image: bunkerity/bunkerweb:1.6.5
    logging:
      driver: "json-file"
      options:
        max-size: "20m"
        max-file: "10"
    ...

Diese Konfiguration stellt sicher, dass die Protokolle rotiert werden, und verhindert, dass sie Ihre Festplatte füllen. Sie können dies auf jeden Dienst in Ihrer Docker Compose-Einrichtung anwenden.

Globale Konfiguration (daemon.json)

Wenn Sie diese Protokollierungseinstellungen standardmäßig auf alle Container auf dem Host anwenden möchten, können Sie den Docker-Daemon konfigurieren, indem Sie die Datei /etc/docker/daemon.json bearbeiten (oder erstellen):

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "20m",
    "max-file": "10"
  }
}

Nachdem Sie daemon.json geändert haben, müssen Sie den Docker-Daemon neu starten, damit die Änderungen wirksam werden:

sudo systemctl restart docker

Diese globale Konfiguration wird von allen Containern übernommen. Jede pro Dienst in einer docker-compose.yml-Datei definierte Protokollierungskonfiguration überschreibt jedoch die globalen Einstellungen in daemon.json.

Sicherheits-Tuning

BunkerWeb bietet viele Sicherheitsfunktionen, die Sie mit Features konfigurieren können. Auch wenn die Standardwerte der Einstellungen eine minimale "Sicherheit von Haus aus" gewährleisten, empfehlen wir dringend, sie anzupassen. Dadurch können Sie das Sicherheitsniveau Ihrer Wahl sicherstellen und auch Fehlalarme verwalten.

Andere Funktionen

Dieser Abschnitt konzentriert sich nur auf das Sicherheits-Tuning, siehe den Abschnitt Features der Dokumentation für andere Einstellungen.

Übersicht

Übersicht und Reihenfolge der Kern-Sicherheits-Plugins

CrowdSec Console-Integration

Wenn Sie noch nicht mit der CrowdSec Console-Integration vertraut sind, CrowdSec nutzt crowdsourced Intelligenz, um Cyber-Bedrohungen zu bekämpfen. Stellen Sie es sich wie das "Waze der Cybersicherheit" vor – wenn ein Server angegriffen wird, werden andere Systeme weltweit alarmiert und vor denselben Angreifern geschützt. Mehr darüber erfahren Sie hier.

Herzlichen Glückwunsch, Ihre BunkerWeb-Instanz ist jetzt in Ihrer CrowdSec Console registriert!

Pro-Tipp: Wenn Sie Ihre Warnungen anzeigen, klicken Sie auf die Option "Spalten" und aktivieren Sie das Kontrollkästchen "Kontext", um auf BunkerWeb-spezifische Daten zuzugreifen.

Übersicht

BunkerWeb-Daten, die in der Kontextspalte angezeigt werden

Überwachung und Berichterstattung

Überwachung crow pro icon (PRO)

STREAM-Unterstützung ❌

Das Überwachungs-Plugin ermöglicht es Ihnen, Metriken über BunkerWeb zu sammeln und abzurufen. Durch die Aktivierung beginnen Ihre Instanz(en), verschiedene Daten zu Angriffen, Anfragen und Leistung zu sammeln. Sie können sie dann durch Aufrufen des API-Endpunkts /monitoring regelmäßig abrufen oder andere Plugins wie den Prometheus-Exporter verwenden.

Liste der Funktionen

  • Aktivierung der Sammlung verschiedener BunkerWeb-Metriken
  • Abrufen von Metriken von der API
  • Verwendung in Kombination mit anderen Plugins (z. B. Prometheus-Exporter)
  • Dedizierte UI-Seite zur Überwachung Ihrer Instanz(en)

Liste der Einstellungen

Einstellung Standard Kontext Mehrfach Beschreibung
USE_MONITORING yes global nein Aktiviert die Überwachung von BunkerWeb.
MONITORING_METRICS_DICT_SIZE 10M global nein Größe des Diktionärs zum Speichern von Überwachungsmetriken.

Prometheus-Exporter crow pro icon (PRO)

STREAM-Unterstützung ❌

Das Prometheus-Exporter-Plugin fügt einen Prometheus-Exporter zu Ihrer/n BunkerWeb-Instanz(en) hinzu. Wenn aktiviert, können Sie Ihre Prometheus-Instanz(en) so konfigurieren, dass sie einen bestimmten Endpunkt auf BunkerWeb abrufen und interne Metriken sammeln.

Wir stellen auch ein Grafana-Dashboard zur Verfügung, das Sie in Ihre eigene Instanz importieren und mit Ihrer eigenen Prometheus-Datenquelle verbinden können.

Bitte beachten Sie, dass die Verwendung des Prometheus-Exporter-Plugins die Aktivierung des Überwachungs-Plugins erfordert (USE_MONITORING=yes)

Liste der Funktionen

  • Prometheus-Exporter, der interne BunkerWeb-Metriken bereitstellt
  • Dedizierter und konfigurierbarer Port, lauschende IP und URL
  • Whitelist-IP/Netzwerk für maximale Sicherheit

Liste der Einstellungen

Einstellung Standard Kontext Mehrfach Beschreibung
USE_PROMETHEUS_EXPORTER no global nein Aktiviert den Prometheus-Export.
PROMETHEUS_EXPORTER_IP 0.0.0.0 global nein Lauschende IP des Prometheus-Exporters.
PROMETHEUS_EXPORTER_PORT 9113 global nein Lauschender Port des Prometheus-Exporters.
PROMETHEUS_EXPORTER_URL /metrics global nein HTTP-URL des Prometheus-Exporters.
PROMETHEUS_EXPORTER_ALLOW_IP 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 global nein Liste der IP/Netzwerke, die den Prometheus-Exporter-Endpunkt kontaktieren dürfen.

Berichterstattung crow pro icon (PRO)

STREAM-Unterstützung ❌

Überwachungs-Plugin erforderlich

Dieses Plugin erfordert, dass das Monitoring Pro-Plugin installiert und mit der Einstellung USE_MONITORING auf yes gesetzt ist.

Das Reporting-Plugin bietet eine umfassende Lösung für die regelmäßige Berichterstattung wichtiger Daten aus BunkerWeb, einschließlich globaler Statistiken, Angriffe, Sperren, Anfragen, Gründe und AS-Informationen. Es bietet eine breite Palette von Funktionen, einschließlich automatischer Berichterstellung, Anpassungsoptionen und nahtloser Integration mit dem Monitoring Pro-Plugin. Mit dem Reporting-Plugin können Sie Berichte einfach erstellen und verwalten, um die Leistung und Sicherheit Ihrer Anwendung zu überwachen.

Liste der Funktionen

  • Regelmäßige Berichterstattung wichtiger Daten aus BunkerWeb, einschließlich globaler Statistiken, Angriffe, Sperren, Anfragen, Gründe und AS-Informationen.
  • Integration mit dem Monitoring Pro-Plugin für nahtlose Integration und erweiterte Berichtsfunktionen.
  • Unterstützung für Webhooks (klassisch, Discord und Slack) für Echtzeit-Benachrichtigungen.
  • Unterstützung für SMTP für E-Mail-Benachrichtigungen.
  • Konfigurationsoptionen zur Anpassung und Flexibilität.

Liste der Einstellungen

Einstellung Standard Kontext Beschreibung
USE_REPORTING_SMTP no global Aktiviert das Senden des Berichts per E-Mail.
USE_REPORTING_WEBHOOK no global Aktiviert das Senden des Berichts per Webhook.
REPORTING_SCHEDULE weekly global Die Häufigkeit, mit der Berichte gesendet werden.
REPORTING_WEBHOOK_URLS global Liste der Webhook-URLs, die den Bericht im Markdown-Format erhalten sollen (durch Leerzeichen getrennt).
REPORTING_SMTP_EMAILS global Liste der E-Mail-Adressen, die den Bericht im HTML-Format erhalten sollen (durch Leerzeichen getrennt).
REPORTING_SMTP_HOST global Der Host-Server, der für den SMTP-Versand verwendet wird.
REPORTING_SMTP_PORT 465 global Der für SMTP verwendete Port. Bitte beachten Sie, dass es je nach Verbindungstyp unterschiedliche Standards gibt (SSL = 465, TLS = 587).
REPORTING_SMTP_FROM_EMAIL global Die als Absender verwendete E-Mail-Adresse. Beachten Sie, dass 2FA für diese E-Mail-Adresse deaktiviert sein muss.
REPORTING_SMTP_FROM_USER global Der Benutzerauthentifizierungswert für das Senden über die Absender-E-Mail-Adresse.
REPORTING_SMTP_FROM_PASSWORD global Der Passwortauthentifizierungswert für das Senden über die Absender-E-Mail-Adresse.
REPORTING_SMTP_SSL SSL global Bestimmt, ob eine sichere Verbindung für SMTP verwendet werden soll oder nicht.
REPORTING_SMTP_SUBJECT BunkerWeb Report global Die Betreffzeile der E-Mail.

Information und Verhalten

  • wenn USE_REPORTING_SMTP auf yes gesetzt ist, muss die Einstellung REPORTING_SMTP_EMAILS gesetzt werden.
  • wenn USE_REPORTING_WEBHOOK auf yes gesetzt ist, muss die Einstellung REPORTING_WEBHOOK_URLS gesetzt werden.
  • Akzeptierte Werte für REPORTING_SCHEDULE sind daily, weekly und monthly.
  • wenn keine REPORTING_SMTP_FROM_USER und REPORTING_SMTP_FROM_PASSWORD gesetzt sind, versucht das Plugin, die E-Mail ohne Authentifizierung zu senden.
  • wenn REPORTING_SMTP_FROM_USER nicht gesetzt ist, aber REPORTING_SMTP_FROM_PASSWORD gesetzt ist, verwendet das Plugin die REPORTING_SMTP_FROM_EMAIL als Benutzernamen.
  • wenn der Job fehlschlägt, versucht das Plugin, den Bericht bei der nächsten Ausführung erneut zu senden.

Sicherung und Wiederherstellung

Sicherung S3 crow pro icon (PRO)

STREAM-Unterstützung ✅

Das Backup S3-Tool automatisiert nahtlos den Datenschutz, ähnlich dem Community-Backup-Plugin. Es zeichnet sich jedoch dadurch aus, dass es Backups direkt und sicher in einem S3-Bucket speichert.

Durch die Aktivierung dieser Funktion schützen Sie proaktiv die Integrität Ihrer Daten. Das Speichern von Backups remote schützt wichtige Informationen vor Bedrohungen wie Hardwareausfällen, Cyberangriffen oder Naturkatastrophen. Dies gewährleistet sowohl Sicherheit als auch Verfügbarkeit, ermöglicht eine schnelle Wiederherstellung bei unerwarteten Ereignissen, bewahrt die betriebliche Kontinuität und sorgt für Sorgenfreiheit.

Informationen für Benutzer von Red Hat Enterprise Linux (RHEL) 8.9

Wenn Sie RHEL 8.9 verwenden und eine externe Datenbank nutzen möchten, müssen Sie das Paket mysql-community-client installieren, um sicherzustellen, dass der Befehl mysqldump verfügbar ist. Sie können das Paket mit den folgenden Befehlen installieren:

  1. Installieren Sie das MySQL-Repository-Konfigurationspaket

    sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el8-9.noarch.rpm
    
  2. Aktivieren Sie das MySQL-Repository

    sudo dnf config-manager --enable mysql80-community
    
  3. Installieren Sie den MySQL-Client

    sudo dnf install mysql-community-client
    
  1. Installieren Sie das PostgreSQL-Repository-Konfigurationspaket

    dnf install "https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-$(uname -m)/pgdg-redhat-repo-latest.noarch.rpm"
    
  2. Installieren Sie den PostgreSQL-Client

    dnf install postgresql<version>
    

Liste der Funktionen

  • Automatische Datensicherung in einem S3-Bucket
  • Flexible Planungsoptionen: täglich, wöchentlich oder monatlich
  • Rotationsmanagement zur Steuerung der Anzahl der aufzubewahrenden Backups
  • Anpassbarer Komprimierungsgrad für Backup-Dateien

Liste der Einstellungen

Einstellung Standard Kontext Beschreibung
USE_BACKUP_S3 no global Aktiviert oder deaktiviert die S3-Backup-Funktion
BACKUP_S3_SCHEDULE daily global Die Häufigkeit des Backups
BACKUP_S3_ROTATION 7 global Die Anzahl der aufzubewahrenden Backups
BACKUP_S3_ENDPOINT global Der S3-Endpunkt
BACKUP_S3_BUCKET global Der S3-Bucket
BACKUP_S3_DIR global Das S3-Verzeichnis
BACKUP_S3_REGION global Die S3-Region
BACKUP_S3_ACCESS_KEY_ID global Die S3-Zugriffsschlüssel-ID
BACKUP_S3_ACCESS_KEY_SECRET global Das S3-Zugriffsschlüsselgeheimnis
BACKUP_S3_COMP_LEVEL 6 global Der Komprimierungsgrad der Backup-Zip-Datei
Manuelle Sicherung

Um eine Sicherung manuell zu starten, führen Sie den folgenden Befehl aus:

bwcli plugin backup_s3 save
docker exec -it <scheduler_container> bwcli plugin backup_s3 save

Dieser Befehl erstellt eine Sicherung Ihrer Datenbank und speichert sie im S3-Bucket, der in der Einstellung BACKUP_S3_BUCKET angegeben ist.

Sie können auch einen benutzerdefinierten S3-Bucket für die Sicherung angeben, indem Sie die Umgebungsvariable BACKUP_S3_BUCKET bei der Ausführung des Befehls bereitstellen:

BACKUP_S3_BUCKET=your-bucket-name bwcli plugin backup_s3 save
docker exec -it -e BACKUP_S3_BUCKET=your-bucket-name <scheduler_container> bwcli plugin backup_s3 save

Spezifikationen für MariaDB/MySQL

Falls Sie MariaDB/MySQL verwenden, kann beim Versuch, Ihre Datenbank zu sichern, der folgende Fehler auftreten:

caching_sha2_password could not be loaded: Error loading shared library /usr/lib/mariadb/plugin/caching_sha2_password.so

Um dieses Problem zu lösen, können Sie den folgenden Befehl ausführen, um das Authentifizierungs-Plugin auf mysql_native_password zu ändern:

ALTER USER 'yourusername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'youpassword';

Wenn Sie die Docker-Integration verwenden, können Sie den folgenden Befehl zur docker-compose.yml-Datei hinzufügen, um das Authentifizierungs-Plugin automatisch zu ändern:

bw-db:
    image: mariadb:<version>
    command: --default-authentication-plugin=mysql_native_password
    ...
bw-db:
    image: mysql:<version>
    command: --default-authentication-plugin=mysql_native_password
    ...
Manuelle Wiederherstellung

Um eine Wiederherstellung manuell zu starten, führen Sie den folgenden Befehl aus:

bwcli plugin backup_s3 restore
docker exec -it <scheduler_container> bwcli plugin backup_s3 restore

Dieser Befehl erstellt eine temporäre Sicherung Ihrer Datenbank im S3-Bucket, der in der Einstellung BACKUP_S3_BUCKET angegeben ist, und stellt Ihre Datenbank auf die neueste im Bucket verfügbare Sicherung wieder her.

Sie können auch eine benutzerdefinierte Sicherungsdatei für die Wiederherstellung angeben, indem Sie den Pfad dazu als Argument bei der Ausführung des Befehls angeben:

bwcli plugin backup_s3 restore s3_backup_file.zip
docker exec -it <scheduler_container> bwcli plugin backup restore s3_backup_file.zip

Im Falle eines Fehlers

Machen Sie sich keine Sorgen, wenn die Wiederherstellung fehlschlägt, Sie können Ihre Datenbank jederzeit auf den vorherigen Zustand zurücksetzen, indem Sie den Befehl erneut ausführen, da vor der Wiederherstellung eine Sicherung erstellt wird:

bwcli plugin backup_s3 restore
docker exec -it <scheduler_container> bwcli plugin backup_s3 restore

Migration crow pro icon (PRO)

STREAM-Unterstützung ✅

Das Migrations-Plugin revolutioniert die Übertragung von BunkerWeb-Konfigurationen zwischen Instanzen mit seiner benutzerfreundlichen Weboberfläche, die den gesamten Migrationsprozess vereinfacht. Ob Sie Systeme aufrüsten, die Infrastruktur skalieren oder Umgebungen wechseln, dieses Tool ermöglicht es Ihnen, Einstellungen, Präferenzen und Daten mühelos und mit unübertroffener Leichtigkeit und Zuversicht zu übertragen. Verabschieden Sie sich von umständlichen manuellen Prozessen und begrüßen Sie ein nahtloses, problemloses Migrationserlebnis.

Liste der Funktionen

  • Mühelose Migration: Übertragen Sie BunkerWeb-Konfigurationen einfach zwischen Instanzen, ohne die Komplexität manueller Verfahren.

  • Intuitive Weboberfläche: Navigieren Sie mühelos durch den Migrationsprozess mit einer benutzerfreundlichen Weboberfläche, die für eine intuitive Bedienung entwickelt wurde.

  • Datenbankübergreifende Kompatibilität: Genießen Sie eine nahtlose Migration über verschiedene Datenbankplattformen hinweg, einschließlich SQLite, MySQL, MariaDB und PostgreSQL, und gewährleisten Sie die Kompatibilität mit Ihrer bevorzugten Datenbankumgebung.

Eine Migrationsdatei erstellen

Um eine Migrationsdatei manuell zu erstellen, führen Sie den folgenden Befehl aus:

bwcli plugin migration create /pfad/zur/migrations/datei
  1. Eine Migrationsdatei erstellen:

    docker exec -it <scheduler_container> bwcli plugin migration create /pfad/zur/migrations/datei
    
  2. Kopieren Sie die Migrationsdatei auf Ihren lokalen Rechner:

    docker cp <scheduler_container>:/pfad/zur/migrations/datei /pfad/zur/migrations/datei
    

Dieser Befehl erstellt eine Sicherung Ihrer Datenbank und speichert sie im im Befehl angegebenen Sicherungsverzeichnis.

Spezifikationen für MariaDB/MySQL

Falls Sie MariaDB/MySQL verwenden, kann beim Versuch, Ihre Datenbank zu sichern, der folgende Fehler auftreten:

caching_sha2_password could not be loaded: Error loading shared library /usr/lib/mariadb/plugin/caching_sha2_password.so

Um dieses Problem zu lösen, können Sie den folgenden Befehl ausführen, um das Authentifizierungs-Plugin auf mysql_native_password zu ändern:

ALTER USER 'yourusername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'youpassword';

Wenn Sie die Docker-Integration verwenden, können Sie den folgenden Befehl zur docker-compose.yml-Datei hinzufügen, um das Authentifizierungs-Plugin automatisch zu ändern:

bw-db:
    image: mariadb:<version>
    command: --default-authentication-plugin=mysql_native_password
    ...
bw-db:
    image: mysql:<version>
    command: --default-authentication-plugin=mysql_native_password
    ...

Eine Migration initialisieren

Um eine Migration manuell zu initialisieren, führen Sie den folgenden Befehl aus:

bwcli plugin migration migrate /pfad/zur/migrations/datei
  1. Kopieren Sie die Migrationsdatei in den Container:

    docker cp /pfad/zur/migrations/datei <scheduler_container>:/pfad/zur/migrations/datei
    
  2. Initialisieren Sie die Migration:

    docker exec -it <scheduler_container> bwcli plugin migration migrate /pfad/zur/migrations/datei
    
  1. Kopieren Sie die Migrationsdatei in den Container:

    docker cp /pfad/zur/migrations/datei bunkerweb-aio:/pfad/zur/migrations/datei
    
  2. Initialisieren Sie die Migration:

    docker exec -it bunkerweb-aio bwcli plugin migration migrate /pfad/zur/migrations/datei
    

Dieser Befehl migriert Ihre BunkerWeb-Daten nahtlos, um genau der in der Migrationsdatei beschriebenen Konfiguration zu entsprechen.

Anti-DDoS crow pro icon (PRO)

STREAM-Unterstützung ❌

Das Anti-DDoS-Plugin bietet fortschrittlichen Schutz gegen Distributed Denial of Service (DDoS)-Angriffe, indem es verdächtigen Verkehr in Echtzeit überwacht, analysiert und filtert.

Durch die Verwendung eines gleitenden Fenstermechanismus unterhält das Plugin ein In-Memory-Wörterbuch mit Zeitstempeln von Anfragen, um anormale Verkehrsspitzen von einzelnen IP-Adressen zu erkennen. Basierend auf dem konfigurierten Sicherheitsmodus kann es entweder die beleidigenden Verbindungen blockieren oder die verdächtige Aktivität zur weiteren Überprüfung protokollieren.

Funktionen

  • Echtzeit-Verkehrsanalyse: Überwacht kontinuierlich eingehende Anfragen, um potenzielle DDoS-Angriffe zu erkennen.
  • Gleitender Fenstermechanismus: Verfolgt die jüngsten Anforderungsaktivitäten innerhalb eines konfigurierbaren Zeitfensters.
  • Konfigurierbare Schwellenwerte: Ermöglicht die Definition der maximalen Anzahl verdächtiger Anfragen pro IP.
  • Fortschrittliche Blockierungslogik: Wertet sowohl die Anzahl der Anfragen pro IP als auch die Anzahl der unterschiedlichen IPs aus, die den Schwellenwert überschreiten.
  • Flexible Sicherheitsmodi: Wählen Sie zwischen sofortiger Verbindungsblockierung oder dem reinen Erkennungsmodus (Protokollierung).
  • Optimierter In-Memory-Datenspeicher: Gewährleistet Hochgeschwindigkeits-Lookups und effizientes Metrik-Tracking.
  • Automatische Bereinigung: Löscht regelmäßig veraltete Daten, um eine optimale Leistung zu gewährleisten.

Konfiguration

Passen Sie das Verhalten des Plugins mit den folgenden Einstellungen an:

Einstellung Standard Kontext Mehrfach Beschreibung
USE_ANTIDDOS no global nein Aktiviert oder deaktiviert den Anti-DDoS-Schutz. Setzen Sie auf "yes", um das Plugin zu aktivieren.
ANTIDDOS_METRICS_DICT_SIZE 10M global nein Größe des In-Memory-Datenspeichers zur Verfolgung von DDoS-Metriken (z. B. 10M, 500k).
ANTIDDOS_THRESHOLD 100 global nein Maximale Anzahl verdächtiger Anfragen pro IP innerhalb des definierten Zeitfensters.
ANTIDDOS_WINDOW_TIME 10 global nein Zeitfenster in Sekunden, in dem verdächtige Anfragen gezählt werden.
ANTIDDOS_STATUS_CODES 429 403 444 global nein HTTP-Statuscodes, die als verdächtig gelten und zur Auslösung von Anti-DDoS-Aktionen verwendet werden.
ANTIDDOS_DISTINCT_IP 5 global nein Mindestanzahl unterschiedlicher IPs, die den Schwellenwert überschreiten müssen, bevor der Blockierungsmodus erzwungen wird.

Bewährte Verfahren

  • Schwellenwert-Tuning: Passen Sie ANTIDDOS_THRESHOLD und ANTIDDOS_WINDOW_TIME basierend auf Ihren typischen Verkehrsmustern an.
  • Statuscode-Überprüfung: Aktualisieren Sie ANTIDDOS_STATUS_CODES regelmäßig, um neue oder sich entwickelnde verdächtige Verhaltensweisen zu erfassen.
  • Überwachung: Analysieren Sie Protokolle und Metriken regelmäßig, um die Einstellungen zu optimieren und den Gesamtschutz zu verbessern.

Benutzer-Manager crow pro icon (PRO)

Das Benutzerverwaltungs-Plugin bietet eine robuste Schnittstelle zur Verwaltung von Benutzerkonten in Ihrem System.

Mit diesem Plugin können Administratoren mühelos Benutzerkonten erstellen, aktualisieren und deaktivieren, Benutzerrollen verwalten, die Zwei-Faktor-Authentifizierung (2FA) umschalten und detaillierte Benutzerinformationen wie letzte Anmeldezeitstempel und Kontostatus (aktiv oder inaktiv) anzeigen. Dieses Plugin wurde mit Blick auf Sicherheit und Benutzerfreundlichkeit entwickelt und vereinfacht routinemäßige Benutzerverwaltungsaufgaben, während es gleichzeitig die Einhaltung von Vorschriften und die Überprüfbarkeit gewährleistet.

Funktionen

  • Benutzerkonto-Operationen: Importieren im CSV/XSLX-Format, Erstellen, Bearbeiten und Löschen von Benutzerkonten mit Leichtigkeit.
  • Rollenbasierte Zugriffskontrolle: Weisen Sie Benutzerrollen zu und ändern Sie sie, um Berechtigungen und Zugriffsebenen zu verwalten.
  • 2FA-Verwaltung: Deaktivieren Sie die Zwei-Faktor-Authentifizierung basierend auf administrativen Entscheidungen.
  • Umfassende Benutzereinblicke: Überwachen Sie wichtige Benutzerdaten, einschließlich letzter Anmeldezeiten, Kontoerstellungsdaten und Aktiv/Inaktiv-Status.
  • Audit-Protokollierung: Führen Sie eine Audit-Spur für alle Benutzerverwaltungsaktionen für verbesserte Sicherheit und Compliance.

Übersicht

Benutzer-Manager-Seite

Benutzererstellungsformular

Benutzer-Manager - Benutzererstellungsformular

Aktivitätenseite

Benutzer-Manager - Aktivitätenseite

Easy Resolve crow pro icon (PRO)

Das Easy Resolve Plugin ermöglicht es Ihnen, Fehlalarme und wiederkehrende Probleme direkt von der Berichtsseite aus schnell zu beheben. Es wandelt geführte "Resolve"-Aktionen in sichere, bereichsbezogene Konfigurationsupdates um – ohne manuelle Bearbeitung.

Funktionen

  • Ein-Klick-Aktionen aus Berichten und Berichtsdetails.
  • Kontextbezogene Vorschläge für ModSecurity, Blacklist und DNSBL.
  • Generiert sichere ModSecurity-Ausschlüsse oder aktualisiert Ignorierlisten.
  • Wendet Änderungen auf Dienst- oder globaler Ebene mit Berechtigungsprüfungen an.
  • Optionales automatisches Öffnen der zugehörigen Konfigurationsseite nach der Anwendung.

Übersicht

Berichtsseite - mit Easy Resolve

ModSecurity beheben

ModSecurity beheben

DNSBL beheben

DNSBL beheben

Blacklist beheben - IP

Blacklist - IP

Blacklist beheben - User-Agent

Blacklist - User-Agent

Blacklist beheben - rDNS

Blacklist - rDNS

Blacklist beheben - ASN

Blacklist - ASN

Blacklist beheben - URI

Blacklist - URI