<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 3.4.9) -->
<?rfc rfcedstyle="yes"?>
<?rfc tocindent="yes"?>
<?rfc strict="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc text-list-symbols="-o*+"?>
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-wimse-workload-identity-practices-05" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="Workload Identity">Workload Identity Practices</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-wimse-workload-identity-practices-05"/>
    <author initials="A." surname="Schwenkschuster" fullname="Arndt Schwenkschuster">
      <organization>SPIRL</organization>
      <address>
        <email>arndts.ietf@gmail.com</email>
      </address>
    </author>
    <author initials="Y." surname="Rosomakho" fullname="Yaroslav Rosomakho">
      <organization>Zscaler</organization>
      <address>
        <email>yrosomakho@zscaler.com</email>
      </address>
    </author>
    <date year="2026" month="June" day="30"/>
    <area>Applications and Real-Time</area>
    <workgroup>Workload Identity in Multi System Environments</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 76?>

<t>This document describes industry practices for providing secure identities
to workloads in container orchestration, cloud platforms, and other workload
platforms. It explains how workloads obtain credentials for external
authentication purposes, without managing long-lived secrets directly. It does
not take into account the standards work in progress for the WIMSE architecture
and associated protocols.</t>
    </abstract>
  </front>
  <middle>
    <?line 85?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Just like people, workloads need identifiers and associated credentials to
authenticate with other systems, such as databases, web servers, or other
workloads. The challenge for workloads is to obtain a credential that can
be used to authenticate with these resources without managing secrets directly,
for instance, an OAuth 2.0 access token.</t>
      <t>The common use of the OAuth 2.0 framework <xref target="OAUTH-FRAMEWORK"/> in this context poses
challenges, particularly in managing credentials. To address this, the industry
has shifted to a federation-based approach where credentials of the underlying
workload platform are used to authenticate to identity providers, which in
turn, issue credentials that grant access to resources.</t>
      <t>Traditionally, workloads were provisioned with static client credentials (e.g.,
passwords, API keys) and used the corresponding flow as described in <xref section="1.3.4" sectionFormat="of" target="OAUTH-FRAMEWORK"/>
to retrieve an OAuth 2.0 access token. This model presents a number of security
and maintenance issues. Secrets must be provisioned and rotated, which requires
either automation to be built, or periodic manual effort. Secrets may be stolen
and used by attackers to impersonate the workload. Flows outside of the
OAuth 2.0 framework (such as direct API keys or HTTP basic authentication)
suffer from the same issues.</t>
      <t>Instead of provisioning secret material to the workload, one solution to this
problem is to attest the workload by using its underlying platform. Many
platforms provision workloads with a credential, such as a JWT
<xref target="JWT"/>. Cryptographically signed by the platform's issuer,
this credential attests the workload and its attributes.</t>
      <t><xref target="fig-overview"/> illustrates a generic pattern that is seen across many workload
platforms, more concrete variations are found in <xref target="practices"/>.</t>
      <figure anchor="fig-overview">
        <name>Generic workload identity pattern</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="432" width="528" viewBox="0 0 528 432" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 48,32 L 48,256" fill="none" stroke="black"/>
              <path d="M 64,64 L 64,128" fill="none" stroke="black"/>
              <path d="M 64,352 L 64,416" fill="none" stroke="black"/>
              <path d="M 112,128 L 112,344" fill="none" stroke="black"/>
              <path d="M 128,128 L 128,320" fill="none" stroke="black"/>
              <path d="M 184,128 L 184,208" fill="none" stroke="black"/>
              <path d="M 208,64 L 208,128" fill="none" stroke="black"/>
              <path d="M 224,352 L 224,416" fill="none" stroke="black"/>
              <path d="M 352,64 L 352,128" fill="none" stroke="black"/>
              <path d="M 384,176 L 384,240" fill="none" stroke="black"/>
              <path d="M 384,288 L 384,352" fill="none" stroke="black"/>
              <path d="M 504,64 L 504,128" fill="none" stroke="black"/>
              <path d="M 504,176 L 504,240" fill="none" stroke="black"/>
              <path d="M 504,288 L 504,352" fill="none" stroke="black"/>
              <path d="M 520,32 L 520,256" fill="none" stroke="black"/>
              <path d="M 48,32 L 520,32" fill="none" stroke="black"/>
              <path d="M 64,64 L 208,64" fill="none" stroke="black"/>
              <path d="M 352,64 L 504,64" fill="none" stroke="black"/>
              <path d="M 216,96 L 344,96" fill="none" stroke="black"/>
              <path d="M 64,128 L 208,128" fill="none" stroke="black"/>
              <path d="M 352,128 L 504,128" fill="none" stroke="black"/>
              <path d="M 384,176 L 504,176" fill="none" stroke="black"/>
              <path d="M 184,208 L 376,208" fill="none" stroke="black"/>
              <path d="M 384,240 L 504,240" fill="none" stroke="black"/>
              <path d="M 48,256 L 520,256" fill="none" stroke="black"/>
              <path d="M 384,288 L 504,288" fill="none" stroke="black"/>
              <path d="M 128,320 L 376,320" fill="none" stroke="black"/>
              <path d="M 64,352 L 224,352" fill="none" stroke="black"/>
              <path d="M 384,352 L 504,352" fill="none" stroke="black"/>
              <path d="M 64,416 L 224,416" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="384,320 372,314.4 372,325.6" fill="black" transform="rotate(0,376,320)"/>
              <polygon class="arrowhead" points="384,208 372,202.4 372,213.6" fill="black" transform="rotate(0,376,208)"/>
              <polygon class="arrowhead" points="352,96 340,90.4 340,101.6" fill="black" transform="rotate(0,344,96)"/>
              <polygon class="arrowhead" points="224,96 212,90.4 212,101.6" fill="black" transform="rotate(180,216,96)"/>
              <polygon class="arrowhead" points="120,344 108,338.4 108,349.6" fill="black" transform="rotate(90,112,344)"/>
              <g class="text">
                <text x="404" y="52">Workload</text>
                <text x="476" y="52">Platform</text>
                <text x="132" y="100">Workload</text>
                <text x="404" y="100">Platform</text>
                <text x="468" y="100">Issuer</text>
                <text x="236" y="116">1)</text>
                <text x="288" y="116">push/pull</text>
                <text x="296" y="132">credentials</text>
                <text x="228" y="196">A)</text>
                <text x="268" y="196">access</text>
                <text x="444" y="212">Resource</text>
                <text x="16" y="308">B1)</text>
                <text x="68" y="308">federate</text>
                <text x="160" y="308">B2)</text>
                <text x="204" y="308">access</text>
                <text x="444" y="324">Resource</text>
                <text x="108" y="388">Identity</text>
                <text x="180" y="388">Provider</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
     +----------------------------------------------------------+
     |                                        Workload Platform |
     | +-----------------+                 +------------------+ |
     | |                 |                 |                  | |
     | |    Workload     |<--------------->|  Platform Issuer | |
     | |                 |  1) push/pull   |                  | |
     | +-----+-+------+--+     credentials +------------------+ |
     |       | |      |                                         |
     |       | |      |                                         |
     |       | |      |                        +--------------+ |
     |       | |      |    A) access           |              | |
     |       | |      +----------------------->|   Resource   | |
     |       | |                               |              | |
     |       | |                               +--------------+ |
     +-------+-+------------------------------------------------+
             | |
             | |                               +--------------+
B1) federate | |  B2) access                   |              |
             | +------------------------------>|   Resource   |
             v                                 |              |
       +-------------------+                   +--------------+
       |                   |
       | Identity Provider |
       |                   |
       +-------------------+
]]></artwork>
        </artset>
      </figure>
      <t>The figure outlines the following steps which are applicable in any pattern.</t>
      <ul spacing="normal">
        <li>
          <t>1) The platform issues a credential to represent the workload identity after
   verification of workload environment and attributes. The way this is
   achieved varies by platform, for instance, the credential can be pushed
   to the workload or pulled by the workload. A workload may obtain
   multiple credentials from the platform, each with its own audience and
   lifetime, tailored to the specific resource or Identity Provider it
   needs to interact with. See <xref target="general-requirements"/> and <xref target="audience"/>
   for more details and security implications.</t>
        </li>
        <li>
          <t>A) The credential can give the workload direct access to resources within the
   platform or the platform itself, for example to perform infrastructure
   operations.</t>
        </li>
        <li>
          <t>B1) The workload uses a credential to federate to an Identity Provider. This
    step is optional and only needed when accessing outside resources. The
    Identity Provider validates the platform-issued credential, and in return,
    issues a new credential, such as an OAuth 2.0 access token, that the
    workload can use to access resources in the Identity Provider's domain.</t>
        </li>
        <li>
          <t>B2) Using the credential obtained at step B1, the workload accesses resources
    outside of the platform.</t>
        </li>
      </ul>
      <t>Accessing different outside resources may require the workload to repeat steps
B1) and B2), federating to multiple Identity Providers. It is also possible that
step 1) needs to be repeated, for instance in situations where the
platform-issued credential is scoped to accessing a certain resource or
federating to a specific Identity Provider.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="delivery-patterns">
      <name>Delivery Patterns</name>
      <t>Credentials can be provisioned to the workload by different mechanisms, each of which has
its own advantages, challenges, and security risks. The following
section highlights the pros and cons of common solutions. Security
recommendations for these methods are covered in
<xref target="security-credential-delivery"/>.</t>
      <section anchor="environment-variables">
        <name>Environment Variables</name>
        <t>Injecting the credentials into the environment variables allows for simple and
fast deployments. Applications can directly access them through system-level
mechanisms, e.g., through the <tt>env</tt> command in Linux. Note that environment
variables are static in nature in that they cannot be changed after application
initialization.</t>
        <t>This delivery pattern is generally discouraged for production workload identity
credentials, because environment variables are frequently exposed through
debugging, logging, process inspection, and observability tooling. Security
considerations for this pattern are discussed in <xref target="security-credential-delivery-env"/>.</t>
      </section>
      <section anchor="filesystem">
        <name>Filesystem</name>
        <t>Filesystem delivery allows both container secret injection and access control.
Many solutions find the main benefit in the asynchronous provisioning of the
credentials to the workload. This allows the workload to run independently of
the credentials update, and to access them by reading the file.</t>
        <t>Credential rotation requires a solution to detect soon-to-expire secrets as a
