Skip to content

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

Open
Max Thompson (thompsonmax) wants to merge 2 commits into
agent-substrate:mainfrom
thompsonmax:authn-docs-current-state
Open

Max Thompson (thompsonmax) wants to merge 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/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.
…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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants