diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b1b634..a2e161e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,11 @@ orchestration code; see each submodule's own `CHANGELOG.md` [sso-manager-node](https://github.com/theta42/sso-manager-node/blob/master/CHANGELOG.md)) for what changed inside the apps it composes. +## [v1.39.0] - 2026-08-05 + +### Fixed +- **Plain LDAP (389) now reachable from the host** — `docker-compose.yml` published only LDAPS (636); plain LDAP (389) was deliberately not mapped, so the stack host's own enrollment (`setup.sh` → ldap-client, which configures sssd against `ldap://localhost:389` and `ldaps://localhost:636`) could not reach the directory over loopback. Both 389 and 636 are now published to the host (bind 0.0.0.0; `LDAP_BIND`/`LDAPS_BIND=127.0.0.1` to lock to the host only). + ## [v1.38.0] - 2026-08-04 ### Fixed diff --git a/README.md b/README.md index 09bf931..3f9fc48 100644 --- a/README.md +++ b/README.md @@ -129,12 +129,15 @@ see browser warnings.) Optional extra ports (only if you need them): - **4443** — alternate HTTPS listener (e.g. if 443 is taken by something else). -- **636** (LDAPS) — for direct-LDAP clients on other machines (Linux hosts - via PAM/SSSD, LDAP-native apps). The proxy itself reaches LDAP over the - internal Docker network, so you do **not** need to expose 636 for the stack - to work. - **Do not forward 636 to the public internet.** If you need LAN clients to bind - LDAP, set `CFG_LDAPS_HOST=ldap.internal.example.com` (or `sso-manager` for +- **389** (LDAP) + **636** (LDAPS) — direct-LDAP access. The stack host's **own** + enrollment (`setup.sh` → ldap-client) configures its sssd against + `ldap://localhost:389` / `ldaps://localhost:636`, so both ports are published + to the host by default (bind 0.0.0.0; set `LDAP_BIND`/`LDAPS_BIND=127.0.0.1` to + lock to the host). LAN clients (Linux hosts via PAM/SSSD, LDAP-native apps) can + bind over either; the proxy itself reaches LDAP over the internal Docker + network and doesn't need them. + **Do not forward 389/636 to the public internet.** If you need LAN clients to + bind LDAP, set `CFG_LDAPS_HOST=ldap.internal.example.com` (or `sso-manager` for same-host Docker clients) in `setup.env` and use an internal DNS record / cert SAN. The default shows the public SSO hostname, which implies a public route. diff --git a/docker-compose.yml b/docker-compose.yml index fe5ff0d..9d8bf73 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -52,12 +52,16 @@ services: # the UI is reachable on the LAN during setup). Set SSO_BIND=127.0.0.1 to # lock it to localhost once the proxy fronts it at https://. - "${SSO_BIND:-0.0.0.0}:${SSO_PORT:-3001}:3001" - # LDAPS for EXTERNAL direct-LDAP clients (legacy apps). The proxy itself - # reaches LDAPS over theta-net (sso-manager:636) without this host mapping. - # Prefer an internal-only hostname (set CFG_LDAPS_HOST in setup.env / ldapsHost - # in sso-secrets.js) and do NOT forward 636 to the public internet. - - "${LDAPS_PORT:-636}:636" - # Plain LDAP (389) is NOT mapped — direct-LDAP clients should use LDAPS. + # LDAPS (636) + plain LDAP (389) for direct-LDAP clients AND for the stack + # host's OWN enrollment: setup.sh / ldap-client configure the host's sssd + # against ldap://localhost and ldaps://localhost, and the LDAP server is + # co-located on this host, so BOTH ports must be reachable from the host + # over loopback — not only over the docker network. Bind 0.0.0.0 (default) + # so LAN clients can use the host's local IP too; set LDAP_BIND and/or + # LDAPS_BIND=127.0.0.1 to lock either to the host only. Prefer an internal + # hostname (CFG_LDAPS_HOST) and do NOT forward 389/636 to the public internet. + - "${LDAP_BIND:-0.0.0.0}:${LDAP_PORT:-389}:389" + - "${LDAPS_BIND:-0.0.0.0}:${LDAPS_PORT:-636}:636" environment: # Config (LDAP, OAuth, SMTP, ...) is loaded by @simpleworkjs/conf from # ./config/sso-secrets.js (see volumes), then @simpleworkjs/bao-conf