El día 4 (ventana de las últimas cuatro horas del 27 de mayo de 2026, ~11:40–15:40 CEST en el VPS Debian de producción) se centra en un único objetivo de autenticación: que el login local acepte cualquier usuario del IDM integrado de OpenCloud (mismo uid y contraseña que en Ajustes) y siga emitiendo tokens OIDC de Dex para el proxy. Se sustituye el almacén estático de contraseñas de Dex por un conector LDAP hacia LDAPS del IDM, se corrige el certificado TLS del servicio LDAP interno y el bucle autoagents cierra la issue #1 de GitHub con pruebas automatizadas en PASS.
Resumen ejecutivo
| Área | Resultado |
|---|---|
| Dex ↔ IDM | Conector ldap → ldaps://opencloud:9235, base ou=users,o=libregraph-idm; Dex en red Docker opencloud_opencloud-net con volúmenes de config/datos para CA idm/ldap.crt. |
| OpenCloud | IDM_LDAPS_ADDR=0.0.0.0:9235 en overlay external-proxy; login.html usa connector_id=ldap; nginx y JSON de auth alineados con cloud.km0digital.com. |
| TLS IDM | Certificado regenerado con SAN DNS:opencloud (antes sólo localhost); script regenerate-opencloud-idm-ldap-cert.sh. |
| Autoagents | Tarea cerrada PASS; versión del paquete 1.0.18; login manual con dos usuarios distintos pendiente de operador (sin contraseñas en el entorno del agente). |
Repositorio: AMVARA-CONSULTING/km0-opencloud en /opt/opencloud, rama main sincronizada con origin/main al cierre de la ventana (HEAD 0a042db, árbol limpio).
Problema (GitHub #1)
El flujo híbrido ya enrutaba Google/Apple y login local por Dex, pero el conector local dependía de un password store estático en Dex: sólo funcionaba para credenciales predefinidas, no para todos los usuarios inetOrgPerson creados en el IDM de OpenCloud. El requisito era unificar credenciales con Ajustes de OpenCloud y mantener el emisor OIDC (OC_OIDC_ISSUER) que consume el proxy.
Solución — integración Dex LDAP + IDM
- Dex — conector
type: ldapendex/config.yaml; eliminado el password DB para usuarios locales. - Compose Dex — unión a
opencloud_opencloud-net; montaje deopencloud_opencloud-configyopencloud_opencloud-datapara leer CA y, víadex/docker-entrypoint.sh,idm_passworddel config montado si no hayOPENCLOUD_IDM_BIND_PWendex/.env. - Overlay OpenCloud —
IDM_LDAPS_ADDR=0.0.0.0:9235enoverrides/opencloud-compose/external-proxy/opencloud.ymlpara que Dex en la red Docker alcance LDAPS por hostnameopencloud. - UI —
host-www/opencloud-auth/login.html: botón «local» conconnector_id=ldap; rutas nginx/dex/authsin conector → selector de login (nginx/snippets/opencloud-locations.conf,conf.d/opencloud-map.conf). - Metadatos —
config-dex.json,config-local.json,local-metadata.jsoncoherentes con el dominio de producción. - Docs —
docs/runbook.md(OIDC multi-proveedor) ydex/README.md(requisitos LDAP).
Flujo de login (tras los cambios)
login.html
├── Google → Dex connector google → token OIDC → proxy OpenCloud
├── Apple → Dex connector apple → (cuando esté configurado)
└── Local → Dex connector ldap → IDM LDAPS opencloud:9235
(cualquier uid inetOrgPerson + contraseña)
Los conectores sociales siguen el mismo patrón OIDC; el local deja de ser una lista fija en Dex y pasa a ser un bind LDAP contra el directorio embebido del stack.
Fix TLS — certificado IDM LDAPS
Durante las pruebas, Dex alcanzaba opencloud:9235 pero el ldap.crt autogenerado sólo incluía localhost en el SAN → error TLS certificate is valid for localhost, not opencloud.
Corrección (0a042db): script scripts/regenerate-opencloud-idm-ldap-cert.sh que regenera el certificado con DNS:localhost,DNS:opencloud,IP:127.0.0.1 y opción --restart; documentado en runbook y README de Dex. Tarea autoagents archivada como CLOSED-1-20260527-1536-mejora-del-login-... con informe completo.
Commits en la ventana (CEST)
| Commit | Hora | Mensaje |
|---|---|---|
cf5a561 | 15:27 | feat(auth): Dex LDAP login against OpenCloud IDM for all users — 18 rutas (dex/, host-www/opencloud-auth/, nginx/, overrides, docs, sello autoagents). |
0a042db | 15:39 | fix(dex): regenerate IDM LDAP cert with opencloud SAN for Dex TLS |
Trabajo relacionado de auth en la madrugada del mismo día (fuera de esta ventana de 4 h): c905de2 (todo el login por Dex + callback OIDC) y 4fb5b8b (estado signin en localStorage con prefijo oidc.).
Autoagents — cierre de tarea
| Comprobación | Resultado |
|---|---|
SAN del cert IDM incluye opencloud | PASS |
Dex LDAP host: opencloud:9235 | PASS |
curl con connector_id=ldap → /dex/auth/ldap | PASS |
| Contraseña incorrecta → HTTP 401, bind LDAP, sin x509 en logs | PASS |
| Humo conector Google | PASS |
Login manual dos usuarios distintos → /files | NO VERIFICADO (operador) |
Cierre UTC: 2026-05-27 13:38. Artefacto: autoagents/tasks/done/2026/05/27/CLOSED-1-20260527-1536-mejora-del-login-para-que-funcione-con-t.md.
Despliegue y verificación (operador)
cd /opt/opencloud ./scripts/git-sync-main.sh ./scripts/apply-opencloud-compose-overrides.sh ./scripts/regenerate-opencloud-idm-ldap-cert.sh --restart rsync -a /opt/opencloud/host-www/opencloud-auth/ /var/www/opencloud-auth/ cd dex && docker compose up -d openssl x509 -in /var/lib/docker/volumes/opencloud_opencloud-data/_data/idm/ldap.crt \ -noout -ext subjectAltName docker exec opencloud-dex grep -A2 'type: ldap' /etc/dex/config.yaml curl -sI https://cloud.km0digital.com/login.html
Manual: ventana privada → login.html → login local con dos uid distintos de OpenCloud; se espera /oidc-callback.html y luego /files sin errores JWKS ni /graph/v1.0/me 500.
Documentación relacionada
/opt/opencloud/docs/km0-opencloud-resumen.red— resumen del stack/opt/opencloud/dex/README.md— operación Dex y LDAP/opt/opencloud/docs/runbook.md— runbook diario/root/redminenotes/km0-opencloud-12h-summary-20260527.red— ventana de 12 h (bootstrap, bucle autoagents, sync Redmine)
Las contraseñas de usuarios y secretos de bind IDM no forman parte de esta entrada; el happy-path con dos cuentas reales queda como verificación humana en producción.