rotation trigger. One practice is that the new secret is renewed <em>before</em> the
old secret is invalidated. For example, the solution can choose to update the
secret an hour before it is invalidated. This gives applications time to update
without downtime.</t>
        <t>Because credentials are written to a shared filesystem, the solution is responsible
for ensuring atomicity when updating them. Writes <bcp14>SHOULD</bcp14> be performed in a way
that prevents workloads from observing a partially written file (for example by
writing to a temporary file and renaming it atomically). Solutions <bcp14>SHOULD</bcp14> also
perform a flush operation immediately after the update to minimize the chance
of race conditions and ensure durability.</t>
      </section>
      <section anchor="local-apis">
        <name>Local APIs</name>
        <t>In this pattern, the workload obtains credentials by communicating with a
local API exposed by the credential issuer. Implementations commonly use UNIX
domain sockets (e.g., SPIFFE), loopback interfaces, or link-local "magic addresses"
169.254.169.254 commonly used for cloud provider Instance Metadata Services as
the transport mechanism.</t>
        <t>Local APIs support re-provisioning of updated credentials, either on demand
or through persistent connections that enable the issuer to push new credentials.
This enables the use of short-lived, narrowly scoped credentials, improving
security posture compared to long-lived secrets.</t>
        <t>The security of this approach relies heavily on network isolation to prevent
unauthorised access to the local API. In addition, the pattern requires client-side
code that is specific to the exposed API, which may introduce portability challenges
across platforms and providers. Further security considerations for local APIs are
discussed in <xref target="local-api-security"/>.</t>
      </section>
    </section>
    <section anchor="practices">
      <name>Practices</name>
      <t>The following practices outline more concrete examples of platforms, including
their delivery patterns.</t>
      <section anchor="kubernetes">
        <name>Kubernetes</name>
        <t>In Kubernetes, machine identity is implemented through "service accounts"
<xref target="KubernetesServiceAccount"/>. Service accounts can be explicitly created, or a
default one is automatically assigned. Service accounts use JSON Web Tokens
(<xref target="JWT"/>) as their credential format, with the Kubernetes Control Plane
acting as the signer.</t>
        <t>Service accounts serve multiple authentication purposes within the Kubernetes
ecosystem. They are used to authenticate to Kubernetes APIs, between different
workloads and to access external resources. This latter use case is particularly
relevant for the purposes of this document.</t>
        <t>To programmatically use service accounts, workloads can:</t>
        <ul spacing="normal">
          <li>
            <t>Have the token "projected" into the file system of the workload. This is
similar to volume mounting in non-Kubernetes environments, and is commonly
referred to as "projected service account token".</t>
          </li>
          <li>
            <t>Use the Token Request API <xref target="TokenRequestV1"/> of the control plane. This option,
however, requires an initial projected service account token as a means of
authentication.</t>
          </li>
        </ul>
        <t>Both options allow workloads to:</t>
        <ul spacing="normal">
          <li>
            <t>Specify a custom audience. Possible audiences can be restricted based on
policy.</t>
          </li>
          <li>
            <t>Specify a custom lifetime. Maximum lifetime can be restricted by policy.</t>
          </li>
          <li>
            <t>Bind the token lifetime to an object lifecycle. This allows the token to be
invalidated when the object is deleted. For example, this may happen when a
Kubernetes Deployment is removed from the server. Note that invalidation is
only detected when the Token Review API <xref target="TokenReviewV1"/> of Kubernetes is
used to validate the token.</t>
          </li>
          <li>
            <t>Obtain multiple tokens, each with its own customized audience and lifetime.
For example, a workload may obtain one token audienced for the Kubernetes API
server, another for an internal service, and yet another for federation with
an external Identity Provider. Tokens <bcp14>SHOULD</bcp14> have a minimal set of audiences;
see <xref target="audience"/> for more details and security implications.</t>
          </li>
        </ul>
        <t>To validate service account tokens, Kubernetes allows workloads to:</t>
        <ul spacing="normal">
          <li>
            <t>Make use of the Token Review API <xref target="TokenReviewV1"/>. This API introspects the
token, makes sure it hasn't been invalidated and returns the claims.</t>
          </li>
          <li>
            <t>Mount the public keys used to sign the tokens into the file system of the
workload. This allows workloads to validate a token's signature without
calling the Token Review API.</t>
          </li>
          <li>
            <t>Optionally, a JSON Web Key Set <xref target="JWK"/> is exposed via a web server. This
allows the Service Account Token to be validated outside of the cluster and
access to the actual Kubernetes Control Plane API.</t>
          </li>
        </ul>
        <figure anchor="fig-kubernetes">
          <name>Kubernetes workload identity in practice</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="496" width="488" viewBox="0 0 488 496" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 80,32 L 80,320" fill="none" stroke="black"/>
                <path d="M 96,144 L 96,208" fill="none" stroke="black"/>
                <path d="M 96,416 L 96,480" fill="none" stroke="black"/>
                <path d="M 112,208 L 112,408" fill="none" stroke="black"/>
                <path d="M 128,208 L 128,384" fill="none" stroke="black"/>
                <path d="M 136,96 L 136,144" fill="none" stroke="black"/>
                <path d="M 160,208 L 160,256" fill="none" stroke="black"/>
                <path d="M 176,144 L 176,208" fill="none" stroke="black"/>
                <path d="M 264,64 L 264,128" fill="none" stroke="black"/>
                <path d="M 272,416 L 272,480" fill="none" stroke="black"/>
                <path d="M 288,160 L 288,192" fill="none" stroke="black"/>
                <path d="M 328,136 L 328,160" fill="none" stroke="black"/>
                <path d="M 344,224 L 344,288" fill="none" stroke="black"/>
                <path d="M 344,352 L 344,416" fill="none" stroke="black"/>
                <path d="M 368,160 L 368,192" fill="none" stroke="black"/>
                <path d="M 384,64 L 384,128" fill="none" stroke="black"/>
                <path d="M 464,224 L 464,288" fill="none" stroke="black"/>
                <path d="M 464,352 L 464,416" fill="none" stroke="black"/>
                <path d="M 480,32 L 480,320" fill="none" stroke="black"/>
                <path d="M 80,32 L 480,32" fill="none" stroke="black"/>
                <path d="M 264,64 L 384,64" fill="none" stroke="black"/>
                <path d="M 136,96 L 256,96" fill="none" stroke="black"/>
                <path d="M 264,128 L 384,128" fill="none" stroke="black"/>
                <path d="M 96,144 L 176,144" fill="none" stroke="black"/>
                <path d="M 288,160 L 368,160" fill="none" stroke="black"/>
                <path d="M 184,176 L 288,176" fill="none" stroke="black"/>
                <path d="M 288,192 L 368,192" fill="none" stroke="black"/>
                <path d="M 96,208 L 176,208" fill="none" stroke="black"/>
                <path d="M 344,224 L 464,224" fill="none" stroke="black"/>
                <path d="M 160,256 L 336,256" fill="none" stroke="black"/>
                <path d="M 344,288 L 464,288" fill="none" stroke="black"/>
                <path d="M 80,320 L 480,320" fill="none" stroke="black"/>
                <path d="M 344,352 L 464,352" fill="none" stroke="black"/>
                <path d="M 128,384 L 336,384" fill="none" stroke="black"/>
                <path d="M 96,416 L 272,416" fill="none" stroke="black"/>
                <path d="M 344,416 L 464,416" fill="none" stroke="black"/>
                <path d="M 96,480 L 272,480" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="344,384 332,378.4 332,389.6" fill="black" transform="rotate(0,336,384)"/>
                <polygon class="arrowhead" points="344,256 332,250.4 332,261.6" fill="black" transform="rotate(0,336,256)"/>
                <polygon class="arrowhead" points="336,136 324,130.4 324,141.6" fill="black" transform="rotate(270,328,136)"/>
                <polygon class="arrowhead" points="264,96 252,90.4 252,101.6" fill="black" transform="rotate(0,256,96)"/>
                <polygon class="arrowhead" points="192,176 180,170.4 180,181.6" fill="black" transform="rotate(180,184,176)"/>
                <polygon class="arrowhead" points="120,408 108,402.4 108,413.6" fill="black" transform="rotate(90,112,408)"/>
                <g class="text">
                  <text x="420" y="52">Kubernetes</text>
                  <text x="160" y="84">A1)</text>
                  <text x="204" y="84">access</text>
                  <text x="296" y="100">API</text>
                  <text x="340" y="100">Server</text>
                  <text x="348" y="148">1)</text>
                  <text x="392" y="148">request</text>
                  <text x="448" y="148">token</text>
                  <text x="196" y="164">2)</text>
                  <text x="244" y="164">schedule</text>
                  <text x="136" y="180">Pod</text>
                  <text x="328" y="180">Kubelet</text>
                  <text x="200" y="244">A2)</text>
                  <text x="244" y="244">access</text>
                  <text x="404" y="260">Resource</text>
                  <text x="16" y="372">B1)</text>
                  <text x="68" y="372">federate</text>
                  <text x="152" y="372">B2)</text>
                  <text x="196" y="372">access</text>
                  <text x="404" y="388">Resource</text>
                  <text x="148" y="452">Identity</text>
                  <text x="220" y="452">Provider</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
         +-------------------------------------------------+
         |                                     Kubernetes  |
         |                      +--------------+           |
         |        A1) access    |              |           |
         |      +-------------->|  API Server  |           |
         |      |               |              |           |
         |      |               +--------------+           |
         | +----+----+                  ^ 1) request token |
         | |         | 2) schedule +----+----+             |
         | |   Pod   |<------------+ Kubelet |             |
         | |         |             +---------+             |
         | +-+-+---+-+                                     |
         |   | |   |                      +--------------+ |
         |   | |   |   A2) access         |              | |
         |   | |   +--------------------->|   Resource   | |
         |   | |                          |              | |
         |   | |                          +--------------+ |
         |   | |                                           |
         +---+-+-------------------------------------------+
             | |
             | |                          +--------------+
