Saltar a contenido

Solución de problemas

Panel de BunkerWeb

Si no puedes resolver tu problema, puedes contactarnos directamente a través de nuestro panel. Esto centraliza todas las solicitudes relacionadas con la solución BunkerWeb.

Registros

Al solucionar problemas, los registros son tus mejores amigos. Hacemos nuestro mejor esfuerzo para proporcionar registros fáciles de usar para ayudarte a entender lo que está sucediendo.

Ten en cuenta que puedes establecer el LOG_LEVEL en info (predeterminado: notice) para aumentar la verbosidad de BunkerWeb.

Aquí te mostramos cómo puedes acceder a los registros, dependiendo de tu integración:

Listar contenedores

Para listar los contenedores en ejecución, puedes usar el siguiente comando:

docker ps

Puedes usar el comando docker logs (reemplaza bunkerweb con el nombre de tu contenedor):

docker logs bunkerweb

Aquí está el equivalente de docker-compose (reemplaza bunkerweb con el nombre de los servicios declarados en el archivo docker-compose.yml):

docker-compose logs bunkerweb

Listar contenedores

Para listar los contenedores en ejecución, puedes usar el siguiente comando:

docker ps

Puedes usar el comando docker logs (reemplaza bunkerweb y bw-autoconf con el nombre de tus contenedores):

docker logs bunkerweb
docker logs bw-autoconf

Aquí está el equivalente de docker-compose (reemplaza bunkerweb y bw-autoconf con el nombre de los servicios declarados en el archivo docker-compose.yml):

docker-compose logs bunkerweb
docker-compose logs bw-autoconf

Nombre del contenedor

El nombre del contenedor predeterminado para la imagen Todo en uno es bunkerweb-aio. Si has usado un nombre diferente, por favor ajusta el comando en consecuencia.

Puedes usar el comando docker logs:

docker logs bunkerweb-aio

Obsoleto

La integración de Swarm está obsoleta y se eliminará en una futura versión. Por favor, considera usar la integración de Kubernetes en su lugar.

Puedes encontrar más información en la documentación de la integración de Swarm.

Listar servicios

Para listar los servicios, puedes usar el siguiente comando:

docker service ls

Puedes usar el comando docker service logs (reemplaza bunkerweb y bw-autoconf con el nombre de tus servicios):

docker service logs bunkerweb
docker service logs bw-autoconf

Listar pods

Para listar los pods, puedes usar el siguiente comando:

kubectl get pods

Puedes usar el comando kubectl logs (reemplaza bunkerweb y bunkerweb-controler con el nombre de tus pods):

kubectl logs bunkerweb
kubectl logs bunkerweb-controler

Para errores relacionados con los servicios de BunkerWeb (p. ej., que no se inician), puedes usar journalctl:

journalctl -u bunkerweb --no-pager

Los registros comunes se encuentran dentro del directorio /var/log/bunkerweb:

cat /var/log/bunkerweb/error.log
cat /var/log/bunkerweb/access.log

Permisos

No olvides que BunkerWeb se ejecuta como un usuario sin privilegios por razones de seguridad obvias. Verifica dos veces los permisos de los archivos y carpetas utilizados por BunkerWeb, especialmente si usas configuraciones personalizadas (más información aquí). Necesitarás establecer al menos derechos RW en los archivos y RWX en las carpetas.

Desbloqueo de IP

Puedes desbloquear manualmente una IP, lo cual es útil al realizar pruebas para que puedas contactar la API interna de BunkerWeb (reemplaza 1.2.3.4 con la dirección IP a desbloquear):

Puedes usar el comando docker exec (reemplaza bw-scheduler con el nombre de tu contenedor):

docker exec bw-scheduler bwcli unban 1.2.3.4

Aquí está el equivalente de docker-compose (reemplaza bw-scheduler con el nombre de los servicios declarados en el archivo docker-compose.yml):

docker-compose exec bw-scheduler bwcli unban 1.2.3.4

Nombre del contenedor

El nombre del contenedor predeterminado para la imagen Todo en uno es bunkerweb-aio. Si has usado un nombre diferente, por favor ajusta el comando en consecuencia.

Puedes usar el comando docker exec:

