<?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.43 (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-07" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="Workload Identity">Workload Identity Practices</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-wimse-workload-identity-practices-07"/>
    <author initials="A." surname="Schwenkschuster" fullname="Arndt Schwenkschuster">
      <organization>Defakto Security</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="September" day="22"/>
    <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 need to 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="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. Without atomicity a
workload can read a truncated or mixed-generation credential and fail to
authenticate, or fall back to a credential it should no longer use. Not every
filesystem or mount mechanism offers an atomic replace operation; where one is
unavailable, workloads reading the credential need to tolerate a failed read and
retry, and renewing the credential well before it expires leaves room for such a
retry. Solutions expected to 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
unauthorized 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 anchor="env-vars">
        <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>While environment variables are a common delivery pattern, they are highly
susceptible to leakage through logging, process inspection, error reporting, and
other means. Filesystem delivery (<xref target="filesystem"/>) or Local APIs
(<xref target="local-apis"/>) are therefore preferred, and environment variables <bcp14>MUST NOT</bcp14> be used for such credentials
where the platform offers one of these alternatives. Some platforms offer no
other delivery pattern; that case, along with the underlying security
considerations, is discussed in <xref target="security-credential-delivery-env"/>.</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. 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 external systems to validate Service Account Tokens independently,
without requiring direct network access to, or credentials for, the 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. 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>The tokens presented at steps A1, A2 and B1 <bcp14>MUST</bcp14> be different tokens with different
audiences. The token issued by Kubernetes is a Bearer token which enables any holder
to use it, including any party to which it is presented. For example in <xref target="fig-kubernetes"/>:
if the token of step A1 carries the same audience at steps A1 and B1 the Identity
Provider is able to impersonate the workload at the Kubernetes API Server. See
<xref target="audience"/> for security considerations.</t>
        <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, an 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.</t>
          </li>
        </ul>
        <t>The Workload API does not require clients to authenticate themselves. 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. 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>The token presented at step B1 <bcp14>MUST</bcp14> be a different token with a different audience
as the one presented at step A. The JWT-SVID issued by SPIFFE is a Bearer token
which enables any holder to use it. Using the same audience for tokens presented at
step A and B1 for example allows the external Identity Provider to impersonate the
workload at the internal resource  accessed at step A. See <xref target="audience"/> for
security considerations.</t>
        <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>MUST</bcp14> obtain separate credentials for each purpose. The credential
used for internal platform access (step A) <bcp14>MUST 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. Tokens issued in this
pattern are often Bearer credentials and using the same audience for tokens
presented at multiple parties allows these parties to impersonate the workload
at each other. See <xref target="audience"/> for details.</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>MUST</bcp14> be scoped to its intended use with a distinct audience.
   See <xref target="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>MUST 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>The same bearer credential <bcp14>MUST NOT</bcp14> be used 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 and enable
impersonation. 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>
        <t>CI-CD pipelines sometimes use credentials to perform code signing
operations integrity proof of the build output. As explained in the <xref target="security"/>, strength of the integrity is limited to the strength of
the credential used.</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>MUST</bcp14> be scoped as narrowly as possible: each <bcp14>MUST</bcp14> carry the
smallest set of audiences that lets it serve its purpose. A credential for direct
access to a platform resource <bcp14>MUST</bcp14> be scoped to that resource; a credential used
to federate to an Identity Provider <bcp14>MUST</bcp14> carry that Identity Provider as its sole
audience. Re-using a credential across contexts and resources conflates trust
boundaries and increases the impact of a compromise. See <xref target="audience"/> for the
rationale and for specific requirements on the <tt>"aud"</tt> claim of JWT-based
credentials.</t>
          <t>Not every platform allows this. Some issue a single credential per workload, and
some do not let the workload influence the audience of the credentials they
issue. Where either is the case, the requirements above cannot be met and a
credential is necessarily used across contexts. Such deployments cannot rely on
audience scoping to contain a compromise and therefore need to compensate by
other means: keeping credential lifetimes as short as the platform allows,
limiting which components can reach the credential
(<xref target="application-interaction-with-credential-sources"/>), and treating every party
that receives the credential as able to impersonate the workload at every other
party that accepts it (<xref target="audience"/>).</t>
        </section>
        <section anchor="security-credential-delivery-filesystem">
          <name>Filesystem</name>
          <t>Access control to the mounted file <bcp14>MUST</bcp14> be configured to limit reads to
authorized applications. Linux supports solutions such as DAC (uid and gid) or
MAC (e.g., SELinux, AppArmor). Failing to do so allows any party within the
workload and its platform to read the credentials.</t>
          <t>Credentials written to durable storage persist until they are overwritten or
removed, and may be captured in backups, snapshots, or images. Implementations
therefore commonly mount credentials from memory-backed storage instead. Such a
mount can be isolated from other host OS paths and processes to improve security
further. For example, on Linux this can be achieved by using namespaces.</t>
        </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 components on a host or in
the infrastructure may be able to eavesdrop on a connection and view a
credential within it.</t>
          <t>Mitigations are required for Server-Side Request Forgery (SSRF) attacks against
Local APIs. For example, implementations can require a specific header that
cannot be controlled externally or prevent untrusted input from triggering
requests to 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 needs to be taken
into account. Depending on the platform these attacks can affect other workloads
and their ability to receive a platform credential. Where a single Local API
serves more than one workload, protective measures such as rate limiting or
per-caller quotas <bcp14>SHOULD</bcp14> be implemented, unless the platform already bounds the
resources a single caller can consume. Without such measures one workload can
prevent others from obtaining their credentials.</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>For these reasons, environment variables <bcp14>MUST NOT</bcp14> be used to deliver workload
identity credentials in production deployments where the platform offers another
delivery pattern.</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 SSRF). 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 should minimize which components can access credentials
and prefer proof-of-possession credentials over bearer tokens where supported. Failure to
minimize 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 behavior 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 parameter (<xref section="4.1.9" sectionFormat="of" target="JWS"/>), and Identity Providers
accepting these tokens <bcp14>SHOULD</bcp14> validate its value according to policy, unless the
deployment cannot support specific type values as described below. See
<xref section="3.1" sectionFormat="of" target="JWT-BCP"/> for details on explicit typing. Without
explicit typing, a token intended for one purpose such as 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>Where the credential is used as an authorization grant, 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 carry custom claims that are vital for context.
Relying parties need to consider the values of these claims, not merely check
that they are present. 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>MUST</bcp14> evaluate the claims that
carry the context their authorization decision depends on.
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 should allow differentiation
based on the <tt>"sub"</tt> (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>MUST NOT</bcp14> exceed the lifetime of the workload instance they represent,
unless the issuing platform cannot determine that lifetime; in that case the
lifetime is kept as short as the platform allows.
For example, a token valid for two hours or more exceeds the lifetime of a
workload that is expected to run for one hour. 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 <bcp14>RECOMMENDED</bcp14>. 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>MUST</bcp14> invalidate credentials when an instance of the workload
stops, pauses, or ceases to exist, unless the credential lifetime is short enough
that the remaining validity window is acceptable for the deployment. Where
invalidation is not immediate, issuers <bcp14>SHOULD</bcp14> offer validators a mechanism to
query this status, unless the deployment relies solely on short lifetimes as
described in <xref target="token-lifetime"/>. Because a workload may run as multiple instances (for
example, replicas or parallel tasks), this applies to each instance
individually. Without this capability, credentials for terminated instances
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 an instance has been removed. 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 the workload instance they represent,
and proof of possession <bcp14>SHOULD</bcp14> be performed when these credentials are used,
unless neither the platform nor the relying party supports a proof-of-possession
mechanism; in that case the compensating controls described below apply.
This reduces the impact of token theft to the scope of the proof of possession.</t>
        <t>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.</t>
        <t>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>MUST</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>MUST NOT</bcp14> carry more than one
audience, unless multiple credentials cannot be obtained or the audience cannot
be influenced as described in <xref target="general-requirements"/>. 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. Expressing audiences as URIs
avoids ambiguity between deployments and is therefore recommended. 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>"iss"</tt> (issuer) 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>MUST</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, Pieter Kasselmann, Simon Canning, Evan Gilman, Joseph Salowey, Kathleen Moriarty, Brian Campbell, Judith Kahrer and Flemming Andreasen.</t>
      <t>The authors would also like to thank Justin Richer for serving as document shepherd and Charles Eckel for his AD evaluation of this document.</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="JWS">
          <front>
            <title>JSON Web Signature (JWS)</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 Signature (JWS) represents content secured with digital signatures or Message Authentication Codes (MACs) using JSON-based data structures. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and an IANA registry defined by that specification. Related encryption capabilities are described in the separate JSON Web Encryption (JWE) specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7515"/>
          <seriesInfo name="DOI" value="10.17487/RFC7515"/>
        </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 1030?>

<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 discouraged as they prevent interoperability.</t>
      </section>
    </section>
    <section anchor="document-history">
      <name>Document History</name>
      <t>[[ To be removed from the final specification ]]</t>
      <t>-07</t>
      <ul spacing="normal">
        <li>
          <t>Address AD feedback by by hardening <bcp14>SHOULD</bcp14>/<bcp14>MUST</bcp14> normative text</t>
        </li>
      </ul>
      <t>-06</t>
      <ul spacing="normal">
        <li>
          <t>Address AD evaluation comments from Charles Eckel</t>
        </li>
        <li>
          <t>Address review feedback from Andrii Deinega</t>
        </li>
        <li>
          <t>Review use of BCP 14 language for consistency</t>
        </li>
        <li>
          <t>Reformat the filesystem security considerations and cover
credentials on durable storage</t>
        </li>
        <li>
          <t>Reference RFC 7515 for the JOSE "typ" header parameter</t>
        </li>
        <li>
          <t>Clarify Kubernetes JWK Set validation, SPIFFE Workload API client
authentication, custom claim validation and workload invalidation</t>
        </li>
        <li>
          <t>Update author affiliation</t>
        </li>
        <li>
          <t>Update acknowledgements</t>
        </li>
        <li>
          <t>Editorial improvements</t>
        </li>
      </ul>
      <t>-05</t>
      <ul spacing="normal">
        <li>
          <t>Rework introduction and abstract to remove normative language</t>
        </li>
        <li>
          <t>Differentiate cloud provider credentials from workload identities</t>
        </li>
        <li>
          <t>Discourage the use of environment variables for credentials</t>
        </li>
        <li>
          <t>Clean up references and make diagram labelling consistent</t>
        </li>
        <li>
          <t>Editorial improvements to the abstract, cloud provider section and examples</t>
        </li>
      </ul>
      <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//sUaPn7JlaZpCUvsa1UVRcty7GSeBlLKVdN
fdUxSFySiECAjQtKZsvuZ5lnmSebs90NACk56elRf10xSeAu55579mU4HKom
bwp9lHyo6ouiSrPkNNMlfLdJ3tXptMmn2qh0Mqn1Zc8zKqumZbqE17M6nTXD
XDez4VW+NHp4Jc8Oc3l2uLLjDQ+eqGna6HlVb46SvJxVSuWr+ihp6rVpHhwc
PDt4oNJap0fJ3ni1KnJ4OK9Kk6RllrzXaTE8z5d6T+EU87par+C57vLzMnm9
Lpo8OduYRi+Tk/Iyr6tyCT+bPXWhN/B6dpSclo2uS90MX+AOlDINzPJLWlQl
7GoDm1/lRypJ6tlUZ6bZFPJtkjTVNPhnXuK89gtT1U2tZ8Z93iyjj02dT93D
02pJi7Kf87LISz+N/tQMi9w0QxhkUhXw2LD6wz34BWC/TFervJzzsypdN4uq
htUO4VccB54dj5Kz6eJKlxdmugDo6pp+40Mb12XW9P6ul2leHCUpPmBGeKx/
meNXI1gsPVDVMOsLPUsvmio509N1jegQTf33UfK+MtUyvVhUwaR/T+vKFOll
60eZcVPbb//yH2aaFrqOp/xf/KVS06oEKE7WTXvHz0fJq2q2TMsymPS5LnWW
XzTRTzLlgr8aTeSZv5hcw4GYeOIz/jLe4qtRcg5wq2a6zOfBdK9gPG3av9n5
6MdR434E0H4aAQreMNnJKPk+B5xNyxCcJ1mV1lkV/yQzaf5tNJff/lJWF3ka
7+sNfqVUWdVLuGWX+kjhhXQfkuTH9YQuiDZnur6E+zueTqs14DqNkQj58E8l
8lgiz8ljaT3XgPKLplmZo/v3L9zzo7y6D6hs7sOJTvWqMfeNoBP8g0YapjyS
uc9jZUA7jpLDg+R1ukkeHDx4BF+fVxe6fK8vc33118OtS6OnEn4sGb87Tf56
eOvlwQXWtYYlBj8O01V+H68d0hymUsNam2pdA5m73+Bs8BlnG14eRqt/8DQZ
r+dw4Vob+Pe1Ns0tdkDP/fdtgaa7cQ9n705fvjyJ1060QQMzqbL1FEf3FPpl
DRiMRDwBhEtOLnW9Aaqb3OVh9vu3Nc+bxXqCOHzfrPLZTNv/TIpqch/wvrxP
JBwQ39znkUbLrB9xHio1HA6TdAIEGXiTUueL3CBdXSNBTjJtpkBiAOpA3WGb
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
wxTetM5knFWrwCvIyPLhe/V/ARYi19tP2QAA

-->

</rfc>
