Skip to content

Document how people, pods and CI jobs should authenticate to ate-api - #3119

Merged
Eitan Yarmush (EItanya) merged 2 commits into
agent-substrate:mainfrom
thompsonmax:authn-docs-current-state
Nov 2, 2026
Merged

Eitan Yarmush (EItanya) merged 2 commits into
agent-substrate:mainfrom
thompsonmax:authn-docs-current-state

Conversation

@thompsonmax

@thompsonmax Max Thompson (thompsonmax) commented Oct 22, 2026 •

Copy link
Copy Markdown
Collaborator

Part of #1464.

  • Rewrites docs/guides/authentication.md around who is calling ate-api: a person running kubectl ate, a pod in the Substrate cluster or another cluster, or a CI job, so people stop leaning on the shared ate-client token.
  • Adds pod certificates as an option for client pods (the benchmarks use them), the ate.dev/api-access namespace label the ate-system NetworkPolicy requires, and the Kubernetes RBAC kubectl ate needs to reach ate-api.
  • Warns where an identity is weaker than it looks: another cluster's issuer can mint ate-client, GKE's Kubernetes Engine Developer and basic Editor roles can act as any ServiceAccount, ate-system port-forward rights reach loopback-only Envoy admin APIs that can stop the data plane, and GitHub and Google tokens authenticate anyone.
  • Moves the per-user ServiceAccount recipe and the signing-in and install-time-provider gaps out of authorization.md, and drops its claim that a Secret-based token works there (ate-api rejects its issuer). The recipe and RBAC use kubectl ate: authenticate with ExecCredential plugins named by --credential-plugin #2851's names (ate-users, ate-api-client).

For reviewers: #2851 (--credential-plugin) rewrites the same sections, and its paragraph calling GitHub and Google tokens unsafe needs to match this one.

Testing: checked each claim against the code on main (GitHub, GKE and Kubernetes behavior against their docs or source) and that the relative links resolve. None of the commands or manifests ran on a cluster.

AI use: AI-assisted.

  • Tests pass
  • Docs updated

The authentication guide described only the jwtProviders file, so users
fell back on kubectl ate's shared ate-client token. Organize it by
caller instead: people running kubectl ate, pods in the Substrate
cluster, pods in another cluster, and CI jobs. Each section says what
works today, including pod certificates, what kubectl ate still needs
from the Kubernetes API, and what isn't supported yet.

Move the per-user ServiceAccount recipe and the authentication gaps out
of the authorization guide so each fact lives in one place.

Signed-off-by: Max Thompson <[email protected]>
…ings

Several recipes in the authentication guide failed when followed. In-cluster
clients need their namespace labeled ate.dev/api-access=true, since the
ate-system NetworkPolicy drops everything else. `get actors` needs -a. A pod in
another cluster can't project a ClusterTrustBundle from the Substrate cluster.
The per-user recipe also never created the ServiceAccount, bound the Role, or
granted kubectl ate its own Kubernetes access.

Add the missing steps, and say where an identity is weaker than it looks:
trusting another cluster's issuer lets it mint ate-client, GKE's Kubernetes
Engine Developer and basic Editor roles can act as any ServiceAccount,
ate-system port-forward rights reach unauthenticated Envoy admin APIs,
deleting a ServiceAccount doesn't revoke its tokens, and GitHub and Google
tokens authenticate anyone, so the GitHub example uses an install-specific
audience and an ID-based sub. Correct what happens to a client certificate
from another CA, which RBAC a ServiceAccount already has, what
discoveryTokenFile sends, and how to change a wrongly detected issuer.

The authorization guide no longer lists Secrets as a way to get a token
ate-api accepts: Secret-based tokens carry the legacy kubernetes/serviceaccount
issuer, which no provider can name.

Signed-off-by: Max Thompson <[email protected]>
@thockin Tim Hockin (thockin) self-assigned this Nov 2, 2026
RBAC grants only add up, so these roles don't stop anyone else from acting as
alice. Anyone who can create pods or tokens in `ate-users` can, and the
built-in `edit` and `admin` roles allow both. The same rights in `ate-system`
get the `ate-client` token. On GKE a call is allowed if either IAM or RBAC

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not blocking: How are we treating GKE/cloud provider behavior in docs. Will we have sections for it, or mention it inline?

@EItanya
Eitan Yarmush (EItanya) added this pull request to the merge queue Nov 2, 2026
Merged via the queue into agent-substrate:main with commit f1973c1 Nov 2, 2026
7 checks passed
Dmitry Berkovich (dberkov) pushed a commit that referenced this pull request Nov 3, 2026
Bring `release-1.0` up to `main` at
5a5b192 with the 19 changes merged
since the previous batch in #3536. The final tree matches that commit
exactly.

**Please use Rebase and merge to preserve the individual commits and
author attribution.** All 19 applied cleanly in upstream order. Original
authors, author dates, co-author and sign-off trailers, and `-x` source
references are retained.

Upgrade notes:

- #3533: old gVisor MEMORY snapshots, including goldens, no longer
restore. Recreate them after upgrading. MicroVM MEMORY snapshots still
resume with their old mounts until recreated. `/tmp` is now always
tmpfs; ROOTFS snapshots no longer preserve its contents, and
image-provided files there are hidden. MicroVM `/tmp` counts against
actor memory and is capped at half the guest's memory. gVisor `/dev/shm`
is now a 64 MiB tmpfs. Mount a `durableDir` at either path when
persistence or more space is needed. `/run` now comes from the image
rootfs.
- #3447: remove `--actor-jwt-jwks-file` from custom credential-exchange
sidecar configs. Set `--actor-jwt-issuer-ca-file` only when the issuer
uses a private CA other than the service DNS CA.