B1) federate | | B2) access               |              |
             | +------------------------->|   Resource   |
             v                            |              |
           +---------------------+        +--------------+
           |                     |
           |  Identity Provider  |
           |                     |
           +---------------------+
]]></artwork>
          </artset>
        </figure>
        <t>The steps shown in <xref target="fig-kubernetes"/> are:</t>
        <ul spacing="normal">
          <li>
            <t>1) The kubelet is tasked to schedule a Pod. Based on configuration, it requests
   one or more Service Account Tokens from the Kubernetes API server, each
   scoped to its intended use, for example with a distinct audience.</t>
          </li>
          <li>
            <t>2) The kubelet starts the Pod and, based on the configuration of the Pod,
   delivers the token(s) to the containers within the Pod.</t>
          </li>
        </ul>
        <t>Now, the Pod can use the tokens to:</t>
        <ul spacing="normal">
          <li>
            <t>A1) Access the Kubernetes Control Plane, using a token audienced for the
   API server, considering it has access to it.</t>
          </li>
          <li>
            <t>A2) Access other resources within the cluster, for instance, other Pods, using
   a token audienced for the target resource.</t>
          </li>
          <li>
            <t>B) Access resources outside of the cluster:</t>
          </li>
          <li>
            <t>B1) The application within the Pod uses a Service Account Token audienced
    for the external Identity Provider to federate to that Identity Provider
    outside of the Kubernetes Cluster. This token <bcp14>SHOULD NOT</bcp14> be the same
    token used for steps A1 or A2. The Identity Provider validates the token
    and issues a new credential to the workload, such as an OAuth 2.0 access
    token.</t>
          </li>
          <li>
            <t>B2) Using the credential issued in step C1, the application within the Pod
    accesses resources outside of the cluster.</t>
          </li>
        </ul>
        <t>As an example, the following JSON illustrates the claims contained in a Kubernetes Service
Account token.</t>
        <figure anchor="fig-kubernetes-token">
          <name>Example Kubernetes Service Account Token claims</name>
          <sourcecode type="json"><![CDATA[
{
  "aud": [
    # matches the requested audiences, or the API server's
    # default audiences when none are explicitly requested
    "https://kubernetes.default.svc"
  ],
  "exp": 1731613413,
  "iat": 1700077413,
  "iss":
    # matches the first value passed to the
    # --service-account-issuer flag
    "https://kubernetes.default.svc",
  "jti":
    # ServiceAccountTokenJTI feature must be enabled
    # for the claim to be present
    "ea28ed49-2e11-4280-9ec5-bc3d1d84661a",
  "kubernetes.io": {
    "namespace": "my-namespace",
    "node": {
      # ServiceAccountTokenPodNodeInfo feature must be enabled
      # for the API server to add this node reference claim
      "name": "127.0.0.1",
      "uid": "58456cb0-dd00-45ed-b797-5578fdceaced"
    },
    "pod": {
      "name": "my-workload-69cbfb9798-jv9gn",
      "uid": "778a530c-b3f4-47c0-9cd5-ab018fb64f33"
    },
    "serviceaccount": {
      "name": "my-workload",
      "uid": "a087d5a0-e1dd-43ec-93ac-f13d89cd13af"
    },
    "warnafter": 1700081020
  },
  "nbf": 1700077413,
  "sub": "system:serviceaccount:my-namespace:my-workload"
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="spiffe">
        <name>Secure Production Identity Framework For Everyone (SPIFFE)</name>
        <t>The Secure Production Identity Framework For Everyone, also known as SPIFFE <xref target="SPIFFE"/>, is
a Cloud Native Computing Foundation (CNCF) project that defines a "Workload API"
to deliver machine identity to workloads. Workloads can retrieve identity
credentials in one of two forms:</t>
        <ul spacing="normal">
          <li>
            <t>X509-SVID, a X.509 certificate containing the workload's SPIFFE ID in the Subject
Alternative Name (SAN) URI field, along with the corresponding key pair.</t>
          </li>
          <li>
            <t>JWT-SVID, a signed JWT containing the workload's SPIFFE ID in the <tt>sub</tt> claim.
The Workload API does not require clients to authenticate themselves.</t>
          </li>
        </ul>
        <t>Instead, the API implementation identifies workloads by collecting contextual
information from the environment, such as process attributes, kernel metadata,
or orchestrator-provided labels. This out-of-band identification allows
workloads to obtain their identity credentials without needing a pre-existing
secret, avoiding the bootstrapping problem of requiring a credential to obtain
a credential.</t>
        <t>Workloads may request multiple JWT-SVIDs, each with a distinct audience, to
interact with different resources or Identity Providers. As with all patterns
in this document, it is best practice to use a separate credential for each
target; see <xref target="audience"/> for details.</t>
        <t>For validation, SPIFFE defines a "trust bundle" per trust domain. A trust
bundle is a set of public keys encoded in JWK format <xref target="JWK"/> that can be
used to validate credentials. For JWT-SVIDs, the bundle contains signing keys
identified by a <tt>use</tt> value of <tt>jwt-svid</tt>. For X509-SVIDs, the bundle contains
CA certificates identified by a <tt>use</tt> value of <tt>x509-svid</tt>. Trust bundle
contents can be retrieved from the Workload API or from a dedicated SPIFFE
Bundle Endpoint (see <xref target="SPIFFE"/>).</t>
        <t>The following figure illustrates how a workload can use its SPIFFE identity to
access a protected resource outside of the trust domain. The example uses a
JWT-SVID, but using an X509-SVID is also possible.</t>
        <figure anchor="fig-spiffe">
          <name>Workload identity in SPIFFE</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="416" width="520" viewBox="0 0 520 416" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 56,32 L 56,240" fill="none" stroke="black"/>
                <path d="M 64,336 L 64,400" fill="none" stroke="black"/>
                <path d="M 72,80 L 72,144" fill="none" stroke="black"/>
                <path d="M 112,144 L 112,328" fill="none" stroke="black"/>
                <path d="M 128,144 L 128,304" fill="none" stroke="black"/>
                <path d="M 168,144 L 168,192" fill="none" stroke="black"/>
                <path d="M 192,80 L 192,144" fill="none" stroke="black"/>
                <path d="M 240,336 L 240,400" fill="none" stroke="black"/>
                <path d="M 368,80 L 368,128" fill="none" stroke="black"/>
                <path d="M 368,160 L 368,224" fill="none" stroke="black"/>
                <path d="M 368,272 L 368,336" fill="none" stroke="black"/>
                <path d="M 488,80 L 488,128" fill="none" stroke="black"/>
                <path d="M 488,160 L 488,224" fill="none" stroke="black"/>
                <path d="M 488,272 L 488,336" fill="none" stroke="black"/>
                <path d="M 512,32 L 512,240" fill="none" stroke="black"/>
                <path d="M 56,32 L 512,32" fill="none" stroke="black"/>
                <path d="M 72,80 L 192,80" fill="none" stroke="black"/>
                <path d="M 368,80 L 488,80" fill="none" stroke="black"/>
                <path d="M 192,96 L 360,96" fill="none" stroke="black"/>
                <path d="M 368,128 L 488,128" fill="none" stroke="black"/>
                <path d="M 72,144 L 192,144" fill="none" stroke="black"/>
                <path d="M 368,160 L 488,160" fill="none" stroke="black"/>
                <path d="M 168,192 L 360,192" fill="none" stroke="black"/>
                <path d="M 368,224 L 488,224" fill="none" stroke="black"/>
                <path d="M 56,240 L 512,240" fill="none" stroke="black"/>
                <path d="M 368,272 L 488,272" fill="none" stroke="black"/>
                <path d="M 128,304 L 360,304" fill="none" stroke="black"/>
                <path d="M 64,336 L 240,336" fill="none" stroke="black"/>
                <path d="M 368,336 L 488,336" fill="none" stroke="black"/>
                <path d="M 64,400 L 240,400" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="368,304 356,298.4 356,309.6" fill="black" transform="rotate(0,360,304)"/>
                <polygon class="arrowhead" points="368,192 356,186.4 356,197.6" fill="black" transform="rotate(0,360,192)"/>
                <polygon class="arrowhead" points="368,96 356,90.4 356,101.6" fill="black" transform="rotate(0,360,96)"/>
                <polygon class="arrowhead" points="120,328 108,322.4 108,333.6" fill="black" transform="rotate(90,112,328)"/>
                <g class="text">
                  <text x="372" y="52">SPIFFE</text>
                  <text x="424" y="52">Trust</text>
                  <text x="476" y="52">Domain</text>
                  <text x="220" y="84">1)</text>
                  <text x="248" y="84">Get</text>
                  <text x="300" y="84">JWT-SVID</text>
                  <text x="428" y="100">SPIFFE</text>
                  <text x="132" y="116">Workload</text>
                  <text x="412" y="116">Workload</text>
                  <text x="464" y="116">API</text>
                  <text x="220" y="180">A)</text>
                  <text x="260" y="180">access</text>
                  <text x="428" y="196">Resource</text>
                  <text x="16" y="292">B1)</text>
                  <text x="68" y="292">federate</text>
                  <text x="152" y="292">B2)</text>
                  <text x="196" y="292">access</text>
                  <text x="428" y="308">Resource</text>
                  <text x="116" y="372">Identity</text>
                  <text x="188" y="372">Provider</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
      +--------------------------------------------------------+
      |                                    SPIFFE Trust Domain |
      |                                                        |
      | +--------------+  1) Get JWT-SVID    +--------------+  |
      | |              +-------------------->|    SPIFFE    |  |
      | |   Workload   |                     | Workload API |  |
      | |              |                     +--------------+  |
      | +----+-+----+--+                                       |
      |      | |    |                        +--------------+  |
      |      | |    |     A) access          |              |  |
      |      | |    +----------------------->|   Resource   |  |
      |      | |                             |              |  |
      |      | |                             +--------------+  |
      +------+-+-----------------------------------------------+
             | |
             | |                             +--------------+
B1) federate | | B2) access                  |              |
             | +---------------------------->|   Resource   |
             v                               |              |
       +---------------------+               +--------------+
       |                     |
       |  Identity Provider  |
       |                     |
       +---------------------+
]]></artwork>
          </artset>
        </figure>
        <t>The steps shown in <xref target="fig-spiffe"/> are:</t>
        <ul spacing="normal">
          <li>
            <t>1) The workload requests one or more JWT-SVIDs from the SPIFFE Workload API,
   each with a distinct audience matching its intended use.</t>
          </li>
          <li>
            <t>A) A JWT-SVID audienced for the target resource can be used to directly access
   resources or other workloads within the same SPIFFE Trust Domain.</t>
          </li>
          <li>
            <t>B1) To access resources protected by other Identity Providers, the workload
    uses a JWT-SVID audienced for the Identity Provider to federate. This
    <bcp14>SHOULD</bcp14> be a separate JWT-SVID from the one used in step A). The
    Identity Provider validates the JWT-SVID and issues a new credential
    such as an OAuth 2.0 access token, to the workload.</t>
          </li>
          <li>
            <t>B2) Using the credential issued in step B1, the workload can access resources
    outside of its trust domain.</t>
          </li>
        </ul>
        <t>Here are example claims for a JWT-SVID:</t>
        <sourcecode type="json"><![CDATA[
{
  "aud": [
    "external-authorization-server"
  ],
  "exp": 1729087175,
  "iat": 1729086875,
  "sub": "spiffe://example.org/myservice"
}
]]></sourcecode>
      </section>
      <section anchor="cloudproviders">
        <name>Cloud Providers</name>
        <t>Workload forms in cloud platforms vary. Historically, virtual
