mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-08-08 05:18:49 +03:00
fix(webui): require proxy-generated auth assertions
This commit is contained in:
+5
-3
@@ -116,11 +116,13 @@ This is two-part authorization: a trusted direct loopback peer **and** a
|
||||
non-empty Cloudflare Access assertion. A trusted CIDR alone is not a bypass.
|
||||
For this flow `/webui/bootstrap` returns connection metadata without a
|
||||
bootstrap token or REST API token; the proxy assertion authorizes the WebSocket
|
||||
handshake and REST requests directly. Nanobot trusts the assertion but does
|
||||
handshake and REST requests directly. The assertion header must be generated
|
||||
by Cloudflare Access after authentication; routing/client metadata headers such
|
||||
as `Host`, `Forwarded`, `X-Forwarded-*`, `X-Real-IP`, and `CF-Connecting-IP`
|
||||
are rejected as `assertionHeader` values. Nanobot trusts the assertion but does
|
||||
not cryptographically validate the JWT, so configure the tunnel and Access
|
||||
policy carefully and do not expose the nanobot listener directly to untrusted
|
||||
clients. Forwarded client headers such as `X-Forwarded-For` do not establish
|
||||
proxy trust.
|
||||
clients. Forwarded client headers do not establish proxy trust.
|
||||
|
||||
### Docker Compose
|
||||
|
||||
|
||||
+7
-1
@@ -228,7 +228,7 @@ All fields go under `channels.websocket` in `config.json`.
|
||||
| `tokenIssueSecret` | string | `""` | Secret required to obtain tokens via the issue endpoint. If empty, any client can obtain WebSocket connection tokens from `tokenIssuePath` (logged as a warning). `/webui/bootstrap` issues tokens for local/secret-authenticated requests; trusted-proxy requests intentionally receive no bootstrap or API token. |
|
||||
| `trustedProxyAuth` | object or `null` | `null` | Optional two-part no-token authorization for a directly connected upstream proxy. Both `trustedPeerCidrs` and a non-empty `assertionHeader` value must match; a CIDR alone never authorizes bootstrap or WebSocket/API access. |
|
||||
| `trustedProxyAuth.trustedPeerCidrs` | list of CIDR strings | — | Direct TCP peer networks that may present the assertion. IPv4, IPv6, and IPv4-mapped IPv6 peers are supported; universal CIDRs (`0.0.0.0/0`, `::/0`) are rejected. |
|
||||
| `trustedProxyAuth.assertionHeader` | string | — | HTTP header whose non-empty value proves the upstream proxy authenticated the request. Nanobot trusts this value but does not cryptographically validate it. |
|
||||
| `trustedProxyAuth.assertionHeader` | string | — | Header injected by the identity-aware proxy after successful authentication. Routing/client metadata headers (`Host`, `Forwarded`, `X-Forwarded-*`, `X-Real-IP`, `CF-Connecting-IP`) are rejected; nanobot trusts the remaining header's non-empty value but does not cryptographically validate it. |
|
||||
| `tokenTtlS` | int | `300` | Time-to-live for issued tokens in seconds (30 – 86,400). |
|
||||
|
||||
### Access Control
|
||||
@@ -296,6 +296,12 @@ assertion supplied by the explicitly trusted peer, but does not cryptographicall
|
||||
validate or interpret the JWT/assertion contents. Do not enable this option if
|
||||
untrusted clients can connect directly to the nanobot listener.
|
||||
|
||||
The configured assertion header must be a proxy-generated authentication
|
||||
assertion, not a routing or client metadata header. Headers such as `Host`,
|
||||
`Forwarded`, `X-Forwarded-*`, `X-Real-IP`, and `CF-Connecting-IP` are rejected
|
||||
by configuration; use the identity provider's post-authentication assertion
|
||||
header instead (for example, `Cf-Access-Jwt-Assertion`).
|
||||
|
||||
For example, a local Cloudflare Tunnel with Cloudflare Access can validate the
|
||||
user at the edge and forward the resulting `Cf-Access-Jwt-Assertion`:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user