- #3450: do not reuse a deleted atespace name. See the updated atespace
name-reuse guidance.

Includes #3505, which overlaps the open backport in #3547. GKE
provisioning and teardown now live in
[substrate-gke](https://github.com/ai-on-gke/substrate-gke) rather than
this repository.

<details>
<summary>Included PRs, in cherry-pick order</summary>

1. #3500: demos/{sandbox,jupyter,multi-template}: fix tutorial
prerequisites, walkthroughs, and counter volume
2. #3498: demos/counter: inline gVisor walkthrough and fix setup
commands
3. #3511: e2e tests: Extend the existing tests to cover tag actor.
4. #2775: Generate API reference documentation and publish it on
Substrate website
5. #3119: Document how people, pods and CI jobs should authenticate to
ate-api
6. #3505: tools: remove setup-gcp and hack/teardown.sh
7. #3147: e2e: resume fidelity after SandboxConfig version edits
8. #3370: ate-setup: reconcile ate-api-server ConfigMaps and roll out on
config changes
9. #1607: hack: reject breaking proto changes across each proto package
10. #3415: docs: update and add security diagrams
11. #3485: Resuming a microVM actor on the same node no longer reads its
rootfs upper back from disk
12. #3447: Verify actor JWTs in the credential exchange through OIDC
discovery
13. #3533: ocispec: mount tmpfs at /dev/shm, and /tmp on both runtimes
14. #3450: docs: Document that atespace names must not be reused
15. #3410: Document using more than one egress credential provider
16. #3486: atelet: register the device plugin on a new socket each time
17. #3553: ate-setup: wait for the demo namespace in delete demo
18. #3560: Fix multiple issues in claude-code-multiplex demo
19. #3517: docs: remove inaccurate early-stage architecture
documentation

</details>

Validation: every intermediate tree matches its upstream source commit,
all 19 authorship records and original attribution trailers are
preserved, and `git diff --check` passes. The original 18 backport
commits are unchanged.

AI use: AI-assisted cherry-picking, attribution checks, and review.

- [ ] Tests pass
- [x] Docs updated

---------

Signed-off-by: Mofi Rahman <[email protected]>
Signed-off-by: Eitan Yarmush <[email protected]>
Signed-off-by: Nayana Bidari <[email protected]>
Signed-off-by: Julian Gutierrez Oschmann <[email protected]>
Signed-off-by: Max Thompson <[email protected]>
Signed-off-by: Steven Shriver <[email protected]>
Signed-off-by: Grant McCloskey <[email protected]>
Signed-off-by: Shrutiya <[email protected]>
Signed-off-by: Haiyan Meng <[email protected]>
Signed-off-by: Greg Castle <[email protected]>
Signed-off-by: Benjamin Elder <[email protected]>
Signed-off-by: Anish Ramasekar <[email protected]>
Signed-off-by: Shruti Nair <[email protected]>
Signed-off-by: Haven Xia <[email protected]>
Co-authored-by: Mofi Rahman <[email protected]>
Co-authored-by: nybidari <[email protected]>
Co-authored-by: Julian Gutierrez Oschmann <[email protected]>
Co-authored-by: Max Thompson <[email protected]>
Co-authored-by: Grant McCloskey <[email protected]>
Co-authored-by: Steven Shriver <[email protected]>
Co-authored-by: shrutiyam-glitch <[email protected]>
Co-authored-by: haiyanmeng <[email protected]>
Co-authored-by: Greg Castle <[email protected]>
Co-authored-by: Benjamin Elder <[email protected]>
Co-authored-by: Anish Ramasekar <[email protected]>
Co-authored-by: Shruti Nair <[email protected]>
Co-authored-by: Haven Xia <[email protected]>
Co-authored-by: Adam Wathieu <[email protected]>
Dmitry Berkovich (dberkov) pushed a commit that referenced this pull request Nov 3, 2026
…3119)

Part of #1464.

- Rewrites `docs/guides/authentication.md` around who is calling
ate-api: a person running `kubectl ate`, a pod in the Substrate cluster
or another cluster, or a CI job, so people stop leaning on the shared
`ate-client` token.
- Adds pod certificates as an option for client pods (the benchmarks use
them), the `ate.dev/api-access` namespace label the ate-system
NetworkPolicy requires, and the Kubernetes RBAC `kubectl ate` needs to
reach ate-api.
- Warns where an identity is weaker than it looks: another cluster's
issuer can mint `ate-client`, GKE's Kubernetes Engine Developer and
basic Editor roles can act as any ServiceAccount, ate-system
port-forward rights reach loopback-only Envoy admin APIs that can stop
the data plane, and GitHub and Google tokens authenticate anyone.
- Moves the per-user ServiceAccount recipe and the signing-in and
install-time-provider gaps out of `authorization.md`, and drops its
claim that a Secret-based token works there (ate-api rejects its
issuer). The recipe and RBAC use #2851's names (`ate-users`,
`ate-api-client`).

For reviewers: #2851 (`--credential-plugin`) rewrites the same sections,
and its paragraph calling GitHub and Google tokens unsafe needs to match
this one.

Testing: checked each claim against the code on main (GitHub, GKE and
Kubernetes behavior against their docs or source) and that the relative
links resolve. None of the commands or manifests ran on a cluster.

AI use: AI-assisted.

- [x] Tests pass
- [x] Docs updated

---------

Signed-off-by: Max Thompson <[email protected]>
(cherry picked from commit f1973c1)
Signed-off-by: Eitan Yarmush <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/identity area/security Security related issue/pr kind/docs Improvements or additions to documentation milestone-ack prio/P0 Highest priority / required for next milestone

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants