Saltar a contenido

O9.7 - Inventario de credenciales y accesos UI

Fecha de ejecucion: 2026-06-01

Objetivo

Determinar como acceder hoy a las UIs publicadas o activas del VPS sin exponer secretos ni imprimir contraseñas.

Safe point inicial

  • git status -sb -> ## main...origin/main
  • git rev-parse HEAD -> f20c91ef8eff3c405e4620b063927393943c1e51

Alcance auditado

  • Grafana
  • Portainer
  • OpenClaw
  • Nginx Proxy Manager

Regla de esta evidencia

  • no se imprimen contraseñas
  • no se copian tokens, hashes ni secretos
  • cuando la password existe solo en forma no reversible o no documentada, se marca como desconocida
  • cuando el origen de verdad es un archivo secreto local legible por operador con root, se marca como conocida por secreto local

Resumen ejecutivo

UI URL actual Metodo de autenticacion Usuario configurado Donde vive la password o equivalente Estado actual Recuperacion
Grafana https://grafana.alpuntodeventa.com.ar/login login local usuario + password obs-admin secreto local bind-mounted desde /opt/stacks/observability/secrets/grafana_admin_password password conocida por secreto local si
Portainer https://portainer.alpuntodeventa.com.ar/ auth interna de Portainer usuario + password cuenta admin existente confirmada; nombre exacto no revalidado sin login hash dentro de portainer.db en volumen portainer_data_new password desconocida si
OpenClaw https://openclaw.alpuntodeventa.com.ar/ device auth + pairing aprobado + estado de auth persistido dispositivo oficial de Gabi aprobado para Control UI; no usa usuario/password humano clasico pairing y tokens en /opt/stacks/openclaw/config/{devices,identity,agents/...}; gateway token en .env del stack password no aplica si
Nginx Proxy Manager http://46.202.151.32:81/ login local usuario + password Admin / gabrielcanuti@gmail.com hash dentro de /docker/nginx-proxy-manager/data/database.sqlite password desconocida si

Inventario por UI

Grafana

  • URL: https://grafana.alpuntodeventa.com.ar/login
  • Evidencia: HTTP 200 en 2026-06-01 y api/health responde version 13.0.1+security-01.
  • Metodo de autenticacion: login local de Grafana con GF_USERS_ALLOW_SIGN_UP=false y GF_AUTH_ANONYMOUS_ENABLED=false.
  • Usuario configurado: obs-admin.
  • Donde se define la password: archivo secreto local /opt/stacks/observability/secrets/grafana_admin_password, montado readonly como /run/secrets/grafana_admin_password.
  • Password actual: conocida por secreto local.
  • Procedimiento de recuperacion: si se pierde control del secreto, generar nueva password fuera de Git, reemplazar solo el contenido del archivo /opt/stacks/observability/secrets/grafana_admin_password, recrear obs-grafana desde /opt/stacks/observability/docker-compose.yml y validar /login.

Portainer

  • URL: https://portainer.alpuntodeventa.com.ar/
  • Evidencia: HTTP 200 en 2026-06-01; /api/status responde 2.39.2; el endpoint /api/users/admin/check devuelve HTTP 204, confirmando que la cuenta admin ya existe.
  • Metodo de autenticacion: auth interna de Portainer por usuario/password (AuthenticationMethod=1 en /api/settings/public).
  • Usuario configurado: existe cuenta admin; el nombre exacto del login no se pudo confirmar en modo solo lectura sin autenticarse.
  • Donde se define la password: hash persistido dentro de portainer.db en el volumen Docker portainer_data_new (/var/lib/docker/volumes/portainer_data_new/_data).
  • Password actual: desconocida.
  • Procedimiento de recuperacion:
  • tomar backup del volumen portainer_data_new o del portainer-volume.tgz mas reciente;
  • detener o aislar el acceso administrativo durante la operacion;
  • ejecutar el helper oficial sobre el volumen real: docker run --rm -v portainer_data_new:/data portainer/helper-reset-password -password '<TEMP>'
  • iniciar sesion con la password temporal;
  • rotarla inmediatamente por una definitiva fuera de Git;
  • registrar solo la ubicacion del secreto, no su valor.

