@@ -18,7 +18,8 @@ For an introduction to service accounts, read [configure service accounts](/docs
18
18
19
19
This task guide explains some of the concepts behind ServiceAccounts. The
20
20
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.
22
23
23
24
<!-- body -->
24
25
@@ -68,7 +69,7 @@ Supported object types are as follows:
68
69
69
70
* Pod (used for projected volume mounts, see below)
70
71
* 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 )
72
73
73
74
When a token is bound to an object, the object's ` metadata.name ` and ` metadata.uid ` are
74
75
stored as extra 'private claims' in the issued JWT.
@@ -159,6 +160,66 @@ does not actually persist the TokenReview object into etcd.
159
160
Hence `kubectl get tokenreview` is not a valid command.
160
161
{{< /note >}}
161
162
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
+
162
223
# # Bound service account token volume mechanism {#bound-service-account-token-volume}
163
224
164
225
{{< feature-state feature_gate_name="BoundServiceAccountTokenVolume" >}}
0 commit comments