Dépannage
BunkerWeb Panel
Si vous n'êtes pas en mesure de résoudre votre problème, vous pouvez nous contacter directement via notre panel. Celle-ci centralise toutes les demandes liées à la solution BunkerWeb.
Journaux
Lors du dépannage, les journaux sont vos meilleurs amis. Nous faisons de notre mieux pour fournir des journaux conviviaux pour vous aider à comprendre ce qui se passe.
Veuillez noter que vous pouvez définir LOG_LEVEL
le sur info
(par défaut : notice
) pour augmenter la verbosité de BunkerWeb.
Voici comment vous pouvez accéder aux logs, en fonction de votre intégration :
Lister les conteneurs
Pour lister les conteneurs en cours d'exécution, vous pouvez utiliser la commande suivante :
docker ps
Vous pouvez utiliser la commande docker logs
(remplacez bunkerweb
par le nom de votre conteneur) :
docker logs bunkerweb
Voici l'équivalent docker-compose (remplacez bunkerweb
par le nom du service déclaré dans le fichier docker-compose.yml) :
docker-compose logs bunkerweb
Lister les conteneurs
Pour lister les conteneurs en cours d'exécution, vous pouvez utiliser la commande suivante :
docker ps
Vous pouvez utiliser la commande docker logs
(remplacez bunkerweb
et bw-autoconf
par le nom de vos conteneurs) :
docker logs bunkerweb
docker logs bw-autoconf
Voici l'équivalent docker-compose (remplacez bunkerweb
et bw-autoconf
par le nom des services déclarés dans le fichier docker-compose.yml) :
docker-compose logs bunkerweb
docker-compose logs bw-autoconf
Nom du conteneur
Le nom de conteneur par défaut pour l'image All-in-one est bunkerweb-aio
. Si vous avez utilisé un nom différent, ajustez la commande en conséquence.
Vous pouvez utiliser la commande docker logs
:
docker logs bunkerweb-aio
Obsolète
L'intégration Swarm est obsolète et sera supprimée dans une future version. Veuillez envisager d'utiliser l'intégration Kubernetes à la place.
Plus d'informations sont disponibles dans la documentation de l'intégration Swarm.
Lister les services
Pour lister les services, vous pouvez utiliser la commande suivante :
docker service ls
Vous pouvez utiliser la commande docker service logs
(remplacez bunkerweb
et bw-autoconf
par le nom de vos services) :
docker service logs bunkerweb
docker service logs bw-autoconf
Lister les pods
Pour lister les pods, vous pouvez utiliser la commande suivante :
kubectl get pods
Vous pouvez utiliser la commande kubectl logs
(remplacez bunkerweb
et bunkerweb-controler
par le nom de vos pods) :
kubectl logs bunkerweb
kubectl logs bunkerweb-controler
Pour les erreurs liées aux services BunkerWeb (par exemple, ne démarre pas), vous pouvez utiliser journalctl
:
journalctl -u bunkerweb --no-pager
Les journaux courants sont situés dans le répertoire /var/log/bunkerweb
:
cat /var/log/bunkerweb/error.log
cat /var/log/bunkerweb/access.log
Autorisations
N'oubliez pas que BunkerWeb fonctionne en tant qu'utilisateur non privilégié pour des raisons de sécurité évidentes. Vérifiez les autorisations des fichiers et dossiers utilisés par BunkerWeb, surtout si vous utilisez des configurations personnalisées (plus d'informations ici). Vous devrez définir au moins les droits RW sur les fichiers et RWX sur les dossiers.
Débannissement d'IP
Vous pouvez débannir manuellement une IP, ce qui est utile lors de la réalisation de tests afin de pouvoir contacter l'API interne de BunkerWeb (remplacez 1.2.3.4
par l'adresse IP à débannir) :
Vous pouvez utiliser la commande docker exec
(remplacez bw-scheduler
par le nom de votre conteneur) :
docker exec bw-scheduler bwcli unban 1.2.3.4
Voici l'équivalent docker-compose (remplacez bw-scheduler
par le nom des services déclarés dans le fichier docker-compose.yml) :
docker-compose exec bw-scheduler bwcli unban 1.2.3.4
Nom du conteneur
Le nom de conteneur par défaut pour l'image Tout-en-un est bunkerweb-aio
. Si vous avez utilisé un nom différent, ajustez la commande en conséquence.
Vous pouvez utiliser la commande docker exec
:
docker exec bunkerweb-aio bwcli unban 1.2.3.4
Obsolète
L'intégration Swarm est obsolète et sera supprimée dans une future version. Veuillez envisager d'utiliser l'intégration Kubernetes à la place.
Plus d'informations sont disponibles dans la documentation de l'intégration Swarm.
Vous pouvez utiliser la commande docker exec
(remplacez bw-scheduler
par le nom de votre service) :
docker exec $(docker ps -q -f name=bw-scheduler) bwcli unban 1.2.3.4
Vous pouvez utiliser la commande kubectl exec
(remplacez bunkerweb-scheduler
par le nom de votre pod) :
kubectl exec bunkerweb-scheduler bwcli unban 1.2.3.4
Vous pouvez utiliser la commande bwcli
(en tant que root) :
sudo bwcli unban 1.2.3.4
Faux positifs
Mode de détection uniquement
À des fins de débogage/test, vous pouvez définir BunkerWeb en mode de détection uniquement afin qu'il ne bloque pas la demande et agisse comme un proxy inverse classique.
ModSecurity
La configuration par défaut de BunkerWeb de ModSecurity est de charger le Core Rule Set en mode scoring d'anomalie avec un niveau de paranoïa (PL) de 1 :
- Chaque règle correspondante augmentera un score d'anomalie (de sorte que de nombreuses règles peuvent correspondre à une seule requête)
- PL1 comprend des règles avec moins de risques de faux positifs (mais moins de sécurité que PL4)
- Le seuil par défaut pour le score d'anomalie est de 5 pour les requêtes et de 4 pour les réponses
Prenons les logs suivants comme exemple de détection ModSecurity à l'aide de la configuration par défaut (formatée pour une meilleure lisibilité) :
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"
Comme nous pouvons le voir, il existe 3 journaux différents :
- Règle 930120 appariée
- Règle 932160 appariée
- Accès refusé (règle 949110)
Une chose importante à comprendre est que la règle 949110 n'est pas une "vraie" règle : c'est celle qui refusera la requête car le seuil d'anomalie est atteint (qui est de 10 dans cet exemple). Vous ne devriez jamais supprimer la règle 949110 !
S'il s'agit d'un faux positif, vous devez alors vous concentrer sur les règles 930120 et 932160. Le réglage de ModSecurity et/ou du CRS n'entre pas dans le cadre de cette documentation, mais n'oubliez pas que vous pouvez appliquer des configurations personnalisées avant et après le chargement du SCR (plus d'informations ici).
Mauvais comportement
Un cas courant de faux positifs est lorsque le client est banni en raison de la fonction "mauvais comportement", ce qui signifie que trop de codes d'état HTTP suspects ont été générés au cours d'une période donnée (plus d'informations ici). Vous devez commencer par examiner les paramètres, puis les modifier en fonction de votre ou vos applications web, comme la suppression d'un code HTTP suspect, la diminution du temps de comptage, l'augmentation du seuil, ...
Liste blanche
Si vous avez des bots (ou des administrateurs) qui ont besoin d'accéder à votre site Web, la méthode recommandée pour éviter tout faux positif est de les mettre sur liste blanche à l'aide de la fonction de liste blanche. Nous vous déconseillons d'utiliser les WHITELIST_URI*
paramètres ou WHITELIST_USER_AGENT*
à moins qu'ils ne soient définis sur des valeurs secrètes et imprévisibles. Les cas d'utilisation courants sont :
- Vérification de l'état / bot d'état
- Callback comme IPN ou webhook
- Robot d'exploration des médias sociaux
Erreurs courantes
En-tête trop gros envoyé en amont
Si vous voyez l'erreur suivante upstream sent too big header while reading response header from upstream
dans les journaux, vous devrez ajuster la taille des différents tampons proxy à l'aide des paramètres suivants :
PROXY_BUFFERS
PROXY_BUFFER_SIZE
PROXY_BUSY_BUFFERS_SIZE
Impossible de construire server_names_hash
Si vous voyez l'erreur suivante could not build server_names_hash, you should increase server_names_hash_bucket_size
dans les journaux, vous devrez modifier le SERVER_NAMES_HASH_BUCKET_SIZE
paramètre.
Fuseau horaire
Lors de l'utilisation d'intégrations basées sur des conteneurs, le fuseau horaire du conteneur peut ne pas correspondre à celui de la machine hôte. Pour résoudre ce problème, vous pouvez définir la TZ
variable d'environnement sur le fuseau horaire de votre choix sur vos conteneurs (par exemple, TZ=Europe/Paris
). Vous trouverez la liste des identifiants de fuseau horaire ici.
Interface utilisateur Web
Si vous avez oublié vos informations d'identification de l'interface utilisateur ou si vous rencontrez des problèmes de 2FA, vous pouvez vous connecter à la base de données pour retrouver l'accès.
Accéder à la base de données
Installer SQLite (Debian/Ubuntu) :
sudo apt install sqlite3
Installer SQLite (Fedora/RedHat) :
sudo dnf install sqlite
Obtenir un shell dans votre conteneur scheduler :
Arguments Docker
- l'option
-u 0
permet d'exécuter la commande en tant que root (obligatoire) - les options
-it
permettent d'exécuter la commande de manière interactive (obligatoire) <bunkerweb_scheduler_container>
: le nom ou l'ID de votre conteneur scheduler
docker exec -u 0 -it <bunkerweb_scheduler_container> bash
Installer SQLite :
apk add sqlite
Obtenir un shell dans votre conteneur Tout-en-un :
Arguments Docker
- l'option
-u 0
permet d'exécuter la commande en tant que root (obligatoire). - les options
-it
permettent d'exécuter la commande de manière interactive (obligatoire). bunkerweb-aio
est le nom de conteneur par défaut ; ajustez si vous avez utilisé un nom personnalisé.
docker exec -u 0 -it bunkerweb-aio bash
Accéder à votre base de données :
Chemin de la base de données
Nous supposons que vous utilisez le chemin de base de données par défaut. Si vous utilisez un chemin personnalisé, vous devrez adapter la commande.
Pour Tout-en-un, nous supposons que la base de données est db.sqlite3
située dans le volume persistant /data
(/data/db.sqlite3
).
sqlite3 /var/lib/bunkerweb/db.sqlite3
Vous devriez voir quelque chose comme ceci :
SQLite version <VER> <DATE>
Enter ".help" for usage hints.
sqlite>
MariaDB / MySQL uniquement
Les étapes suivantes sont uniquement valides pour les bases de données MariaDB / MySQL. Si vous utilisez une autre base de données, veuillez vous référer à la documentation de votre base de données.
Identifiants et nom de la base de données
Vous devrez utiliser les mêmes identifiants et nom de base de données utilisés dans le paramètre DATABASE_URI
.
Accédez à votre base de données locale :
mysql -u <user> -p <database>
Ensuite, entrez le mot de passe de l'utilisateur de la base de données et vous devriez pouvoir accéder à votre base de données.
Accédez à votre conteneur de base de données :
Arguments Docker
- l'option
-u 0
permet d'exécuter la commande en tant que root (obligatoire) - les options
-it
permettent d'exécuter la commande de manière interactive (obligatoire) <bunkerweb_db_container>
: le nom ou l'ID de votre conteneur de base de données<user>
: l'utilisateur de la base de données<database>
: le nom de la base de données
docker exec -u 0 -it <bunkerweb_db_container> mysql -u <user> -p <database>
Ensuite, entrez le mot de passe de l'utilisateur de la base de données et vous devriez pouvoir accéder à votre base de données.
L'image Tout-en-un n'inclut pas de serveur MariaDB/MySQL. Si vous avez configuré l'AIO pour utiliser une base de données MariaDB/MySQL externe (en définissant la variable d'environnement DATABASE_URI
), vous devez vous connecter à cette base de données directement à l'aide des outils clients MySQL standard.
La méthode de connexion serait similaire à l'onglet "Linux" (si vous vous connectez depuis l'hôte où AIO fonctionne ou une autre machine) ou en exécutant un client MySQL dans un conteneur Docker séparé si préféré, en ciblant l'hôte et les identifiants de votre base de données externe.
PostgreSQL uniquement
Les étapes suivantes sont uniquement valides pour les bases de données PostgreSQL. Si vous utilisez une autre base de données, veuillez vous référer à la documentation de votre base de données.
Identifiants, hôte et nom de base de données
Vous devrez utiliser les mêmes identifiants (utilisateur/mot de passe), l’hôte et le nom de base de données utilisés dans le paramètre DATABASE_URI
.
Accédez à votre base de données locale :
psql -U <user> -d <database>
Si votre base de données se trouve sur un autre hôte, ajoutez le nom d’hôte/l’IP et le port :
psql -h <host> -p 5432 -U <user> -d <database>
Ensuite, entrez le mot de passe de l’utilisateur de la base de données pour y accéder.
Accédez à votre conteneur de base de données :
Arguments Docker
- l'option
-u 0
permet d'exécuter la commande en tant que root (obligatoire) - les options
-it
permettent d'exécuter la commande de manière interactive (obligatoire) <bunkerweb_db_container>
: le nom ou l'ID de votre conteneur de base de données<user>
: l'utilisateur de la base de données<database>
: le nom de la base de données
docker exec -u 0 -it <bunkerweb_db_container> psql -U <user> -d <database>
Si la base de données est hébergée ailleurs, ajoutez les options -h <host>
et -p 5432
selon le cas.
L'image Tout-en-un n'inclut pas de serveur PostgreSQL. Si vous avez configuré l'AIO pour utiliser une base de données PostgreSQL externe (en définissant la variable d'environnement DATABASE_URI
), vous devez vous connecter à cette base de données directement à l'aide des outils clients PostgreSQL standard.
La méthode de connexion serait similaire à l'onglet "Linux" (si vous vous connectez depuis l'hôte où AIO fonctionne ou une autre machine) ou en exécutant un client PostgreSQL dans un conteneur Docker séparé si préféré, en ciblant l'hôte et les identifiants de votre base de données externe.
Actions de dépannage
Schéma des tables
Le schéma de la bw_ui_users
table est le suivant :
Field | Type | Null | Key | Default | 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 |
Exécutez la commande suivante pour extraire les données de la table bw_ui_users
:
SELECT * FROM bw_ui_users;
Vous devriez voir quelque chose comme ceci :
username | password | method | admin | theme | totp_secret | creation_date | update_date | |
---|---|---|---|---|---|---|---|---|
*** | *** | *** | manual | 1 | light | *** | *** | *** |
Vous devez d'abord hacher le nouveau mot de passe en utilisant l'algorithme bcrypt.
Installez la bibliothèque Python bcrypt :
pip install bcrypt
Générez votre hachage (remplacez mypassword
par votre propre mot de passe) :
python3 -c 'from bcrypt import hashpw, gensalt ; print(hashpw(b"""mypassword""", gensalt(rounds=10)).decode("utf-8"))'
Vous pouvez mettre à jour votre nom d'utilisateur / mot de passe en exécutant cette commande :
UPDATE bw_ui_users SET password = '<password_hash>' WHERE admin = 1;
Si vous vérifiez à nouveau votre table bw_ui_users
en suivant cette commande :
SELECT * FROM bw_ui_users WHERE admin = 1;
Vous devriez voir quelque chose comme ceci :
username | password | method | admin | theme | totp_secret | creation_date | update_date | |
---|---|---|---|---|---|---|---|---|
*** | *** | *** | manual | 1 | light | *** | *** | *** |
Vous devriez maintenant pouvoir utiliser les nouvelles informations d'identification pour vous connecter à l'interface utilisateur Web.
Vous pouvez désactiver l'authentification 2FA en exécutant cette commande :
UPDATE bw_ui_users SET totp_secret = NULL WHERE admin = 1;
Si vous vérifiez à nouveau votre table bw_ui_users
en suivant cette commande :
SELECT * FROM bw_ui_users WHERE admin = 1;
Vous devriez voir quelque chose comme ceci :
username | password | method | admin | theme | totp_secret | creation_date | update_date | |
---|---|---|---|---|---|---|---|---|
*** | *** | *** | manual | 1 | light | NULL | *** | *** |
Vous devriez maintenant pouvoir vous connecter à l'interface utilisateur Web en utilisant uniquement votre nom d'utilisateur et votre mot de passe sans 2FA.
Les codes de récupération peuvent être actualisés dans votre page de profil de l'interface utilisateur Web sous l'onglet Sécurité
.
Utilisez la page Support de l’interface Web pour rassembler rapidement la configuration et les journaux pour le dépannage.
- Ouvrez l’interface Web et allez à la page Support.
- Choisissez la portée : exporter la configuration Globale ou sélectionner un Service spécifique.
- Cliquez pour télécharger l’archive de configuration pour la portée choisie.
- Vous pouvez également télécharger les journaux : les journaux exportés sont automatiquement anonymisés (toutes les adresses IP et les domaines sont masqués).
Téléversement de plugin
Il peut ne pas être possible de télécharger un plugin à partir de l'interface utilisateur dans certaines situations :
- Package manquant pour gérer les fichiers compressés sur votre intégration, auquel cas vous devrez ajouter les packages nécessaires
- Navigateur Safari : le 'mode sans échec' peut vous empêcher d'ajouter un plugin. Vous devrez apporter les modifications nécessaires sur votre machine