-
Notifications
You must be signed in to change notification settings - Fork 0
fix(auth): reject spoofed Tailscale identity on management ingress #413
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: Dev
Are you sure you want to change the base?
Changes from all commits
d35592b
71c57ea
d560ac6
08ada6f
ec51e42
e25b653
80fff9a
fc4de77
c7d8407
54e2274
2c4dca1
a34e8b7
ebb4d55
682112e
af6113a
847f4f1
ac78647
aaa9eaf
35ff3a4
3320614
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -275,10 +275,8 @@ intended account and workload. | |
| | --- | --- | --- | --- | | ||
| | `hub.managementPublicOrigin` | string | unset | The canonical browser-reachable management origin a hub advertises, for example the HTTPS origin Tailscale Serve prints. It is what `/readyz` reports as `managementUrl` while `runtimeRole` is `hub`; with it unset the hub falls back to whatever origin each request arrived on, so a client behind a different frontend can be handed an address it cannot reach. | | ||
| | `hub.managementIngress` | `{enabled:false}` or `{enabled:true, port}` | `{enabled:false}` | An extra management-only listener for a local HTTPS frontend. The hostname is not configurable: when enabled the socket always binds `127.0.0.1`, and only GUI, session-bootstrap, and management API routes are admitted. Data-plane routes are rejected before dispatch. | | ||
| | `remoteGui.allowedTailscaleUsers` | string[] | `[]` (empty — nobody) | Exact Tailscale login identities allowed to be issued an automatic remote GUI session. The `Tailscale-User-Login` header is trusted **only** on the separate management ingress; an empty list means no remote identity can mint a session, which is the safe default rather than an oversight. Identities are compared exactly, so a typo silently denies access. | | ||
| | `remoteGui.allowedTailscaleUsers` | string[] | `[]` | Retained for configuration compatibility. The loopback TCP management ingress does not trust `Tailscale-User-Login`, because local callers can forge proxy headers; remote browser sessions use one-use pairing instead. | | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
This row now correctly declares AGENTS.md reference: docs-site/AGENTS.md:L7-L10 Useful? React with 👍 / 👎. |
||
| | `remoteGui.allowInsecureHttp` | boolean | unset | **Retired — has no effect.** It once permitted a one-time pairing exchange over non-loopback plaintext HTTP. A pairing grant now crosses loopback or authenticated HTTPS only. The key is still parsed so an existing `config.json` keeps loading (the schema is strict, and dropping the key outright would make an older config fail to load entirely); a persisted `true` is reported once and then ignored. Remove it from your config. | | ||
|
|
||
| A hub that is reachable from a browser needs `hub.managementPublicOrigin` and at least one entry | ||
| in `remoteGui.allowedTailscaleUsers`. Setting the origin without the user list produces a hub that | ||
| advertises itself correctly and then refuses every session; setting the user list without the | ||
| origin produces sessions pointed at whichever origin the request happened to use. | ||
| A hub that is reachable from a browser needs `hub.managementPublicOrigin`; remote browser sessions | ||
| are established through the one-use pairing flow. | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
With automatic Tailscale session issuance removed, operators following this deployment guide can reach the dashboard but are never told how to obtain the pairing code it requests. Add the actionable flow—run
ocx gui pair --origin https://hub-name.tailnet-name.ts.neton the hub and paste the resulting one-use code into the remote dashboard—to the English guide and its updated translations.AGENTS.md reference: docs-site/AGENTS.md:L15-L16
Useful? React with 👍 / 👎.