machines were the most common. The introduction of containerization brought
hosted container environments or Kubernetes clusters. Containers have evolved
into <tt>serverless</tt> offerings. Regardless of the actual workload packaging,
distribution, or runtime platform, all these workloads need identities.</t>
        <t>The biggest cloud providers have established the pattern of an "Instance
Metadata Endpoint". Aside from allowing workloads to retrieve metadata about
themselves, it also allows them to receive identity. The credential types
offered can vary, and JWTs are commonly found across cloud providers.
The issued credential provides proof to anyone it is being presented to that the
workload platform has attested the workload and it can be considered
authenticated.</t>
        <t>Within a cloud provider, the issued credential can often directly be used to
access resources of any kind across the platform, making integration between the
services straightforward. From the workload perspective, no credential needs to be
issued, provisioned, rotated or revoked, as everything is handled internally by
the platform.</t>
        <t>This is not true for resources outside of the platform, such as on-premise
resources, generic web servers or other cloud provider resources. Here, the
workload first needs to federate to the Secure Token Service (STS) of the
respective cloud, which is effectively an Identity Provider. The STS issues
a new credential with which the workload can then access resources.</t>
        <t>This pattern also applies when accessing resources in the same cloud but across
different security boundaries (e.g., different account or tenant). The actual
flows and implementations may vary in these situations though.</t>
        <t>When a workload needs to access both internal platform resources and external
resources, it <bcp14>SHOULD</bcp14> obtain separate credentials for each purpose. The credential
used for internal platform access (step A) <bcp14>SHOULD NOT</bcp14> be reused for federation
to an external STS (step B1), as these represent different trust and audience
boundaries. The workload may need to contact the Instance Metadata Service
multiple times to obtain appropriately scoped credentials.</t>
        <figure anchor="fig-cloud">
          <name>Workload identity in a cloud provider</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="544" width="544" viewBox="0 0 544 544" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 40,32 L 40,272" fill="none" stroke="black"/>
                <path d="M 40,336 L 40,528" fill="none" stroke="black"/>
                <path d="M 64,96 L 64,160" fill="none" stroke="black"/>
                <path d="M 64,448 L 64,512" fill="none" stroke="black"/>
                <path d="M 112,160 L 112,440" fill="none" stroke="black"/>
                <path d="M 128,160 L 128,416" fill="none" stroke="black"/>
                <path d="M 168,160 L 168,224" fill="none" stroke="black"/>
                <path d="M 184,96 L 184,160" fill="none" stroke="black"/>
                <path d="M 304,448 L 304,512" fill="none" stroke="black"/>
                <path d="M 352,80 L 352,160" fill="none" stroke="black"/>
                <path d="M 392,192 L 392,256" fill="none" stroke="black"/>
                <path d="M 392,384 L 392,448" fill="none" stroke="black"/>
                <path d="M 512,80 L 512,160" fill="none" stroke="black"/>
                <path d="M 512,192 L 512,256" fill="none" stroke="black"/>
                <path d="M 512,384 L 512,448" fill="none" stroke="black"/>
                <path d="M 536,32 L 536,272" fill="none" stroke="black"/>
                <path d="M 536,336 L 536,528" fill="none" stroke="black"/>
                <path d="M 40,32 L 536,32" fill="none" stroke="black"/>
                <path d="M 352,80 L 512,80" fill="none" stroke="black"/>
                <path d="M 64,96 L 184,96" fill="none" stroke="black"/>
                <path d="M 184,112 L 344,112" fill="none" stroke="black"/>
                <path d="M 64,160 L 184,160" fill="none" stroke="black"/>
                <path d="M 352,160 L 512,160" fill="none" stroke="black"/>
                <path d="M 392,192 L 512,192" fill="none" stroke="black"/>
                <path d="M 168,224 L 384,224" fill="none" stroke="black"/>
                <path d="M 392,256 L 512,256" fill="none" stroke="black"/>
                <path d="M 40,272 L 536,272" fill="none" stroke="black"/>
                <path d="M 40,336 L 536,336" fill="none" stroke="black"/>
                <path d="M 392,384 L 512,384" fill="none" stroke="black"/>
                <path d="M 128,416 L 384,416" fill="none" stroke="black"/>
                <path d="M 64,448 L 304,448" fill="none" stroke="black"/>
                <path d="M 392,448 L 512,448" fill="none" stroke="black"/>
                <path d="M 64,512 L 304,512" fill="none" stroke="black"/>
                <path d="M 40,528 L 536,528" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="392,416 380,410.4 380,421.6" fill="black" transform="rotate(0,384,416)"/>
                <polygon class="arrowhead" points="392,224 380,218.4 380,229.6" fill="black" transform="rotate(0,384,224)"/>
                <polygon class="arrowhead" points="352,112 340,106.4 340,117.6" fill="black" transform="rotate(0,344,112)"/>
                <polygon class="arrowhead" points="120,440 108,434.4 108,445.6" fill="black" transform="rotate(90,112,440)"/>
                <g class="text">
                  <text x="504" y="52">Cloud</text>
                  <text x="204" y="100">1)</text>
                  <text x="232" y="100">get</text>
                  <text x="296" y="100">credentials</text>
                  <text x="396" y="116">Instance</text>
                  <text x="468" y="116">Metadata</text>
                  <text x="124" y="132">Workload</text>
                  <text x="436" y="132">Service/Endpoint</text>
                  <text x="220" y="212">A)</text>
                  <text x="260" y="212">access</text>
                  <text x="452" y="228">Resource</text>
                  <text x="16" y="308">B1)</text>
                  <text x="68" y="308">federate</text>
                  <text x="152" y="308">B2)</text>
                  <text x="196" y="308">access</text>
                  <text x="340" y="356">External</text>
                  <text x="400" y="356">(e.g.</text>
                  <text x="448" y="356">other</text>
                  <text x="500" y="356">cloud)</text>
                  <text x="452" y="420">Resource</text>
                  <text x="108" y="484">Secure</text>
                  <text x="160" y="484">Token</text>
                  <text x="216" y="484">Service</text>
                  <text x="272" y="484">(STS)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
    +-------------------------------------------------------------+
    |                                                       Cloud |
    |                                                             |
    |                                      +-------------------+  |
    |  +--------------+ 1) get credentials |                   |  |
    |  |              +------------------->| Instance Metadata |  |
    |  |   Workload   |                    |  Service/Endpoint |  |
    |  |              |                    |                   |  |
    |  +-----+-+----+-+                    +-------------------+  |
    |        | |    |                                             |
    |        | |    |                           +--------------+  |
    |        | |    |     A) access             |              |  |
    |        | |    +-------------------------->|   Resource   |  |
    |        | |                                |              |  |
    |        | |                                +--------------+  |
    +--------+-+--------------------------------------------------+
             | |
B1) federate | | B2) access
             | |
    +--------+-+--------------------------------------------------+
    |        | |                      External (e.g. other cloud) |
    |        | |                                                  |
    |        | |                                +--------------+  |
    |        | |                                |              |  |
    |        | +------------------------------->|   Resource   |  |
    |        v                                  |              |  |
    |  +-----------------------------+          +--------------+  |
    |  |                             |                            |
    |  |  Secure Token Service (STS) |                            |
    |  |                             |                            |
    |  +-----------------------------+                            |
    +-------------------------------------------------------------+
]]></artwork>
          </artset>
        </figure>
        <t>The steps shown in <xref target="fig-cloud"/> are:</t>
        <ul spacing="normal">
          <li>
            <t>1) The workload retrieves one or more identity credentials from the Instance
   Metadata Service or Endpoint. This endpoint exposes an API and is available
   at a well-known, but local-only location such as 169.254.169.254. Each
   credential <bcp14>SHOULD</bcp14> be scoped to its intended use with a distinct audience.</t>
          </li>
        </ul>
        <t>When the workload needs to access a resource within the cloud (e.g., located in
the same security boundary; protected by the same issuer as the workload
identity):</t>
        <ul spacing="normal">
          <li>
            <t>A) The workload directly accesses the protected resource with a credential
   scoped for that resource, as issued in Step 1.</t>
          </li>
        </ul>
        <t>When the workload needs to access a resource outside of the cloud (e.g.,
different cloud; same cloud, but different security boundary):</t>
        <ul spacing="normal">
          <li>
            <t>B1) The workload uses a separate cloud-issued credential, audienced for the
    external STS, to federate to the Secure Token Service of the other
    cloud/account. This credential <bcp14>SHOULD NOT</bcp14> be the same as the one used in
    step A). The STS validates the credential and issues a new credential,
    such as an access token to the workload.</t>
          </li>
          <li>
            <t>B2) Using the credential issued in step B1, the workload can access the
    resource outside, assuming the credential has the necessary permissions.</t>
          </li>
        </ul>
        <t>It is important to distinguish the credential obtained from the Instance Metadata
Service from a workload identity document commonly used in attestation systems.
A workload identity document typically represents attestation evidence
that is evaluated by a relying party or attestation service. In contrast,
some credentials issued by the metadata service are already the result of such
attestation and are intended to be directly consumed by relying services for
authentication and authorization decisions.</t>
        <t>In many cloud environments, the credential retrieved from the metadata service
is a bearer token. Possession of such a token is sufficient to use it, which
introduces risks around token handling and exposure. Some providers mitigate this
by constraining token scope, lifetime, or audience, or by requiring additional
proof-of-possession mechanisms. These mechanisms reduce the risk of token replay
or misuse if the token is exfiltrated.</t>
        <t>Care must be taken to avoid using the same bearer credential across different