docker exec bunkerweb-aio bwcli unban 1.2.3.4

Obsoleto

La integración de Swarm está obsoleta y se eliminará en una futura versión. Por favor, considera usar la integración de Kubernetes en su lugar.

Puedes encontrar más información en la documentación de la integración de Swarm.

Puedes usar el comando docker exec (reemplaza bw-scheduler con el nombre de tu servicio):

docker exec $(docker ps -q -f name=bw-scheduler) bwcli unban 1.2.3.4

Puedes usar el comando kubectl exec (reemplaza bunkerweb-scheduler con el nombre de tu pod):

kubectl exec bunkerweb-scheduler bwcli unban 1.2.3.4

Puedes usar el comando bwcli (como root):

sudo bwcli unban 1.2.3.4

Falsos positivos

Modo de solo detección

Para fines de depuración/prueba, puedes configurar BunkerWeb en modo de solo detección para que no bloquee las solicitudes y actúe como un proxy inverso clásico.

ModSecurity

La configuración predeterminada de ModSecurity de BunkerWeb es cargar el Core Rule Set en modo de puntuación de anomalías con un nivel de paranoia (PL) de 1:

  • Cada regla que coincida aumentará una puntuación de anomalía (por lo que muchas reglas pueden coincidir con una sola solicitud)
  • PL1 incluye reglas con menos posibilidades de falsos positivos (pero menos seguridad que PL4)
  • el umbral predeterminado para la puntuación de anomalía es 5 para las solicitudes y 4 para las respuestas

Tomemos los siguientes registros como ejemplo de una detección de ModSecurity usando la configuración predeterminada (formateado para una mejor legibilidad):

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"

Como podemos ver, hay 3 registros diferentes:

  1. La regla 930120 coincidió
  2. La regla 932160 coincidió
  3. Acceso denegado (regla 949110)

Una cosa importante a entender es que la regla 949110 no es una regla "real": es la que denegará la solicitud porque se alcanza el umbral de anomalía (que es 10 en este ejemplo). ¡Nunca deberías eliminar la regla 949110!

Si se trata de un falso positivo, deberías centrarte en las reglas 930120 y 932160. El ajuste de ModSecurity y/o CRS está fuera del alcance de esta documentación, pero no olvides que puedes aplicar configuraciones personalizadas antes y después de que se cargue el CRS (más información aquí).

Mal comportamiento

Un caso común de falso positivo es cuando el cliente es baneado debido a la característica de "mal comportamiento", lo que significa que se generaron demasiados códigos de estado HTTP sospechosos en un período de tiempo (más información aquí). Deberías empezar por revisar la configuración y luego editarla de acuerdo a tu(s) aplicación(es) web, como eliminar un código HTTP sospechoso, disminuir el tiempo de conteo, aumentar el umbral, ...

Lista blanca

Si tienes bots (o administradores) que necesitan acceder a tu sitio web, la forma recomendada de evitar cualquier falso positivo es incluirlos en la lista blanca usando la característica de lista blanca. No recomendamos usar las configuraciones WHITELIST_URI* o WHITELIST_USER_AGENT* a menos que se establezcan en valores secretos e impredecibles. Los casos de uso comunes son:

  • Bot de comprobación de estado / estado
  • Devolución de llamada como IPN o webhook
  • Rastreador de redes sociales

Errores comunes

El upstream envió una cabecera demasiado grande

Si ves el siguiente error upstream sent too big header while reading response header from upstream en los registros, necesitarás ajustar los diversos tamaños de los búferes del proxy usando las siguientes configuraciones:

  • PROXY_BUFFERS
  • PROXY_BUFFER_SIZE
  • PROXY_BUSY_BUFFERS_SIZE

No se pudo construir el hash de server_names

Si ves el siguiente error could not build server_names_hash, you should increase server_names_hash_bucket_size en los registros, necesitarás ajustar la configuración SERVER_NAMES_HASH_BUCKET_SIZE.

Zona horaria

Cuando se utilizan integraciones basadas en contenedores, la zona horaria del contenedor puede no coincidir con la de la máquina anfitriona. Para resolver esto, puedes establecer la variable de entorno TZ a la zona horaria de tu elección en tus contenedores (p. ej., TZ=Europe/Paris). Encontrarás la lista de identificadores de zona horaria aquí.

