docs(auth): address authentication guide review
This commit is contained in:
@@ -1,37 +1,50 @@
|
||||
# Put ThothII behind Caddy
|
||||
|
||||
This example assumes Caddy runs on the Linux host, ThothII `frontend` listens only on
|
||||
`127.0.0.1:8080`, public DNS points to the host, and a separate authentication gateway validates
|
||||
the user's real login/session. Replace the domain and auth-gateway address.
|
||||
Choose exactly one authentication mode. Direct ThothII-managed OIDC and deprecated upstream
|
||||
authentication are mutually exclusive proxy contracts; never combine their directives.
|
||||
|
||||
For ThothII-managed generic OIDC, preserve the configured public origin and the exact callback
|
||||
`/api/auth/oidc/callback`; the browser and API remain one same-origin surface. Run
|
||||
`tht auth check` and workspace Test after proxy changes.
|
||||
## Direct ThothII-managed OIDC
|
||||
|
||||
## Trust boundary
|
||||
Use this mode when `auth.yaml` has `mode: oidc`. Caddy terminates TLS and proxies every request to
|
||||
`frontend`; ThothII performs login, callback validation, session creation, and authorization.
|
||||
Caddy must not apply `forward_auth` or another external authentication gateway.
|
||||
|
||||
Caddy is the only public listener. It provides automatic HTTPS, performs `forward_auth`, and
|
||||
proxies only to `frontend`; frontend then sends same-origin `/api` requests to private `core`.
|
||||
Never send the public reverse proxy to core port 8787.
|
||||
|
||||
The authentication gateway must return 2xx only after validating a real credential or session.
|
||||
The ordered `route` below deletes every public/private Thoth identity request header before auth.
|
||||
Only on auth success does `copy_headers` rename normalized response claims into the private
|
||||
`X-Thoth-Trusted-*` headers consumed by frontend.
|
||||
Forwarding identity headers alone does not authenticate a user.
|
||||
|
||||
Do not replace the authentication gateway with static `header_up` values, a network allowlist, or
|
||||
browser-provided identity. The admin claim must come from reviewed identity-provider authorization.
|
||||
|
||||
## Example configuration
|
||||
|
||||
Save a reviewed site block in the Caddyfile. Caddy obtains and renews TLS certificates for the real
|
||||
DNS name; use the organization's approved ACME issuer or certificate policy.
|
||||
The public `/api/auth/oidc/login` and `/api/auth/oidc/callback` paths pass unchanged through the
|
||||
same proxy as the rest of `/api`. The configured `publicUrl` must match the browser origin.
|
||||
|
||||
```caddyfile
|
||||
thoth.example.com {
|
||||
thoth.example.invalid {
|
||||
reverse_proxy 127.0.0.1:8080 {
|
||||
# No URI rewrite: OIDC login and callback paths reach frontend unchanged.
|
||||
flush_interval -1
|
||||
header_up Host {host}
|
||||
header_up X-Forwarded-Proto https
|
||||
header_up X-Forwarded-Host {host}
|
||||
}
|
||||
|
||||
log {
|
||||
output file /var/log/caddy/thoth-access.log
|
||||
format json
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
After reload, run Workspace Validate for static validation, `tht auth check` for live,
|
||||
non-interactive authentication diagnosis, and then Workspace Test for aggregate live validation.
|
||||
|
||||
## Deprecated upstream migration mode
|
||||
|
||||
Use this section only while the installation explicitly uses deprecated `upstream` mode. Do not
|
||||
use it with `mode: oidc` or `mode: local`. Here an external authentication gateway owns login and
|
||||
Caddy applies `forward_auth` before forwarding normalized private identity headers to `frontend`.
|
||||
|
||||
Forwarding identity headers alone does not authenticate a user. The authentication gateway returns
|
||||
2xx only after validating its own credential or session. Clear browser-supplied public and trusted
|
||||
headers before the subrequest, and map identity only from the successful auth response.
|
||||
|
||||
```caddyfile
|
||||
thoth.example.invalid {
|
||||
route {
|
||||
# Remove untrusted browser claims before the auth subrequest.
|
||||
request_header -X-Authenticated-User
|
||||
request_header -X-Thoth-Principal-Issuer
|
||||
request_header -X-Thoth-Principal-Subject
|
||||
@@ -53,27 +66,23 @@ thoth.example.com {
|
||||
}
|
||||
|
||||
reverse_proxy 127.0.0.1:8080 {
|
||||
# Disable response batching so SSE reaches the browser immediately.
|
||||
flush_interval -1
|
||||
header_up Host {host}
|
||||
header_up X-Forwarded-Proto https
|
||||
}
|
||||
}
|
||||
|
||||
log {
|
||||
output file /var/log/caddy/thoth-access.log
|
||||
format json
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Configure log processing to remove cookies, authorization data, query strings, and identity
|
||||
headers. Keep Caddy's private keys and state outside the ThothII source/operator directories.
|
||||
## Trust boundary
|
||||
|
||||
Caddy is the only public listener and proxies only to loopback `frontend`, never directly to
|
||||
`core`. Configure access logs to omit cookies, authorization data, query strings, and identity
|
||||
headers. Keep Caddy keys and state outside ThothII source and operator directories.
|
||||
|
||||
## Validate and reload
|
||||
|
||||
Keep the public firewall rule closed while validating. Confirm ThothII responds only on loopback,
|
||||
format a review copy if desired, validate the active file, then reload through the service manager:
|
||||
Keep the public firewall closed while validating:
|
||||
|
||||
```sh
|
||||
curl --fail http://127.0.0.1:8080/health
|
||||
@@ -81,21 +90,9 @@ caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
|
||||
sudo systemctl reload caddy
|
||||
```
|
||||
|
||||
Do not remove `forward_auth` if validation fails. Correct the Caddy version, adapter syntax,
|
||||
authentication upstream, DNS, or certificate policy instead.
|
||||
|
||||
## Test authentication and SSE
|
||||
|
||||
Open the firewall only after all of these pass:
|
||||
|
||||
1. An unauthenticated HTTPS request is redirected to login or returns 401/403.
|
||||
2. Supplying forged `X-Thoth-Principal-*`, `X-Thoth-Is-Admin`, or `X-Thoth-Trusted-*` request
|
||||
headers does not grant access.
|
||||
3. A real authenticated non-admin can use the application but cannot open Pi Management.
|
||||
4. A real authenticated admin can use Pi Management.
|
||||
5. A browser session receives live model updates without batching; a protected
|
||||
`curl --no-buffer` request using a real short-lived login cookie is also acceptable. Delete the
|
||||
cookie jar immediately afterward.
|
||||
|
||||
Re-run these checks after changing the identity provider, authentication gateway, Caddy, or
|
||||
ThothII release.
|
||||
For direct OIDC, verify the login path redirects to the configured provider, the callback reaches
|
||||
ThothII unchanged, forged identity headers grant nothing, and SSE is unbuffered. For deprecated
|
||||
upstream mode, additionally verify the external gateway rejects unauthenticated traffic and only
|
||||
its 2xx response can create trusted identity headers.
|
||||
|
||||
Reference in New Issue
Block a user