Skip to content

Commit 152e83d

Browse files
committed
Update ServiceAccount admin docs with additional info on bound tokens
1 parent e3f0368 commit 152e83d

File tree

1 file changed

+63
-2
lines changed

1 file changed

+63
-2
lines changed

content/en/docs/reference/access-authn-authz/service-accounts-admin.md

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ For an introduction to service accounts, read [configure service accounts](/docs
1818

1919
This task guide explains some of the concepts behind ServiceAccounts. The
2020
guide also explains how to obtain or revoke tokens that represent
21-
ServiceAccounts.
21+
ServiceAccounts, and how to (optionally) bind a ServiceAccount's validity to
22+
the lifetime of an API object.
2223

2324
<!-- body -->
2425

@@ -68,7 +69,7 @@ Supported object types are as follows:
6869

6970
* Pod (used for projected volume mounts, see below)
7071
* Secret (can be used to allow revoking a token by deleting the Secret)
71-
* Node (in v1.30, creating new node-bound tokens is alpha, using existing node-bound tokens is beta)
72+
* Node (in v1.31, creating new node-bound tokens is beta, using existing node-bound tokens is GA)
7273

7374
When a token is bound to an object, the object's `metadata.name` and `metadata.uid` are
7475
stored as extra 'private claims' in the issued JWT.
@@ -159,6 +160,66 @@ does not actually persist the TokenReview object into etcd.
159160
Hence `kubectl get tokenreview` is not a valid command.
160161
{{< /note >}}
161162

163+
#### Schema for service account private claims
164+
165+
The schema for the Kubernetes-specific claims within JWT tokens is not currently documented,
166+
however the relevant code area can be found in [the serviceaccount package]() in the Kubernetes codebase.
167+
168+
[the serviceaccount package]: https://github.com/kubernetes/kubernetes/blob/d8919343526597e0788a1efe133c70d9a0c07f69/pkg/serviceaccount/claims.go#L56-L68
169+
170+
You can inspect a JWT using standard JWT decoding tools, an example of a JWT for the
171+
`my-serviceaccount` ServiceAccount, bound to a Pod object named `my-pod` which is scheduled
172+
to the Node `my-node`, in the `default` namespace:
173+
174+
```json
175+
{
176+
"aud": [
177+
"https://kubernetes.default.svc.cluster.local"
178+
],
179+
"exp": 1729605240,
180+
"iat": 1729601640,
181+
"iss": "https://kubernetes.default.svc.cluster.local",
182+
"jti": "aed34954-b33a-4142-b1ec-389d6bbb4936",
183+
"kubernetes.io": {
184+
"namespace": "default",
185+
"node": {
186+
"name": "my-node",
187+
"uid": "646e7c5e-32d6-4d42-9dbd-e504e6cbe6b1"
188+
},
189+
"pod": {
190+
"name": "my-pod",
191+
"uid": "5e0bd49b-f040-43b0-99b7-22765a53f7f3"
192+
},
193+
"serviceaccount": {
194+
"name": "my-serviceaccount",
195+
"uid": "14ee3fa4-a7e2-420f-9f9a-dbc4507c3798"
196+
}
197+
},
198+
"nbf": 1729601640,
199+
"sub": "system:serviceaccount:default:my-serviceaccount"
200+
}
201+
```
202+
203+
{{< note >}}
204+
The presence of both the `pod` and `node` claim implies that this token is bound
205+
to a *Pod* object. When verifying Pod bound ServiceAccount tokens, the apiserver **does not**
206+
verify the existence of the referenced Node object.
207+
{{< /note >}}
208+
209+
Services that run outside of Kubernetes and want to perform offline validation of JWTs may
210+
use this schema, along with a compliant JWT validator configured with OpenID Discovery information
211+
from the kube-apiserver, to verify presented JWTs without requiring use of the TokenReview API.
212+
213+
Services that verify JWTs in this way **do not verify** the claims embedded in the JWT token to be
214+
current and still valid.
215+
This means if the token is bound to an object, and that object no longer exists, the token will still
216+
be considered valid (until the configured token expiry).
217+
218+
Clients that require assurance that a token's bound claims are still valid **MUST** use the TokenReview
219+
API to present the token to the `kube-apiserver` for it to verify and expand the embedded claims, using
220+
similar steps to the [Verifying and inspecting private claims](#verifying-and-inspecting-private-claims)
221+
section above, but with a [supported client library](/docs/reference/using-api/client-libraries/).
222+
162223
## Bound service account token volume mechanism {#bound-service-account-token-volume}
163224

164225
{{< feature-state feature_gate_name="BoundServiceAccountTokenVolume" >}}

0 commit comments

Comments
 (0)