OpenClaw

  • URL: https://openclaw.alpuntodeventa.com.ar/
  • Evidencia: HTTP 200 en 2026-06-01; el servicio sigue healthy.
  • Metodo de autenticacion: no usa usuario/password humano clasico para la Control UI. El acceso actual depende de:
  • pairing y device auth
  • estado persistido del agente
  • token de gateway definido en el stack
  • Usuario configurado: no aplica como usuario/password clasico. La identidad operativa observada es el dispositivo oficial de Gabi aprobado para la Control UI.
  • Donde se define la password o equivalente: no hay password unica de UI. Los elementos de acceso viven en:
  • /opt/stacks/openclaw/.env para el gateway token
  • /opt/stacks/openclaw/config/devices/paired.json
  • /opt/stacks/openclaw/config/devices/pending.json
  • /opt/stacks/openclaw/config/identity/device-auth.json
  • /opt/stacks/openclaw/config/agents/main/agent/auth-profiles.json
  • /opt/stacks/openclaw/config/agents/main/agent/auth-state.json
  • Password actual: no aplica.
  • Procedimiento de recuperacion:
  • preservar backup actual de /opt/stacks/openclaw/config y .env;
  • si se perdio el browser o dispositivo aprobado, no borrar paired.json a ciegas;
  • levantar un nuevo pairing controlado desde un cliente confiable y aprobar solo el device esperado;
  • si el problema fue corrupcion de estado, restaurar los archivos de config/ desde el ultimo openclaw-stack.tgz valido;
  • revalidar openclaw health --json y acceso por la Control UI.

Nginx Proxy Manager

  • URL: http://46.202.151.32:81/
  • Evidencia: HTTP 200 local en 2026-06-01; no se observo FQDN administrativo dedicado.
  • Metodo de autenticacion: login local de NPM por usuario/password.
  • Usuario configurado: Admin con email gabrielcanuti@gmail.com.
  • Donde se define la password: hash persistido en la base SQLite /docker/nginx-proxy-manager/data/database.sqlite.
  • Password actual: desconocida.
  • Procedimiento de recuperacion:
  • tomar backup de /docker/nginx-proxy-manager/data/database.sqlite y del npm-stack.tgz vigente;
  • detener nginx-proxy-manager o programar una ventana corta;
  • generar un hash bcrypt nuevo fuera de Git;
  • actualizar solo el registro del usuario admin en database.sqlite;
  • volver a levantar el contenedor;
  • iniciar sesion con password temporal y rotarla inmediatamente.

Ubicacion de los secretos y estados criticos

UI Tipo Ubicacion real
Grafana secreto local plaintext controlado por host /opt/stacks/observability/secrets/grafana_admin_password
Portainer hash dentro de DB Bolt persistida /var/lib/docker/volumes/portainer_data_new/_data/portainer.db
OpenClaw token y estados de device/pairing/auth /opt/stacks/openclaw/.env y /opt/stacks/openclaw/config/**
NPM hash dentro de DB SQLite /docker/nginx-proxy-manager/data/database.sqlite

Riesgos y observaciones

  • NPM sigue exponiendo 81/tcp sin FQDN dedicado; eso simplifica acceso pero aumenta visibilidad del panel administrativo.
  • Grafana tiene la password en un secreto local legible por root; es mejor operativamente que dejarla en Git, pero exige disciplina de host.
  • Portainer y NPM no conservan la password actual en texto claro; hoy la recuperacion real es por reset controlado, no por lectura.
  • OpenClaw requiere pensar el acceso como identidad de dispositivo y estado persistido, no como password unica.

Evidencia usada

  • ssh openclaw-vps
  • /opt/stacks/observability/docker-compose.yml
  • /opt/stacks/observability/secrets/
  • /docker/nginx-proxy-manager/data/database.sqlite
  • /var/lib/docker/volumes/portainer_data_new/_data
  • /opt/stacks/openclaw/.env
  • /opt/stacks/openclaw/config/**
  • curl -I y endpoints publicos de Grafana, Portainer y OpenClaw

Cierre

  • secretos expuestos en este documento: no
  • contraseñas impresas: no
  • procedimientos de recuperacion documentados: si