Policy rulings (#942): unique passwords, Cloudron-only SSO accounts, no reachableceo credentials, TOTP seeds MUST be captured to the vault. Cloudron admin API wrapper, cookie-jar OIDC login, RFC-6238-tested TOTP helper, per-system SSO/API references, incident log.
3.9 KiB
3.9 KiB
Per-system SSO + API key details (verified 2026-09-07/08 unless noted)
GLPI (cmdb.knownelement.com) — SSO VERIFIED WORKING
- SSO: "Login with KNEL Cloud" = plugin route
/plugins/singlesignon/front/callback.php/provider/1?remember=1→ Cloudron OIDC → auto-provision. - The login page defaults to whichever tab was last toggled ("Use GLPI login
form" / "Use Single Sign-on"); a hidden
noAUTO=1input forces the local form — irrelevant under Cloudron-only policy, useful to recognize. - API: GLPI 11 is OAuth/token-based. The legacy REST at
/apirest.php/initSessionexists: password login is DISABLED (400); user_token auth exists but the tokens increds/glpi/creds/mglpiare STALE (401 ERROR_GLPI_LOGIN_USER_TOKEN). The app token increds/glpipassword field IS accepted (used asApp-Tokenheader). - Per-user API token: My account (self-service) after SSO provisioning. Pair
with the app token:
GET /apirest.php/initSessionwith headersApp-Token: <app>+Authorization: user_token <user>. - Local web login as
glpisuper-admin hits a 6-digit TOTP at/MFA/Promptwhose secret is not stored anywhere — do not rely on the admin UI; the SSO path makes it unnecessary.
Gitea (git.knownelement.com)
- SSO:
/user/oauth2/cloudron(button "Sign in with …" on the login page). - Standalone install behind nginx on the shared box — local accounts exist from the August batch; Cloudron-only policy means new identities use SSO and legacy ones migrate.
- API: tokens via
POST /api/v1/users/<login>/tokensREQUIRE basic auth AS that user (admin tokens cannot mint for others; there is no/admin/users/<name>/tokensroute;Sudoheader needs a real site admin). - Token auth against
/api/v1/user: the JSON haslogin; admin-ness shows insite_admin(absent = not admin; do not misread null as false). - KNOWN BROKEN (2026-09-07/08): receive-pack 500s during the box incident — RESOLVED after the 09-08 repair (pushes verified). If pushes 500 again, check the shared box first (see incident-log.md).
Discourse (community.turnsys.com)
- SSO:
/auth/openid_connect— a bare GET returns 403 (CSRF-gated); that is NORMAL and means the route exists. Complete the flow from the login page button or with a session + CSRF token. - The login page is an Ember SPA: server-rendered HTML shows no SSO markers, which fooled one audit (2026-09-07) into "no SSO" — wrong. Check routes, not page source.
- API: user API keys (User-Api-Key header) minted via the user-approval flow;
admin Api-Key + Api-Username impersonation needs an admin key. The vault's
creds/discourseNOTE says its keys are NOT admin (they are also not hex — do not assume key format).creds/vptechops-discourseholds a WORKING user key (uservptechopsvptechops) — #933's "dead key" note is wrong.
Redmine (projects.knownelement.com)
- SSO: "Continue with KNEL Cloud" button POSTs/GETs
/oauth. KNOWN BROKEN:/oauth302-bounces straight back to /login with no provider redirect — verified 2026-09-07 AND 2026-09-08 (IdP healthy both times), so it is a Redmine plugin configuration issue, NOT the IdP. Retest before relying on it; until fixed, Redmine accounts cannot be created via SSO. - API keys:
GET /users/current.json(session or basic auth) returns the user'sapi_key; X-Redmine-API-Key header for calls. Vault convention: the API key is stored in the item's password field. - Admin surface:
/users.jsonlists users (admin only — 403 otherwise). Every admin candidate tested in the vault so far is NON-admin (they are all the founder's personal accounts anyway — RESTRICTED).
Shared infrastructure hazard
Gitea, Redmine, Discourse, GLPI, the pwvault, and the my. vhost all run on ONE box (152.53.37.179 = mail.knownelement.com). Symptoms there cluster: when several systems misbehave at once, suspect the box (see incident-log.md), file/update one ticket, and do not burn hours debugging four clients.