Interfaz de usuario web

En caso de que hayas olvidado tus credenciales de la interfaz de usuario o estés experimentando problemas con la 2FA, puedes conectarte a la base de datos para recuperar el acceso.

Acceder a la base de datos

Instalar SQLite (Debian/Ubuntu):

sudo apt install sqlite3

Instalar SQLite (Fedora/RedHat):

sudo dnf install sqlite

Obtén un shell en tu contenedor del programador:

Argumentos de Docker

  • la opción -u 0 es para ejecutar el comando como root (obligatorio)
  • las opciones -it son para ejecutar el comando interactivamente (obligatorio)
  • <bunkerweb_scheduler_container>: el nombre o ID de tu contenedor del programador
docker exec -u 0 -it <bunkerweb_scheduler_container> bash

Instala SQLite:

apk add sqlite

Obtén un shell en tu contenedor Todo en uno:

Argumentos de Docker

  • la opción -u 0 es para ejecutar el comando como root (obligatorio).
  • las opciones -it son para ejecutar el comando interactivamente (obligatorio).
  • bunkerweb-aio es el nombre del contenedor predeterminado; ajústalo si has usado un nombre personalizado.
docker exec -u 0 -it bunkerweb-aio bash

Accede a tu base de datos:

Ruta de la base de datos

Asumimos que estás utilizando la ruta de la base de datos predeterminada. Si estás utilizando una ruta personalizada, necesitarás adaptar el comando. Para Todo en uno, asumimos que la base de datos es db.sqlite3 ubicada en el volumen persistente /data (/data/db.sqlite3).

sqlite3 /var/lib/bunkerweb/db.sqlite3

Deberías ver algo como esto:

SQLite version <VER> <DATE>
Enter ".help" for usage hints.
sqlite>

Solo MariaDB / MySQL

Los siguientes pasos solo son válidos para bases de datos MariaDB / MySQL. Si estás utilizando otra base de datos, por favor consulta la documentación de tu base de datos.

Credenciales y nombre de la base de datos

Necesitarás usar las mismas credenciales y el nombre de la base de datos utilizados en la configuración DATABASE_URI.

Accede a tu base de datos local:

mysql -u <user> -p <database>

Luego introduce la contraseña del usuario de la base de datos y deberías poder acceder a tu base de datos.

Accede a tu contenedor de base de datos:

Argumentos de Docker

  • la opción -u 0 es para ejecutar el comando como root (obligatorio)
  • las opciones -it son para ejecutar el comando interactivamente (obligatorio)
  • <bunkerweb_db_container>: el nombre o ID de tu contenedor de base de datos
  • <user>: el usuario de la base de datos
  • <database>: el nombre de la base de datos
docker exec -u 0 -it <bunkerweb_db_container> mysql -u <user> -p <database>

Luego introduce la contraseña del usuario de la base de datos y deberías poder acceder a tu base de datos.

La imagen Todo en uno no incluye un servidor MariaDB/MySQL. Si has configurado la AIO para usar una base de datos externa MariaDB/MySQL (estableciendo la variable de entorno DATABASE_URI), deberías conectarte a esa base de datos directamente usando las herramientas de cliente de MySQL estándar.

El método de conexión sería similar a la pestaña "Linux" (si te conectas desde el host donde se ejecuta la AIO u otra máquina) o ejecutando un cliente de MySQL en un contenedor de Docker separado si se prefiere, apuntando al host y las credenciales de tu base de datos externa.

Solo PostgreSQL

Los siguientes pasos solo son válidos para bases de datos PostgreSQL. Si estás utilizando otra base de datos, por favor consulta la documentación de tu base de datos.

Credenciales, host y nombre de la base de datos

Necesitarás usar las mismas credenciales (usuario/contraseña), host y nombre de la base de datos utilizados en la configuración DATABASE_URI.

Accede a tu base de datos local:

psql -U <user> -d <database>

Si tu base de datos está en otro host, incluye el nombre de host/IP y el puerto:

psql -h <host> -p 5432 -U <user> -d <database>

Luego introduce la contraseña del usuario de la base de datos y deberías poder acceder a tu base de datos.