trust domains without appropriate controls. While direct use of the issued credential
within the same cloud security boundary is common, reusing that credential outside of
its intended scope can increase the risk of credential leakage. The federation step
via the Secure Token Service (Step B1) serves as a boundary, allowing the original
credential to be exchanged for a new credential that is scoped, audience-restricted,
and appropriate for the target resource.</t>
      </section>
      <section anchor="cicd">
        <name>Continuous Integration and Deployment Systems</name>
        <t>Continuous integration and deployment (CI-CD) systems allow their pipelines (or
workflows) to receive an identity at runtime. It is a common task to upload
build outputs and other artifacts to external resources. For this, federation
to external Identity Providers is often necessary.</t>
        <t>As with other platforms, CI-CD workloads may obtain multiple tokens from the
platform, each with a distinct audience for the specific resource or Identity
Provider it needs to interact with.</t>
        <figure anchor="fig-cicd">
          <name>OAuth2 Assertion Flow in a continuous integration/deployment environment</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="352" width="448" viewBox="0 0 448 352" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 40,32 L 40,176" fill="none" stroke="black"/>
                <path d="M 56,80 L 56,160" fill="none" stroke="black"/>
                <path d="M 56,272 L 56,336" fill="none" stroke="black"/>
                <path d="M 112,176 L 112,264" fill="none" stroke="black"/>
                <path d="M 128,176 L 128,240" fill="none" stroke="black"/>
                <path d="M 200,80 L 200,160" fill="none" stroke="black"/>
                <path d="M 216,272 L 216,336" fill="none" stroke="black"/>
                <path d="M 296,208 L 296,272" fill="none" stroke="black"/>
                <path d="M 312,80 L 312,144" fill="none" stroke="black"/>
                <path d="M 416,80 L 416,144" fill="none" stroke="black"/>
                <path d="M 416,208 L 416,272" fill="none" stroke="black"/>
                <path d="M 440,32 L 440,176" fill="none" stroke="black"/>
                <path d="M 40,32 L 440,32" fill="none" stroke="black"/>
                <path d="M 56,80 L 200,80" fill="none" stroke="black"/>
                <path d="M 312,80 L 416,80" fill="none" stroke="black"/>
                <path d="M 208,112 L 312,112" fill="none" stroke="black"/>
                <path d="M 312,144 L 416,144" fill="none" stroke="black"/>
                <path d="M 56,160 L 200,160" fill="none" stroke="black"/>
                <path d="M 40,176 L 440,176" fill="none" stroke="black"/>
                <path d="M 296,208 L 416,208" fill="none" stroke="black"/>
                <path d="M 128,240 L 288,240" fill="none" stroke="black"/>
                <path d="M 56,272 L 216,272" fill="none" stroke="black"/>
                <path d="M 296,272 L 416,272" fill="none" stroke="black"/>
                <path d="M 56,336 L 216,336" fill="none" stroke="black"/>
                <path d="M 96,160 C 104.83064,160 112,167.16936 112,176" fill="none" stroke="black"/>
                <path d="M 112,160 C 120.83064,160 128,167.16936 128,176" fill="none" stroke="black"/>
                <path d="M 128,160 C 119.16936,160 112,167.16936 112,176" fill="none" stroke="black"/>
                <path d="M 104,176 C 112.83064,176 120,168.83064 120,160" fill="none" stroke="black"/>
                <path d="M 120,176 C 111.16936,176 104,168.83064 104,160" fill="none" stroke="black"/>
                <path d="M 136,176 C 127.16936,176 120,168.83064 120,160" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="296,240 284,234.4 284,245.6" fill="black" transform="rotate(0,288,240)"/>
                <polygon class="arrowhead" points="216,112 204,106.4 204,117.6" fill="black" transform="rotate(180,208,112)"/>
                <polygon class="arrowhead" points="120,264 108,258.4 108,269.6" fill="black" transform="rotate(90,112,264)"/>
                <g class="text">
                  <text x="116" y="52">Continuous</text>
                  <text x="208" y="52">Integration</text>
                  <text x="264" y="52">/</text>
                  <text x="316" y="52">Deployment</text>
                  <text x="396" y="52">Platform</text>
                  <text x="220" y="100">1)</text>
                  <text x="268" y="100">schedule</text>
                  <text x="128" y="116">Pipeline/Task</text>
                  <text x="364" y="116">Platform</text>
                  <text x="124" y="132">(Workload)</text>
                  <text x="16" y="228">B1)</text>
                  <text x="68" y="228">federate</text>
                  <text x="152" y="228">B2)</text>
                  <text x="196" y="228">access</text>
                  <text x="356" y="244">Resource</text>
                  <text x="100" y="308">Identity</text>
                  <text x="172" y="308">Provider</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
    +-------------------------------------------------+
    |    Continuous Integration / Deployment Platform |
    |                                                 |
    | +-----------------+             +------------+  |
    | |                 | 1) schedule |            |  |
    | |  Pipeline/Task  |<------------+  Platform  |  |
    | |   (Workload)    |             |            |  |
    | |                 |             +------------+  |
    | +-----+-+---------+                             |
    +--------+-+--------------------------------------+
             | |
             | |                    +--------------+
B1) federate | | B2) access         |              |
             | +------------------->|   Resource   |
             v                      |              |
      +-------------------+         +--------------+
      |                   |
      | Identity Provider |
      |                   |
      +-------------------+
]]></artwork>
          </artset>
        </figure>
        <t>The steps shown in <xref target="fig-cicd"/> are:</t>
        <ul spacing="normal">
          <li>
            <t>1) The CI-CD platform schedules a workload (pipeline or task). Based on
   configuration, a Workload Identity is made available by the platform.</t>
          </li>
          <li>
            <t>B1) The workload uses the platform-issued credential to federate to an
   Identity Provider, which validates the credential and issues a new
   credential, such as an access token, for the workload.</t>
          </li>
          <li>
            <t>B2) The workload uses the issued credential to access resources. For instance,
   an artifact store to upload compiled binaries, or to download libraries
   needed to resolve dependencies. It is also common to access actual
   infrastructure as resources to make deployments or changes to it.</t>
          </li>
        </ul>
        <t>While token structure is vendor-specific, all tokens contain claims carrying
the basic context of the executed tasks, such as source code management data
such as git branch, initiation context and more.</t>
      </section>
      <section anchor="service-meshes">
        <name>Service Meshes</name>
        <t>Service meshes provide infrastructure-level workload identity and secure communication
for applications through sidecar proxies deployed alongside each workload.
In a service mesh, workload identity is typically implemented using X.509 certificates
issued by the service mesh. Service meshes handle identity credential provisioning
to sidecar proxies rather than directly to application workloads. The sidecar intercepts
network traffic and handles authentication transparently to the application code.</t>
        <figure anchor="fig-servicemesh">
          <name>Simple service mesh communication between 2 workloads</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="368" width="512" viewBox="0 0 512 368" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 80,160 L 80,224" fill="none" stroke="black"/>
                <path d="M 80,288 L 80,352" fill="none" stroke="black"/>
                <path d="M 128,64 L 128,152" fill="none" stroke="black"/>
                <path d="M 128,232 L 128,288" fill="none" stroke="black"/>
                <path d="M 176,160 L 176,224" fill="none" stroke="black"/>
                <path d="M 176,288 L 176,352" fill="none" stroke="black"/>
                <path d="M 192,32 L 192,96" fill="none" stroke="black"/>
                <path d="M 312,32 L 312,96" fill="none" stroke="black"/>
                <path d="M 336,160 L 336,224" fill="none" stroke="black"/>
                <path d="M 336,288 L 336,352" fill="none" stroke="black"/>
                <path d="M 384,64 L 384,152" fill="none" stroke="black"/>
                <path d="M 384,232 L 384,288" fill="none" stroke="black"/>
                <path d="M 432,160 L 432,224" fill="none" stroke="black"/>
                <path d="M 432,288 L 432,352" fill="none" stroke="black"/>
                <path d="M 192,32 L 312,32" fill="none" stroke="black"/>
                <path d="M 128,64 L 192,64" fill="none" stroke="black"/>
                <path d="M 312,64 L 384,64" fill="none" stroke="black"/>
                <path d="M 192,96 L 312,96" fill="none" stroke="black"/>
                <path d="M 80,160 L 176,160" fill="none" stroke="black"/>
                <path d="M 336,160 L 432,160" fill="none" stroke="black"/>
                <path d="M 184,190 L 328,190" fill="none" stroke="black"/>
                <path d="M 184,194 L 328,194" fill="none" stroke="black"/>
                <path d="M 80,224 L 176,224" fill="none" stroke="black"/>
                <path d="M 336,224 L 432,224" fill="none" stroke="black"/>
                <path d="M 80,288 L 176,288" fill="none" stroke="black"/>
                <path d="M 336,288 L 432,288" fill="none" stroke="black"/>
                <path d="M 80,352 L 176,352" fill="none" stroke="black"/>
                <path d="M 336,352 L 432,352" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="392,232 380,226.4 380,237.6" fill="black" transform="rotate(270,384,232)"/>
                <polygon class="arrowhead" points="392,152 380,146.4 380,157.6" fill="black" transform="rotate(90,384,152)"/>
                <polygon class="arrowhead" points="336,192 324,186.4 324,197.6" fill="black" transform="rotate(0,328,192)"/>
                <polygon class="arrowhead" points="192,192 180,186.4 180,197.6" fill="black" transform="rotate(180,184,192)"/>
                <polygon class="arrowhead" points="136,232 124,226.4 124,237.6" fill="black" transform="rotate(270,128,232)"/>
                <polygon class="arrowhead" points="136,152 124,146.4 124,157.6" fill="black" transform="rotate(90,128,152)"/>
                <g class="text">
                  <text x="232" y="68">Service</text>
                  <text x="284" y="68">Mesh</text>
                  <text x="12" y="84">1)</text>
                  <text x="48" y="84">issue</text>
                  <text x="404" y="84">1)</text>
                  <text x="440" y="84">issue</text>
                  <text x="60" y="100">identity</text>
                  <text x="452" y="100">identity</text>
                  <text x="40" y="116">and</text>
                  <text x="432" y="116">and</text>
                  <text x="72" y="132">credentials</text>
                  <text x="464" y="132">credentials</text>
                  <text x="196" y="148">3)</text>
                  <text x="256" y="148">communicate</text>
                  <text x="220" y="164">on</text>
                  <text x="260" y="164">behalf</text>
                  <text x="300" y="164">of</text>
                  <text x="248" y="180">workloads</text>
                  <text x="128" y="196">Proxy</text>
                  <text x="384" y="196">Proxy</text>
                  <text x="148" y="260">2)</text>
                  <text x="196" y="260">delegate</text>
                  <text x="404" y="260">2)</text>
                  <text x="452" y="260">delegate</text>
                  <text x="124" y="324">Workload</text>
                  <text x="380" y="324">Workload</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
                       +--------------+
                       |              |
               +-------+ Service Mesh +--------+
