Fehlerbehebung
BunkerWeb Panel
Wenn Sie Ihr Problem nicht lösen können, können Sie uns direkt über unser Panel kontaktieren. Dies zentralisiert alle Anfragen zur BunkerWeb-Lösung.
Protokolle
Bei der Fehlerbehebung sind Protokolle Ihre besten Freunde. Wir geben unser Bestes, um benutzerfreundliche Protokolle bereitzustellen, damit Sie verstehen, was passiert.
Bitte beachten Sie, dass Sie LOG_LEVEL
auf info
(Standard: notice
) setzen können, um die Ausführlichkeit von BunkerWeb zu erhöhen.
Hier erfahren Sie, wie Sie je nach Integration auf die Protokolle zugreifen können:
Container auflisten
Um die laufenden Container aufzulisten, können Sie den folgenden Befehl verwenden:
docker ps
Sie können den Befehl docker logs
verwenden (ersetzen Sie bunkerweb
durch den Namen Ihres Containers):
docker logs bunkerweb
Hier ist das Docker-Compose-Äquivalent (ersetzen Sie bunkerweb
durch den Namen der in der docker-compose.yml
-Datei deklarierten Dienste):
docker-compose logs bunkerweb
Container auflisten
Um die laufenden Container aufzulisten, können Sie den folgenden Befehl verwenden:
docker ps
Sie können den Befehl docker logs
verwenden (ersetzen Sie bunkerweb
und bw-autoconf
durch die Namen Ihrer Container):
docker logs bunkerweb
docker logs bw-autoconf
Hier ist das Docker-Compose-Äquivalent (ersetzen Sie bunkerweb
und bw-autoconf
durch die Namen der in der docker-compose.yml
-Datei deklarierten Dienste):
docker-compose logs bunkerweb
docker-compose logs bw-autoconf
Container-Name
Der Standard-Container-Name für das All-in-one-Image ist bunkerweb-aio
. Wenn Sie einen anderen Namen verwendet haben, passen Sie den Befehl bitte entsprechend an.
Sie können den Befehl docker logs
verwenden:
docker logs bunkerweb-aio
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.
Dienste auflisten
Um die Dienste aufzulisten, können Sie den folgenden Befehl verwenden:
docker service ls
Sie können den Befehl docker service logs
verwenden (ersetzen Sie bunkerweb
und bw-autoconf
durch die Namen Ihrer Dienste):
docker service logs bunkerweb
docker service logs bw-autoconf
Pods auflisten
Um die Pods aufzulisten, können Sie den folgenden Befehl verwenden:
kubectl get pods
Sie können den Befehl kubectl logs
verwenden (ersetzen Sie bunkerweb
und bunkerweb-controler
durch die Namen Ihrer Pods):
kubectl logs bunkerweb
kubectl logs bunkerweb-controler
Bei Fehlern im Zusammenhang mit BunkerWeb-Diensten (z. B. wenn sie nicht starten) können Sie journalctl
verwenden:
journalctl -u bunkerweb --no-pager
Allgemeine Protokolle befinden sich im Verzeichnis /var/log/bunkerweb
:
cat /var/log/bunkerweb/error.log
cat /var/log/bunkerweb/access.log
Berechtigungen
Vergessen Sie nicht, dass BunkerWeb aus offensichtlichen Sicherheitsgründen als unprivilegierter Benutzer ausgeführt wird. Überprüfen Sie die Berechtigungen von Dateien und Ordnern, die von BunkerWeb verwendet werden, insbesondere wenn Sie benutzerdefinierte Konfigurationen verwenden (weitere Informationen hier). Sie müssen mindestens RW-Rechte für Dateien und RWX für Ordner festlegen.
IP-Entsperrung
Sie können eine IP manuell entsperren, was bei Tests nützlich ist, damit Sie die interne API von BunkerWeb kontaktieren können (ersetzen Sie 1.2.3.4
durch die zu entsperrende IP-Adresse):
Sie können den Befehl docker exec
verwenden (ersetzen Sie bw-scheduler
durch den Namen Ihres Containers):
docker exec bw-scheduler bwcli unban 1.2.3.4
Hier ist das Docker-Compose-Äquivalent (ersetzen Sie bw-scheduler
durch den Namen der in der docker-compose.yml
-Datei deklarierten Dienste):
docker-compose exec bw-scheduler bwcli unban 1.2.3.4
Container-Name
Der Standard-Container-Name für das All-in-one-Image ist bunkerweb-aio
. Wenn Sie einen anderen Namen verwendet haben, passen Sie den Befehl bitte entsprechend an.
Sie können den Befehl docker exec
verwenden:
docker exec bunkerweb-aio bwcli unban 1.2.3.4
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 können den Befehl docker exec
verwenden (ersetzen Sie bw-scheduler
durch den Namen Ihres Dienstes):
docker exec $(docker ps -q -f name=bw-scheduler) bwcli unban 1.2.3.4
Sie können den Befehl kubectl exec
verwenden (ersetzen Sie bunkerweb-scheduler
durch den Namen Ihres Pods):
kubectl exec bunkerweb-scheduler bwcli unban 1.2.3.4
Sie können den Befehl bwcli
(als Root) verwenden:
sudo bwcli unban 1.2.3.4
Falschmeldungen
Nur-Erkennen-Modus
Zu Debugging-/Testzwecken können Sie BunkerWeb in den Nur-Erkennen-Modus versetzen, sodass Anfragen nicht blockiert werden und es sich wie ein klassischer Reverse-Proxy verhält.
ModSecurity
Die Standardkonfiguration von ModSecurity in BunkerWeb lädt das Core Rule Set im Anomalie-Bewertungsmodus mit einer Paranoia-Stufe (PL) von 1:
- Jede übereinstimmende Regel erhöht eine Anomalie-Punktzahl (so können viele Regeln auf eine einzelne Anfrage zutreffen)
- PL1 enthält Regeln mit geringerer Wahrscheinlichkeit von Falschmeldungen (aber weniger Sicherheit als PL4)
- der Standardschwellenwert für die Anomalie-Punktzahl beträgt 5 für Anfragen und 4 für Antworten
Nehmen wir die folgenden Protokolle als Beispiel für eine ModSecurity-Erkennung mit der Standardkonfiguration (zur besseren Lesbarkeit formatiert):
2022/04/26 12:01:10 [warn] 85#85: *11 ModSecurity: Warning. Matched "Operator `PmFromFile' with parameter `lfi-os-files.data' against variable `ARGS:id' (Value: `/etc/passwd' )
[file "/usr/share/bunkerweb/core/modsecurity/files/coreruleset/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf"]
[line "78"]
[id "930120"]
[rev ""]
[msg "OS File Access Attempt"]
[data "Matched Data: etc/passwd found within ARGS:id: /etc/passwd"]
[severity "2"]
[ver "OWASP_CRS/3.3.2"]
[maturity "0"]
[accuracy "0"]
[tag "application-multi"]
[tag "language-multi"]
[tag "platform-multi"]
[tag "attack-lfi"]
[tag "paranoia-level/1"]
[tag "OWASP_CRS"]
[tag "capec/1000/255/153/126"]
[tag "PCI/6.5.4"]
[hostname "172.17.0.2"]
[uri "/"]
[unique_id "165097447014.179282"]
[ref "o1,10v9,11t:utf8toUnicode,t:urlDecodeUni,t:normalizePathWin,t:lowercase"],
client: 172.17.0.1, server: localhost, request: "GET /?id=/etc/passwd HTTP/1.1", host: "localhost"
2022/04/26 12:01:10 [warn] 85#85: *11 ModSecurity: Warning. Matched "Operator `PmFromFile' with parameter `unix-shell.data' against variable `ARGS:id' (Value: `/etc/passwd' )
[file "/usr/share/bunkerweb/core/modsecurity/files/coreruleset/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf"]
[line "480"]
[id "932160"]
[rev ""]
[msg "Remote Command Execution: Unix Shell Code Found"]
[data "Matched Data: etc/passwd found within ARGS:id: /etc/passwd"]
[severity "2"]
[ver "OWASP_CRS/3.3.2"]
[maturity "0"]
[accuracy "0"]
[tag "application-multi"]
[tag "language-shell"]
[tag "platform-unix"]
[tag "attack-rce"]
[tag "paranoia-level/1"]
[tag "OWASP_CRS"]
[tag "capec/1000/152/248/88"]
[tag "PCI/6.5.2"]
[hostname "172.17.0.2"]
[uri "/"]
[unique_id "165097447014.179282"]
[ref "o1,10v9,11t:urlDecodeUni,t:cmdLine,t:normalizePath,t:lowercase"],
client: 172.17.0.1, server: localhost, request: "GET /?id=/etc/passwd HTTP/1.1", host: "localhost"
2022/04/26 12:01:10 [error] 85#85: *11 [client 172.17.0.1] ModSecurity: Access denied with code 403 (phase 2). Matched "Operator `Ge' with parameter `5' against variable `TX:ANOMALY_SCORE' (Value: `10' )
[file "/usr/share/bunkerweb/core/modsecurity/files/coreruleset/rules/REQUEST-949-BLOCKING-EVALUATION.conf"]
[line "80"]
[id "949110"]
[rev ""]
[msg "Inbound Anomaly Score Exceeded (Total Score: 10)"]
[data ""]
[severity "2"]
[ver "OWASP_CRS/3.3.2"]
[maturity "0"]
[accuracy "0"]
[tag "application-multi"]
[tag "language-multi"]
[tag "platform-multi"]
[tag "attack-generic"]
[hostname "172.17.0.2"]
[uri "/"]
[unique_id "165097447014.179282"]
[ref ""],
client: 172.17.0.1, server: localhost, request: "GET /?id=/etc/passwd HTTP/1.1", host: "localhost"
Wie wir sehen können, gibt es 3 verschiedene Protokolle:
- Regel 930120 stimmte überein
- Regel 932160 stimmte überein
- Zugriff verweigert (Regel 949110)
Eine wichtige Sache zu verstehen ist, dass Regel 949110 keine "echte" Regel ist: Es ist diejenige, die die Anfrage verweigert, weil der Anomalie-Schwellenwert erreicht ist (in diesem Beispiel 10). Sie sollten die Regel 949110 niemals entfernen!
Wenn es sich um eine Falschmeldung handelt, sollten Sie sich auf die Regeln 930120 und 932160 konzentrieren. Das Tuning von ModSecurity und/oder CRS liegt außerhalb des Rahmens dieser Dokumentation, aber vergessen Sie nicht, dass Sie benutzerdefinierte Konfigurationen vor und nach dem Laden des CRS anwenden können (weitere Informationen hier).
Schlechtes Verhalten
Ein häufiger Fall von Falschmeldungen ist, wenn der Client aufgrund der Funktion "schlechtes Verhalten" gesperrt wird, was bedeutet, dass innerhalb eines Zeitraums zu viele verdächtige HTTP-Statuscodes generiert wurden (weitere Informationen hier). Sie sollten damit beginnen, die Einstellungen zu überprüfen und sie dann entsprechend Ihrer Webanwendung(en) zu bearbeiten, z. B. einen verdächtigen HTTP-Code entfernen, die Zählzeit verringern, den Schwellenwert erhöhen usw.
Whitelisting
Wenn Sie Bots (oder Administratoren) haben, die auf Ihre Website zugreifen müssen, ist die empfohlene Vorgehensweise, um Falschmeldungen zu vermeiden, sie mit der Whitelisting-Funktion auf die Whitelist zu setzen. Wir empfehlen nicht, die Einstellungen WHITELIST_URI*
oder WHITELIST_USER_AGENT*
zu verwenden, es sei denn, sie sind auf geheime und unvorhersehbare Werte gesetzt. Gängige Anwendungsfälle sind:
- Healthcheck / Status-Bot
- Callback wie IPN oder Webhook
- Social-Media-Crawler
Häufige Fehler
Upstream hat zu großen Header gesendet
Wenn Sie den Fehler upstream sent too big header while reading response header from upstream
in den Protokollen sehen, müssen Sie die verschiedenen Proxy-Puffergrößen mit den folgenden Einstellungen anpassen:
PROXY_BUFFERS
PROXY_BUFFER_SIZE
PROXY_BUSY_BUFFERS_SIZE
Konnte server_names_hash nicht erstellen
Wenn Sie den Fehler could not build server_names_hash, you should increase server_names_hash_bucket_size
in den Protokollen sehen, müssen Sie die Einstellung SERVER_NAMES_HASH_BUCKET_SIZE
anpassen.
Zeitzone
Bei Verwendung von containerbasierten Integrationen kann die Zeitzone des Containers von der des Host-Rechners abweichen. Um dies zu beheben, können Sie die Umgebungsvariable TZ
auf die Zeitzone Ihrer Wahl in Ihren Containern setzen (z. B. TZ=Europe/Paris
). Eine Liste der Zeitzonen-Identifikatoren finden Sie hier.
Web-UI
Falls Sie Ihre UI-Anmeldeinformationen vergessen haben oder Probleme mit 2FA haben, können Sie sich mit der Datenbank verbinden, um wieder Zugriff zu erhalten.
Auf die Datenbank zugreifen
Installieren Sie SQLite (Debian/Ubuntu):
sudo apt install sqlite3
Installieren Sie SQLite (Fedora/RedHat):
sudo dnf install sqlite
Holen Sie sich eine Shell in Ihren Scheduler-Container:
Docker-Argumente
- die Option
-u 0
ist, um den Befehl als Root auszuführen (obligatorisch) - die Optionen
-it
sind, um den Befehl interaktiv auszuführen (obligatorisch) <bunkerweb_scheduler_container>
: der Name oder die ID Ihres Scheduler-Containers
docker exec -u 0 -it <bunkerweb_scheduler_container> bash
Installieren Sie SQLite:
apk add sqlite
Holen Sie sich eine Shell in Ihren All-in-one-Container:
Docker-Argumente
- die Option
-u 0
ist, um den Befehl als Root auszuführen (obligatorisch). - die Optionen
-it
sind, um den Befehl interaktiv auszuführen (obligatorisch). bunkerweb-aio
ist der Standard-Container-Name; passen Sie ihn an, wenn Sie einen benutzerdefinierten Namen verwendet haben.
docker exec -u 0 -it bunkerweb-aio bash
Greifen Sie auf Ihre Datenbank zu:
Datenbankpfad
Wir gehen davon aus, dass Sie den Standard-Datenbankpfad verwenden. Wenn Sie einen benutzerdefinierten Pfad verwenden, müssen Sie den Befehl anpassen.
Für All-in-one gehen wir davon aus, dass die Datenbank db.sqlite3
im persistenten /data
-Volume (/data/db.sqlite3
) liegt.
sqlite3 /var/lib/bunkerweb/db.sqlite3
Sie sollten etwas Ähnliches wie das Folgende sehen:
SQLite version <VER> <DATE>
Enter ".help" for usage hints.
sqlite>
Nur MariaDB / MySQL
Die folgenden Schritte sind nur für MariaDB / MySQL-Datenbanken gültig. Wenn Sie eine andere Datenbank verwenden, lesen Sie bitte die Dokumentation Ihrer Datenbank.
Anmeldeinformationen und Datenbankname
Sie müssen dieselben Anmeldeinformationen und denselben Datenbanknamen verwenden, die in der Einstellung DATABASE_URI
verwendet werden.
Greifen Sie auf Ihre lokale Datenbank zu:
mysql -u <user> -p <database>
Geben Sie dann das Passwort des Datenbankbenutzers ein, und Sie sollten auf Ihre Datenbank zugreifen können.
Greifen Sie auf Ihren Datenbankcontainer zu:
Docker-Argumente
- die Option
-u 0
ist, um den Befehl als Root auszuführen (obligatorisch) - die Optionen
-it
sind, um den Befehl interaktiv auszuführen (obligatorisch) <bunkerweb_db_container>
: der Name oder die ID Ihres Datenbankcontainers<user>
: der Datenbankbenutzer<database>
: der Datenbankname
docker exec -u 0 -it <bunkerweb_db_container> mysql -u <user> -p <database>
Geben Sie dann das Passwort des Datenbankbenutzers ein, und Sie sollten auf Ihre Datenbank zugreifen können.
Das All-in-One-Image enthält keinen MariaDB/MySQL-Server. Wenn Sie das AIO so konfiguriert haben, dass es eine externe MariaDB/MySQL-Datenbank verwendet (indem Sie die Umgebungsvariable DATABASE_URI
setzen), sollten Sie sich direkt mit dieser Datenbank mit Standard-MySQL-Client-Tools verbinden.
Die Verbindungsmethode wäre ähnlich wie im Tab "Linux" (wenn Sie sich vom Host verbinden, auf dem AIO läuft, oder von einem anderen Rechner) oder indem Sie einen MySQL-Client in einem separaten Docker-Container ausführen, der auf den Host und die Anmeldeinformationen Ihrer externen Datenbank abzielt.
Nur PostgreSQL
Die folgenden Schritte sind nur für PostgreSQL-Datenbanken gültig. Wenn Sie eine andere Datenbank verwenden, lesen Sie bitte die Dokumentation Ihrer Datenbank.
Anmeldeinformationen, Host und Datenbankname
Sie müssen dieselben Anmeldeinformationen (Benutzer/Passwort), denselben Host und denselben Datenbanknamen verwenden, die in der Einstellung DATABASE_URI
verwendet werden.
Greifen Sie auf Ihre lokale Datenbank zu:
psql -U <user> -d <database>
Wenn sich Ihre Datenbank auf einem anderen Host befindet, geben Sie den Hostnamen/die IP und den Port an:
psql -h <host> -p 5432 -U <user> -d <database>
Geben Sie dann das Passwort des Datenbankbenutzers ein, und Sie sollten auf Ihre Datenbank zugreifen können.
Greifen Sie auf Ihren Datenbankcontainer zu:
Docker-Argumente
- die Option
-u 0
ist, um den Befehl als Root auszuführen (obligatorisch) - die Optionen
-it
sind, um den Befehl interaktiv auszuführen (obligatorisch) <bunkerweb_db_container>
: der Name oder die ID Ihres Datenbankcontainers<user>
: der Datenbankbenutzer<database>
: der Datenbankname
docker exec -u 0 -it <bunkerweb_db_container> psql -U <user> -d <database>
Wenn die Datenbank an anderer Stelle gehostet wird, fügen Sie die Optionen -h <host>
und -p 5432
entsprechend hinzu.
Das All-in-One-Image enthält keinen PostgreSQL-Server. Wenn Sie das AIO so konfiguriert haben, dass es eine externe PostgreSQL-Datenbank verwendet (indem Sie die Umgebungsvariable DATABASE_URI
setzen), sollten Sie sich direkt mit dieser Datenbank mit Standard-PostgreSQL-Client-Tools verbinden.
Die Verbindungsmethode wäre ähnlich wie im Tab "Linux" (wenn Sie sich vom Host verbinden, auf dem AIO läuft, oder von einem anderen Rechner) oder indem Sie einen PostgreSQL-Client in einem separaten Docker-Container ausführen, der auf den Host und die Anmeldeinformationen Ihrer externen Datenbank abzielt.
Maßnahmen zur Fehlerbehebung
Tabellenschema
Das Schema der Tabelle bw_ui_users
ist wie folgt:
Feld | Typ | Null | Schlüssel | Standard | Extra |
---|---|---|---|---|---|
username | varchar(256) | NO | PRI | NULL | |
varchar(256) | YES | UNI | NULL | ||
password | varchar(60) | NO | NULL | ||
method | enum('ui','scheduler','autoconf','manual','wizard') | NO | NULL | ||
admin | tinyint(1) | NO | NULL | ||
theme | enum('light','dark') | NO | NULL | ||
language | varchar(2) | NO | NULL | ||
totp_secret | varchar(256) | YES | NULL | ||
creation_date | datetime | NO | NULL | ||
update_date | datetime | NO | NULL |
Führen Sie den folgenden Befehl aus, um Daten aus der Tabelle bw_ui_users
zu extrahieren:
SELECT * FROM bw_ui_users;
Sie sollten etwas Ähnliches wie das Folgende sehen:
username | password | method | admin | theme | totp_secret | creation_date | update_date | |
---|---|---|---|---|---|---|---|---|
*** | *** | *** | manual | 1 | light | *** | *** | *** |
Zuerst müssen Sie das neue Passwort mit dem bcrypt-Algorithmus hashen.
Installieren Sie die Python-bcrypt-Bibliothek:
pip install bcrypt
Generieren Sie Ihren Hash (ersetzen Sie meinpasswort
durch Ihr eigenes Passwort):
python3 -c 'from bcrypt import hashpw, gensalt ; print(hashpw(b"""meinpasswort""", gensalt(rounds=10)).decode("utf-8"))'
Sie können Ihren Benutzernamen / Ihr Passwort aktualisieren, indem Sie diesen Befehl ausführen:
UPDATE bw_ui_users SET password = '<password_hash>' WHERE admin = 1;
Wenn Sie Ihre Tabelle bw_ui_users
nach diesem Befehl erneut überprüfen:
SELECT * FROM bw_ui_users WHERE admin = 1;
Sie sollten etwas Ähnliches wie das Folgende sehen:
username | password | method | admin | theme | totp_secret | creation_date | update_date | |
---|---|---|---|---|---|---|---|---|
*** | *** | *** | manual | 1 | light | *** | *** | *** |
Sie sollten nun in der Lage sein, die neuen Anmeldeinformationen zu verwenden, um sich in der Web-UI anzumelden.
Sie können 2FA deaktivieren, indem Sie diesen Befehl ausführen:
UPDATE bw_ui_users SET totp_secret = NULL WHERE admin = 1;
Wenn Sie Ihre Tabelle bw_ui_users
nach diesem Befehl erneut überprüfen:
SELECT * FROM bw_ui_users WHERE admin = 1;
Sie sollten etwas Ähnliches wie das Folgende sehen:
username | password | method | admin | theme | totp_secret | creation_date | update_date | |
---|---|---|---|---|---|---|---|---|
*** | *** | *** | manual | 1 | light | NULL | *** | *** |
Sie sollten sich nun nur mit Ihrem Benutzernamen und Passwort ohne 2FA in der Web-UI anmelden können.
Die Wiederherstellungscodes können auf Ihrer Profilseite der Web-UI unter dem Tab Sicherheit
aktualisiert werden.
Verwenden Sie die Support-Seite in der Web-UI, um schnell Konfigurationen und Protokolle zur Fehlerbehebung zu sammeln.
- Öffnen Sie die Web-UI und gehen Sie zur Support-Seite.
- Wählen Sie den Geltungsbereich: Exportieren Sie die globale Konfiguration oder wählen Sie einen bestimmten Dienst aus.
- Klicken Sie, um das Konfigurationsarchiv für den ausgewählten Geltungsbereich herunterzuladen.
- Laden Sie optional Protokolle herunter: Die exportierten Protokolle werden automatisch anonymisiert (alle IP-Adressen und Domains werden maskiert).
Plugin hochladen
Es ist möglicherweise nicht möglich, ein Plugin in bestimmten Situationen von der Benutzeroberfläche hochzuladen:
- Fehlendes Paket zur Verwaltung komprimierter Dateien in Ihrer Integration, in diesem Fall müssen Sie die erforderlichen Pakete hinzufügen
- Safari-Browser: Der "Sicherheitsmodus" kann Sie daran hindern, ein Plugin hinzuzufügen. Sie müssen die erforderlichen Änderungen auf Ihrem Computer vornehmen