Accede a tu contenedor de base de datos:

Argumentos de Docker

  • la opción -u 0 es para ejecutar el comando como root (obligatorio)
  • las opciones -it son para ejecutar el comando interactivamente (obligatorio)
  • <bunkerweb_db_container>: el nombre o ID de tu contenedor de base de datos
  • <user>: el usuario de la base de datos
  • <database>: el nombre de la base de datos
docker exec -u 0 -it <bunkerweb_db_container> psql -U <user> -d <database>

Si la base de datos está alojada en otro lugar, añade las opciones -h <host> y -p 5432 en consecuencia.

La imagen Todo en uno no incluye un servidor PostgreSQL. Si has configurado la AIO para usar una base de datos externa PostgreSQL (estableciendo la variable de entorno DATABASE_URI), deberías conectarte a esa base de datos directamente usando las herramientas de cliente de PostgreSQL estándar.

El método de conexión sería similar a la pestaña "Linux" (si te conectas desde el host donde se ejecuta la AIO u otra máquina) o ejecutando un cliente de PostgreSQL en un contenedor de Docker separado si se prefiere, apuntando al host y las credenciales de tu base de datos externa.

Acciones de solución de problemas

Esquema de las tablas

El esquema de la tabla bw_ui_users es el siguiente:

Campo Tipo Nulo Clave Predeterminado Extra
username varchar(256) NO PRI NULL
email 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

Ejecuta el siguiente comando para extraer datos de la tabla bw_ui_users:

SELECT * FROM bw_ui_users;

Deberías ver algo como esto:

username email password method admin theme totp_secret creation_date update_date
*** *** *** manual 1 light *** *** ***

Primero necesitas hashear la nueva contraseña usando el algoritmo bcrypt.

Instala la librería de Python bcrypt:

pip install bcrypt

Genera tu hash (reemplaza mypassword con tu propia contraseña):

python3 -c 'from bcrypt import hashpw, gensalt ; print(hashpw(b"""mypassword""", gensalt(rounds=10)).decode("utf-8"))'

Puedes actualizar tu nombre de usuario / contraseña ejecutando este comando:

UPDATE bw_ui_users SET password = '<password_hash>' WHERE admin = 1;

Si vuelves a comprobar tu tabla bw_ui_users después de este comando:

SELECT * FROM bw_ui_users WHERE admin = 1;

Deberías ver algo como esto:

username email password method admin theme totp_secret creation_date update_date
*** *** *** manual 1 light *** *** ***

Ahora deberías poder usar las nuevas credenciales para iniciar sesión en la interfaz de usuario web.

Puedes desactivar la 2FA ejecutando este comando:

UPDATE bw_ui_users SET totp_secret = NULL WHERE admin = 1;

Si vuelves a comprobar tu tabla bw_ui_users siguiendo este comando:

SELECT * FROM bw_ui_users WHERE admin = 1;

Deberías ver algo como esto:

username email password method admin theme totp_secret creation_date update_date
*** *** *** manual 1 light NULL *** ***

Ahora deberías poder iniciar sesión en la interfaz de usuario web solo con tu nombre de usuario y contraseña sin 2FA.

Los códigos de recuperación se pueden actualizar en tu página de perfil de la interfaz de usuario web en la pestaña Seguridad.

Usa la página de Soporte en la Interfaz de Usuario Web para recopilar rápidamente la configuración y los registros para la solución de problemas.

  • Abre la Interfaz de Usuario Web y ve a la página de Soporte.
  • Elige el alcance: exporta la configuración Global o selecciona un Servicio específico.
  • Haz clic para descargar el archivo de configuración para el alcance elegido.
  • Opcionalmente descarga los registros: los registros exportados se anonimizan automáticamente (todas las direcciones IP y dominios están enmascarados).

Cargar plugin

Puede que no sea posible cargar un plugin desde la interfaz de usuario en ciertas situaciones:

  • Falta de un paquete para gestionar archivos comprimidos en tu integración, en cuyo caso necesitarás añadir los paquetes necesarios
  • Navegador Safari: el 'modo seguro' puede impedirte añadir un plugin. Necesitarás hacer los cambios necesarios en tu máquina