1) issue       |       |              |        | 1) issue
   identity    |       +--------------+        |    identity
   and         |                               |    and
   credentials |                               |    credentials
               v       3) communicate          v
         +-----------+    on behalf of   +-----------+
         |           |    workloads      |           |
         |   Proxy   |<=================>|   Proxy   |
         |           |                   |           |
         +-----------+                   +-----------+
               ^                               ^
               | 2) delegate                   | 2) delegate
               |                               |
         +-----+-----+                   +-----+-----+
         |           |                   |           |
         | Workload  |                   | Workload  |
         |           |                   |           |
         +-----------+                   +-----------+
]]></artwork>
          </artset>
        </figure>
        <t>The steps shown in <xref target="fig-servicemesh"/> are:</t>
        <ul spacing="normal">
          <li>
            <t>1) The Service Mesh issues identity credentials to proxies. For X.509-based
   meshes, this consists of an X.509 certificate containing the workload's
   identity along with the associated key pair.</t>
          </li>
          <li>
            <t>2) The proxies act on behalf of workloads that delegate their
   communication to them. In above figure each workload has its
   own proxy that solely represents it and no other workload.</t>
          </li>
          <li>
            <t>3) The proxies communicate with each other on behalf of the workloads
   they represent. This communication includes authentication aspects,
   for instance mutual TLS using X.509 certificates.</t>
          </li>
        </ul>
        <t>In above pattern each workload has a specific sidecar. An alternative deployment is to share proxies between workloads. This often results in a single proxy on each node acting on behalf of all workloads on the node.</t>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>All security considerations in section 8 of <xref target="OAUTH-ASSERTION"/> apply.</t>
      <section anchor="security-credential-delivery">
        <name>Credential Delivery</name>
        <section anchor="general-requirements">
          <name>General Credentials Requirements</name>
          <t>Credentials <bcp14>SHOULD</bcp14> be scoped as narrowly as possible: each <bcp14>SHOULD</bcp14> carry the
smallest set of audiences that lets it serve its purpose. A credential for direct access
to a platform resource <bcp14>SHOULD</bcp14> be scoped to that resource; a credential used to
federate to an Identity Provider <bcp14>SHOULD</bcp14> carry that Identity Provider as its sole audience.
See <xref target="audience"/> for the rationale and for specific requirements on the <tt>aud</tt> claim of
JWT-based credentials.</t>
          <t>As long as the workload platform supports issuance of multiple credentials, a workload
<bcp14>SHOULD</bcp14> obtain a distinct credential for each resource or Identity
Provider it interacts with. In particular, the credential used to federate to an Identity
Provider <bcp14>SHOULD NOT</bcp14> be used for direct platform access; reusing a credential across these
contexts conflates trust boundaries and increases the impact of a compromise
(see <xref target="audience"/>).</t>
        </section>
        <section anchor="security-credential-delivery-env">
          <name>Environment Variables</name>
          <t>Leveraging environment variables to provide credentials presents many security
limitations. Environment variables have a wide set of use cases and are observed
by many components. They are often captured for monitoring, observability,
debugging and logging purposes and sent to components outside of the workload.
Access control is not trivial and does not achieve the same security results as
other methods. Additionally, environment variables may be spoofed or altered
by other processes running on the same host, making them an unreliable transport
for credentials in environments where process isolation is not strictly enforced.</t>
          <t>This approach should be limited to non-production cases where convenience
outweighs security considerations, and the provided secrets are limited in
validity or utility. For example, an initial secret might be used during the
setup of the application.</t>
        </section>
        <section anchor="filesystem-1">
          <name>Filesystem</name>
          <ul spacing="normal">
            <li>
              <t>1) Access control to the mounted file should be configured to limit reads to
   authorized applications. Linux supports solutions such as DAC (uid and
   gid) or MAC (e.g., SELinux, AppArmor).</t>
            </li>
            <li>
              <t>2) Mounted shared memory should be isolated from other host OS paths and
   processes. For example, on Linux this can be achieved by using namespaces.</t>
            </li>
          </ul>
        </section>
        <section anchor="local-api-security">
          <name>Local APIs</name>
          <t>Local APIs often operate in clear-text such as unencrypted HTTP without any
confidentiality or integrity protection. Privileged component on the machine or
in the infrastructure can be able to eavesdrop on the connection and the credential
within it.</t>
          <t>Mitigating measures are required to mitigate a particular variant of Server-Side Request Forgery attacks
against local APIs. For example, requiring a specific header that
cannot be controlled externally or preventing the use of link-local IPs,
including through redirects. See <xref target="application-interaction-with-credential-sources"/> for details.</t>
          <t>Adequate assurance that the identity represents the workload is required to make
sure unauthorized access is denied and credentials are not issued to other
parties when the Local API is unauthenticated. What constitutes adequate
assurance depends on the security requirements of the deployment.
Introspection of the platform, like in SPIFFE or cloud providers, can be used
to identify workloads and grant access. The more fine-grained and strict this
verification, the smaller the attack surface. For instance, allowing access by
IP or other machine-global identifiers permits any process to receive the
identity, while including user ID or other process-scoped identifiers prevents
this broader access.</t>
          <t>The potential for denial-of-service attacks against Local APIs need to be taken
into account and protective measures should be implemented. Depending on the platform
these attacks can affect other workloads and their ability to receive a platform
credential.</t>
        </section>
        <section anchor="application-interaction-with-credential-sources">
          <name>Application Interaction with Credential Sources</name>
          <t>Implementations <bcp14>MUST</bcp14> assume that application vulnerabilities can expose workload credentials
even when platform isolation is correctly configured. Attackers commonly exploit the workload
itself to retrieve credentials rather than accessing the credential service directly.</t>
          <t>For example, untrusted input may be used to manipulate file paths when credentials are mounted
on a filesystem, or to trigger requests to local credential endpoints such as metadata or
workload APIs (for example via server-side request forgery). Similarly, command execution or
unintended outbound requests may result in bearer tokens or proof-of-possession key material
being disclosed.</t>
          <t>Workloads therefore <bcp14>MUST</bcp14> treat credential locations as sensitive security boundaries.
Untrusted input <bcp14>MUST NOT</bcp14> influence how credential files are accessed or how local credential
APIs are contacted. Implementations <bcp14>SHOULD</bcp14> minimise which components can access credentials
and prefer proof-of-possession credentials over bearer tokens where supported. Failure to
minimise credential access increases the attack surface by allowing more code paths to
interact with sensitive material. Failing to use proof-of-possession credentials where
available means that stolen bearer tokens can be replayed by an attacker from any location.</t>
          <t>These risks exist even when credential services are reachable only locally, since compromise
often occurs through application behaviour rather than network access to the credential provider.</t>
        </section>
      </section>
      <section anchor="token-typing">
        <name>Token typing</name>
        <t>Issuers <bcp14>SHOULD</bcp14> strongly type the issued tokens to workloads via the JOSE <tt>typ</tt>
header and Identity Providers accepting these tokens <bcp14>SHOULD</bcp14> validate the
value of it according to policy. See <xref section="3.1" sectionFormat="of" target="JWT-BCP"/> for details
on explicit typing. Without explicit typing, a token intended for one purpose
(e.g., a refresh token or an identity assertion) may be accepted in a context
where a different token type is expected, enabling cross-protocol or
cross-context token confusion attacks.</t>
        <t>Issuers <bcp14>SHOULD</bcp14> use <tt>authorization-grant+jwt</tt> as a <tt>typ</tt> value according to
<xref target="OAUTH-JWT"/>. For broad support, <tt>JWT</tt> or <tt>JOSE</tt> <bcp14>MAY</bcp14> be used by
issuers and accepted by authorization servers but it is important to highlight
that a wide range of tokens, meant for all sorts of purposes, use these values
and would be accepted. Using generic type values such as <tt>JWT</tt> or <tt>JOSE</tt> is
acceptable only when the deployment cannot support more specific types, for
instance due to limitations in existing infrastructure or token libraries. Even
in such cases, additional validation of token claims and context is essential to
mitigate confusion.</t>
      </section>
      <section anchor="custom-claims-are-important-for-context">
        <name>Custom claims are important for context</name>
        <t>Some platform-issued credentials have custom claims that are vital for context
and are required to be validated. For example, in a continuous integration and
deployment platform where a workload is scheduled for a Git repository, the
branch is crucial. A "main" branch may be protected and considered trusted to
federate to external authorization servers. But other branches may not be
allowed to access protected resources.</t>
        <t>Authorization servers that validate assertions <bcp14>SHOULD</bcp14> make use of these claims.
Ignoring custom claims may result in overly permissive authorization decisions,
such as granting a credential issued for an untrusted branch the same access as
one issued for a protected branch. Platform issuers <bcp14>SHOULD</bcp14> allow differentiation
based on the subject claim alone, so that authorization policies can be
expressed without requiring deep knowledge of vendor-specific claim structures.</t>
      </section>
      <section anchor="token-lifetime">
        <name>Token lifetime</name>
        <t>Tokens <bcp14>SHOULD NOT</bcp14> exceed the lifetime of the workloads they represent. For
example, a workload that has an expected lifetime of one hour should not receive
a token valid for two hours or more. A token that outlives its workload may
continue to be accepted by relying parties even after the workload (and its
associated authorization context) has ceased to exist, enabling unauthorized
access if the token is compromised.</t>
        <t>Within the scope of this document, where a platform-issued credential is used
to authenticate to retrieve an access token for an external authorization
domain, short-lived credentials are recommended. Short-lived credentials
reduce the window during which a stolen credential can be exploited and
limit the need for explicit revocation infrastructure.</t>
      </section>
      <section anchor="workload-lifecycle-and-invalidation">
        <name>Workload lifecycle and invalidation</name>
        <t>Platform issuers <bcp14>SHOULD</bcp14> invalidate tokens when the workload stops, pauses, or
ceases to exist and <bcp14>SHOULD</bcp14> offer validators a mechanism to query this status.
Without invalidation, tokens for terminated workloads remain usable until their
natural expiry, creating a window for unauthorized use. Without a status query
mechanism, relying parties have no way to detect that a workload has been
removed and must accept the token as is. How these credentials are
invalidated and the status is queried varies and is not in scope of this
document.</t>
      </section>
      <section anchor="proof-of-possession">
        <name>Proof of possession</name>
        <t>Identity credentials <bcp14>SHOULD</bcp14> be bound to workloads, and proof of possession
<bcp14>SHOULD</bcp14> be performed when these credentials are used. This mitigates token theft.
Without proof of possession, a bearer token intercepted in transit (e.g., via a
compromised log, a man-in-the-middle, or SSRF) can be replayed by any party,
from any location, for the remaining lifetime of the token.
For X.509-based credentials, proof of possession is inherent through the private
key associated with the certificate. For JWT-based credentials, the JWT <bcp14>SHOULD</bcp14>
be key-bound with an adequate proof-of-key-possession mechanism. Where proof of
possession is not supported by the platform or the relying party, deployments
<bcp14>SHOULD</bcp14> compensate with shorter token lifetimes, stricter audience scoping, and
additional network-level controls such as IP allowlisting or mutual TLS. This
proof of possession applies to both the platform credential and the access token
of the external authorization domains.</t>
      </section>
      <section anchor="audience">
        <name>Audience</name>
        <t>For issued credentials in the form of JWTs, they <bcp14>MUST</bcp14> be audienced using the
<tt>aud</tt> claim. Each JWT <bcp14>SHOULD</bcp14> only carry a single audience. Using multiple
audiences in a single token means that any relying party listed in the <tt>aud</tt>
claim can present that token to any other party listed in the same claim,
potentially gaining unintended access. A single-audience token limits the blast
radius if the token is compromised or misused. We RECOMMEND using
URIs to specify audiences. See <xref section="3" sectionFormat="of" target="OAUTH-RESOURCEINDICATORS"/> for more details and
security implications.</t>
        <t>Some workload platforms provide credentials for interacting with their own APIs
(e.g., Kubernetes). These credentials <bcp14>MUST NOT</bcp14> be used beyond the platform API.
In the example of Kubernetes, a token used for anything other than the Kubernetes
API itself <bcp14>MUST NOT</bcp14> carry the Kubernetes server in the <tt>aud</tt> claim. Reusing a
platform API token for federation or resource access outside the platform
conflates trust boundaries: the token's audience includes the platform, so any
relying party that accepts it could impersonate the workload back to the
platform.</t>
      </section>
      <section anchor="multi-tenancy-considerations">
        <name>Multi-Tenancy Considerations</name>
        <t>In multi-tenant platforms, relying parties <bcp14>MUST</bcp14> carefully evaluate which attributes
are considered trustworthy when making authorization decisions. Access or federation
<bcp14>MUST NOT</bcp14> be granted based solely on untrusted or easily forgeable attributes.
In particular, the <tt>issuer</tt> claim in such environments may not uniquely identify
a trusted authority, since each tenant could be configured with the same issuer
identifier.</t>
        <t>Relying parties <bcp14>SHOULD</bcp14> ensure that attributes used for authorization are bound
to a trust domain under their control or validated by an entity with a clearly
defined trust boundary. Failing to do so may allow a malicious tenant to obtain
credentials that are indistinguishable from those of a legitimate tenant, leading
to cross-tenant privilege escalation or unauthorized access to shared resources.</t>
      </section>
    </section>
    <section anchor="IANA">
      <name>IANA Considerations</name>
      <t>This document does not require actions by IANA.</t>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>The authors and contributors would like to thank the following people for their feedback and contributions to this document (in no particular order): Dag Sneeggen, Ned Smith, Dean H. Saxe, Yaron Sheffer, Andrii Deinega, Marcel Levy, Justin Richer, Pieter Kasselmann, Simon Canning, Evan Gilman, Joseph Salowey, Kathleen Moriarty and Flemming Andreasen.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="OAUTH-FRAMEWORK">
          <front>
            <title>The OAuth 2.0 Authorization Framework</title>
            <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6749"/>
          <seriesInfo name="DOI" value="10.17487/RFC6749"/>
        </reference>
        <reference anchor="JWT">
          <front>
            <title>JSON Web Token (JWT)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7519"/>
          <seriesInfo name="DOI" value="10.17487/RFC7519"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="JWK">
          <front>
            <title>JSON Web Key (JWK)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>A JSON Web Key (JWK) is a JavaScript Object Notation (JSON) data structure that represents a cryptographic key. This specification also defines a JWK Set JSON data structure that represents a set of JWKs. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and IANA registries established by that specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7517"/>
          <seriesInfo name="DOI" value="10.17487/RFC7517"/>
        </reference>
        <reference anchor="OAUTH-ASSERTION">
          <front>
            <title>Assertion Framework for OAuth 2.0 Client Authentication and Authorization Grants</title>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="Y. Goland" initials="Y." surname="Goland"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification provides a framework for the use of assertions with OAuth 2.0 in the form of a new client authentication mechanism and a new authorization grant type. Mechanisms are specified for transporting assertions during interactions with a token endpoint; general processing rules are also specified.</t>
              <t>The intent of this specification is to provide a common framework for OAuth 2.0 to interwork with other identity systems using assertions and to provide alternative client authentication mechanisms.</t>
              <t>Note that this specification only defines abstract message flows and processing rules. In order to be implementable, companion specifications are necessary to provide the corresponding concrete instantiations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7521"/>
          <seriesInfo name="DOI" value="10.17487/RFC7521"/>
        </reference>
        <reference anchor="JWT-BCP">
          <front>
            <title>JSON Web Token Best Current Practices</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="D. Hardt" initials="D." surname="Hardt"/>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>JSON Web Tokens, also known as JWTs, are URL-safe JSON-based security tokens that contain a set of claims that can be signed and/or encrypted. JWTs are being widely used and deployed as a simple security token format in numerous protocols and applications, both in the area of digital identity and in other application areas. This Best Current Practices document updates RFC 7519 to provide actionable guidance leading to secure implementation and deployment of JWTs.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="225"/>
          <seriesInfo name="RFC" value="8725"/>
          <seriesInfo name="DOI" value="10.17487/RFC8725"/>
        </reference>
        <reference anchor="OAUTH-JWT">
          <front>
            <title>Updates to OAuth 2.0 JSON Web Token (JWT) Client Authentication and Assertion-Based Authorization Grants</title>
            <author fullname="Michael B. Jones" initials="M. B." surname="Jones">
              <organization>Self-Issued Consulting</organization>
            </author>
            <author fullname="Brian Campbell" initials="B." surname="Campbell">
              <organization>Ping Identity</organization>
            </author>
            <author fullname="Chuck Mortimore" initials="C." surname="Mortimore">
              <organization>Disney</organization>
            </author>
            <author fullname="Filip Skokan" initials="F." surname="Skokan">
              <organization>Okta</organization>
            </author>
            <date day="28" month="April" year="2026"/>
            <abstract>
              <t>   This document updates RFC7521, RFC7522, RFC7523 and RFC9126 with
   respect to the treatment of audience values in OAuth 2.0 Client
   Assertion Authentication and Assertion-based Authorization Grants to
   address a security vulnerability identified in the previous
   requirements for those audience values in multiple OAuth 2.0
   specifications.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-oauth-rfc7523bis-11"/>
        </reference>
        <reference anchor="OAUTH-RESOURCEINDICATORS">
          <front>
            <title>Resource Indicators for OAuth 2.0</title>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="H. Tschofenig" initials="H." surname="Tschofenig"/>
            <date month="February" year="2020"/>
            <abstract>
              <t>This document specifies an extension to the OAuth 2.0 Authorization Framework defining request parameters that enable a client to explicitly signal to an authorization server about the identity of the protected resource(s) to which it is requesting access.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8707"/>
          <seriesInfo name="DOI" value="10.17487/RFC8707"/>
        </reference>
        <reference anchor="OAUTH-TOKENEXCHANGE">
          <front>
            <title>OAuth 2.0 Token Exchange</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="A. Nadalin" initials="A." surname="Nadalin"/>
            <author fullname="B. Campbell" initials="B." role="editor" surname="Campbell"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <date month="January" year="2020"/>
            <abstract>
              <t>This specification defines a protocol for an HTTP- and JSON-based Security Token Service (STS) by defining how to request and obtain security tokens from OAuth 2.0 authorization servers, including security tokens employing impersonation and delegation.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8693"/>
          <seriesInfo name="DOI" value="10.17487/RFC8693"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="KubernetesServiceAccount" target="https://kubernetes.io/docs/concepts/security/service-accounts/">
          <front>
            <title>Kubernetes Service Account</title>
            <author>
              <organization/>
            </author>
            <date year="2024" month="May"/>
          </front>
        </reference>
        <reference anchor="TokenReviewV1" target="https://kubernetes.io/docs/reference/kubernetes-api/authentication-resources/token-review-v1/">
          <front>
            <title>Kubernetes Token Review API V1</title>
            <author>
              <organization/>
            </author>
            <date year="2024" month="August"/>
          </front>
        </reference>
        <reference anchor="TokenRequestV1" target="https://kubernetes.io/docs/reference/kubernetes-api/authentication-resources/token-request-v1/">
          <front>
            <title>Kubernetes Token Request API V1</title>
            <author>
              <organization/>
            </author>
            <date year="2024" month="August"/>
          </front>
        </reference>
        <reference anchor="SPIFFE" target="https://github.com/spiffe/spiffe/blob/main/standards/SPIFFE.md">
          <front>
            <title>Secure Production Identity Framework for Everyone (SPIFFE)</title>
            <author>
              <organization/>
            </author>
            <date year="2023" month="May"/>
          </front>
        </reference>
      </references>
    </references>
    <?line 967?>

<section anchor="variations">
      <name>Variations</name>
      <section anchor="direct-access-to-protected-resources">
        <name>Direct access to protected resources</name>
        <t>Resource servers that protect resources may choose to trust multiple authorization servers, including the one that issues the platform identities. Instead of using the platform-issued identity to receive an access token of a different authorization domain, workloads can directly use the platform-issued identity to access a protected resource.</t>
        <t>In this case, technically, the protected resource and workload are part of the same authorization domain.</t>
      </section>
      <section anchor="custom-assertion-flows">
        <name>Custom assertion flows</name>
        <t>While <xref target="OAUTH-ASSERTION"/> and <xref target="OAUTH-JWT"/> are the proposed standards for this pattern, some authorization servers use <xref target="OAUTH-TOKENEXCHANGE"/> or a custom API for the issuance of an access token based on existing platform identity credentials. These patterns are not recommended and prevent interoperability.</t>
      </section>
    </section>
    <section anchor="document-history">
      <name>Document History</name>
      <t>[[ To be removed from the final specification ]]</t>
      <t>-04</t>
      <ul spacing="normal">
        <li>
          <t>Address review feedback from Kathleen Moriarty and Joe Salowey</t>
        </li>
        <li>
          <t>Expand introduction: explain the workload identity bootstrapping problem and the limitations of static credentials</t>
        </li>
        <li>
          <t>Expand SPIFFE section: trust bundles, JWT-SVID vs X509-SVID types, and Workload API identification</t>
        </li>
        <li>
          <t>Explicitly discuss obtaining multiple tokens with distinct audiences across all platform patterns</t>
        </li>
        <li>
          <t>Add "Application Interaction with Credential Sources" section covering SSRF and path traversal risks</t>
        </li>
        <li>
          <t>Update reference formatting</t>
        </li>
        <li>
          <t>Editorial improvements and updated acknowledgements</t>
        </li>
      </ul>
      <t>-03</t>
      <ul spacing="normal">
        <li>
          <t>Add service-mesh section</t>
        </li>
        <li>
          <t>Add multi-tenancy considerations</t>
        </li>
        <li>
          <t>Add atomicity and flushing requirements to filesystem section</t>
        </li>
        <li>
          <t>Make it clear that invalidation is a matter of querying the status</t>
        </li>
        <li>
          <t>Rework local api section &amp; security considerations</t>
        </li>
        <li>
          <t>Refer to RFC7517 in SPIFFE and add clarity on key distribution</t>
        </li>
        <li>
          <t>Editorial changes</t>
        </li>
      </ul>
      <t>-02</t>
      <ul spacing="normal">
        <li>
          <t>Updated structure, bringing concrete examples back into the main text.</t>
        </li>
        <li>
          <t>Use more generic "federation" term instead of RFC 7523 specifics.</t>
        </li>
        <li>
          <t>Overall editorial improvements.</t>
        </li>
        <li>
          <t>Fix reference of Kubernetes Token Request API</t>
        </li>
        <li>
          <t>Prefer the term "document" over "specification".</t>
        </li>
        <li>
          <t>Update contributor and acknowledgements sections.</t>
        </li>
        <li>
          <t>Remove section about OIDC as it is too specific to a certain implementation.</t>
        </li>
        <li>
          <t>Rewrite abstract to better reflect the current content of the document.</t>
        </li>
      </ul>
      <t>-01</t>
      <ul spacing="normal">
        <li>
          <t>Add credential delivery mechanisms</t>
        </li>
        <li>
          <t>Highlight relationship to other WIMSE work</t>
        </li>
        <li>
          <t>Add details about token typing and relation to OpenID Connect</t>
        </li>
        <li>
          <t>Add security considerations for audience</t>
        </li>
      </ul>
      <t>-00</t>
      <ul spacing="normal">
        <li>
          <t>Rename draft with no content changes.</t>
        </li>
        <li>
          <t>Set Arndt to Editor role.</t>
        </li>
      </ul>
      <t><strong>[as draft-wimse-workload-identity-bcp]</strong></t>
      <t>-02</t>
      <ul spacing="normal">
        <li>
          <t>Move scope from Kubernetes to generic workload identity platform</t>
        </li>
        <li>
          <t>Add various patterns to appendix
          </t>
          <ul spacing="normal">
            <li>
              <t>Kubernetes</t>
            </li>
            <li>
              <t>Cloud providers</t>
            </li>
            <li>
              <t>SPIFFE</t>
            </li>
            <li>
              <t>CI/CD</t>
            </li>
          </ul>
        </li>
        <li>
          <t>Add some security considerations</t>
        </li>
        <li>
          <t>Update title</t>
        </li>
      </ul>
      <t>-01</t>
      <ul spacing="normal">
        <li>
          <t>Editorial updates</t>
        </li>
      </ul>
      <t>-00</t>
      <ul spacing="normal">
        <li>
          <t>Adopted by the WIMSE WG</t>
        </li>
      </ul>
    </section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="B." surname="Hofmann" fullname="Benedikt Hofmann">
        <organization>Siemens</organization>
        <address>
          <email>hofmann.benedikt@siemens.com</email>
        </address>
      </contact>
      <contact initials="H." surname="Tschofenig" fullname="Hannes Tschofenig">
        <organization>Siemens</organization>
        <address>
          <email>hannes.tschofenig@gmx.net</email>
        </address>
      </contact>
      <contact initials="E." surname="Giordano" fullname="Edoardo Giordano">
        <organization>Nokia</organization>
        <address>
          <email>edoardo.giordano@nokia.com</email>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8V96XrbVpbg//sUaPn7JlaZoCXZjm3VMkXLcqwkXsZSylVT
X3UMApckSiDAAUDJLMX9LPMs82RztrsBICUnPT3srysWCdzl3HPPvsRxrNq8
LfRx9LGqL4sqyaKzTJfw3SZ6Xydpm6e6Ucl0WuurgWdUVqVlsoTXszqZtXGu
21l8nS8bHV/Ls3Euz8YrM1588ESlSavnVb05jvJyVimVr+rjqK3XTXt0cPD8
4EgltU6Oo73JalXk8HBelU2UlFn0QSdFfJEv9Z7CKeZ1tV7Bc/3l52X0Zl20
eXS+aVq9jE7Lq7yuyiX83OypS72B17Pj6KxsdV3qNn6JO1CqaWGWn5OiKmFX
G9j8Kj9WUVTPUp017aaQb6OorVLvn3mJ85ovmqpuaz1r7N+bZfBnW+epfTit
lrQo83deFnnpptGf27jImzaGQaZVAY/F1e8ewC8A+2WyWuXlnJ9VybpdVDWs
NoZfcRx4djKOztPFtS4vm3QB0NU1/caHNqnLrB38XS+TvDiOEnygGeOx/nmO
X41hsfRAVcOs5+/PPvyogvn+No4+VE21TC4XlTfT35K6aorkqvOjTLOpzbd/
/leTJoWuw3n+J3+pVFqVALrpuu1u88U4el3NlklZepO+0KXO8ss2+EmmXPBX
46k88+cm13AKTWeD/GW4xdfj6AKAVc10mc+96V7DeLrp/mbmox/Hrf0R4Pl5
DHh3y2Sn4+i7HBA1KX1wnmZVUmdV+JPMpPm38Vx++3NZXeZJuK+3+JVSZVUv
4Wpd6WOFt9D+EUU/rKd0K3RzrusruLSTNK3WgOA0RiQ0wz0VyWORPCePJfVc
A54v2nbVHD98eGmfH+fVQ8Df5iGcaKpXbfOw0em6hnsL/6CR4oRHah7yWBkQ
jOPo8CB6k2yio4Ojx/D1RXWpyw/6KtfXfzncujR6KuLHosn7s+gvh3deHtxa
XWtYovdjnKzyh3jXkNAwaYpr3VTrGmjbwxZng79xtvjqMFj90bNosp7DLets
4H+tddPeYQf03H/dFmi6W/cARODVq9Nw7ed4mBo4SJWtUxzdkeVXNWAwUu4I
EC46vdL1BkhtdJ+H2R/e1jxvF+sp4vDDZpXPZtr8Z1pU04eA9+VDotuA+M1D
Hmm8zIYR55FScRxHyRSoMDAkpS4WeYPEdI1UOMp0kwKJAagDSYdt1pvIMi5a
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
QwLGMsxneuM8CDDPkxcUUFbuOxoOuM1DS9IWvYBT2TPxHtlWF4l+t8mNEVcD
2LKP4X1K76PbHN6997wXuvAxcsSjfe8Gae9398KD7qYoCmuRFDOkIp3f3Wv+
CunfTqPo/x6+BgzqM4L2lz/8sfv5U/D7jtmG4NGfrbe3zmfL3vjz7wMvBL93
X6BSVlikcR7Aevj3/su7P71dPbhlVw9uPbEdKwhA76Iihl/zfv8vPrEggYAJ
ARJXI2iecz8OnwqHDMWGGx459N2dX+Am6QuXASkSwWrQ40YFromSSx4g8hFu
1cyQYA4htT0pfpNSFiiA9iuyoUVasWw1TG/2eoEHuc0ixRleg5JXQBK8eFzO
GBeEJ5uKEZB9IDO7WHKd7ml1ZXv1BSyZbP+5rX10TY3TP294EpDWdGg1z1kE
KatOzgNt4VG4BZ8E0va5400rhdjd1nzwyUJaLJFs5zUunWB/XCO7zzQTrmEp
kmzQtGq5pkDtix/Pt4oSbPFmeJkAxz7AvH5UwuHH0QQjIV2uexYUf0VpAvs2
WOCYKxDIC9akxNb/hrUzXGmh5VwqWQ7VyZDC1QEwUXB1uCIVoUqWE+7ZTipo
nvELod/cs+XNlZoUxdaK6RS0yPH4z3A624h9cn5++gG7LHFFzCOsQYuiijRH
8PqE2EZLbtLBzkH43r3oO+5f4w3QUJ1l0z4QRhnsKhg2auq5q+EQbS1+zKSX
xNNjhq48TqI+B0UvseZ80/Zqv/JFKTTfDa4QjiZoG7s56aZuB/0HKfiyH0I6
6F4PHMa/DzPhTTT4bQ0DuzsbKvwUMUWg2++57M+HsszJmp6wt4NrAFNlJ2eI
9A5KcPETDCElGNBej9kwXL0sDOCcNNTooOuf96wI3AKCPWt0veFchnpi+uWH
VRh/61lTBxLsb7ejGvNpI10ugXS4ouo9/5hJKNtySKp7SOKwtjG7gjmdYN/f
W69IMuDEodhdJeojcbVZwVYJzlR3Udbcxoq9JGI/WK6IDc3Y4A4EiGLk73fr
DeyP+aoO9vi65ZZTCyalfsSwf8qZ2dJkipk3qbM+T7eMiXyUZiJV5MtcYr7H
wbLcgFLT+RpHlEttauM31sXKDW1APgDNkr2gAIaq1NRa7MKU8WeanSYrVK8z
qfwMuntVU7OroKnVyPXD4pLZ3BLLVdtnLZy9nW62bmyH47uToNmUS4PIr4yx
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

-->

</rfc>
