<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 3.4.9) -->
<?rfc rfcedstyle="yes"?>
<?rfc tocindent="yes"?>
<?rfc strict="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc text-list-symbols="-o*+"?>
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-wimse-workload-identity-practices-06" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="Workload Identity">Workload Identity Practices</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-wimse-workload-identity-practices-06"/>
    <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="August" day="11"/>
    <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). Solutions <bcp14>SHOULD</bcp14> also
perform a flush operation immediately after the update to minimize the chance
of race conditions and ensure durability.</t>
      </section>
      <section anchor="local-apis">
        <name>Local APIs</name>
        <t>In this pattern, the workload obtains credentials by communicating with a
Local API exposed by the credential issuer. Implementations commonly use UNIX
domain sockets (e.g., SPIFFE), loopback interfaces, or link-local "magic addresses"
169.254.169.254 commonly used for cloud provider Instance Metadata Services as
the transport mechanism.</t>
        <t>Local APIs support re-provisioning of updated credentials, either on demand
or through persistent connections that enable the issuer to push new credentials.
This enables the use of short-lived, narrowly scoped credentials, improving
security posture compared to long-lived secrets.</t>
        <t>The security of this approach relies heavily on network isolation to prevent
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. Tokens <bcp14>SHOULD</bcp14> have a minimal set of audiences;
see <xref target="audience"/> for more details and security implications.</t>
          </li>
        </ul>
        <t>To validate service account tokens, Kubernetes allows workloads to:</t>
        <ul spacing="normal">
          <li>
            <t>Make use of the Token Review API <xref target="TokenReviewV1"/>. This API introspects the
token, makes sure it hasn't been invalidated and returns the claims.</t>
          </li>
          <li>
            <t>Mount the public keys used to sign the tokens into the file system of the
workload. This allows workloads to validate a token's signature without
calling the Token Review API.</t>
          </li>
          <li>
            <t>Optionally, a JSON Web Key Set <xref target="JWK"/> is exposed via a web server. This
allows 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. This token <bcp14>SHOULD NOT</bcp14> be the same
    token used for steps A1 or A2. The Identity Provider validates the token
    and issues a new credential to the workload, such as an OAuth 2.0 access
    token.</t>
          </li>
          <li>
            <t>B2) Using the credential issued in step C1, the application within the Pod
    accesses resources outside of the cluster.</t>
          </li>
        </ul>
        <t>As an example, the following JSON illustrates the claims contained in a Kubernetes Service
Account token.</t>
        <figure anchor="fig-kubernetes-token">
          <name>Example Kubernetes Service Account Token claims</name>
          <sourcecode type="json"><![CDATA[
{
  "aud": [
    # matches the requested audiences, or the API server's
    # default audiences when none are explicitly requested
    "https://kubernetes.default.svc"
  ],
  "exp": 1731613413,
  "iat": 1700077413,
  "iss":
    # matches the first value passed to the
    # --service-account-issuer flag
    "https://kubernetes.default.svc",
  "jti":
    # ServiceAccountTokenJTI feature must be enabled
    # for the claim to be present
    "ea28ed49-2e11-4280-9ec5-bc3d1d84661a",
  "kubernetes.io": {
    "namespace": "my-namespace",
    "node": {
      # ServiceAccountTokenPodNodeInfo feature must be enabled
      # for the API server to add this node reference claim
      "name": "127.0.0.1",
      "uid": "58456cb0-dd00-45ed-b797-5578fdceaced"
    },
    "pod": {
      "name": "my-workload-69cbfb9798-jv9gn",
      "uid": "778a530c-b3f4-47c0-9cd5-ab018fb64f33"
    },
    "serviceaccount": {
      "name": "my-workload",
      "uid": "a087d5a0-e1dd-43ec-93ac-f13d89cd13af"
    },
    "warnafter": 1700081020
  },
  "nbf": 1700077413,
  "sub": "system:serviceaccount:my-namespace:my-workload"
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="spiffe">
        <name>Secure Production Identity Framework For Everyone (SPIFFE)</name>
        <t>The Secure Production Identity Framework For Everyone, also known as SPIFFE <xref target="SPIFFE"/>, is
a Cloud Native Computing Foundation (CNCF) project that defines a "Workload API"
to deliver machine identity to workloads. Workloads can retrieve identity
credentials in one of two forms:</t>
        <ul spacing="normal">
          <li>
            <t>X509-SVID, a X.509 certificate containing the workload's SPIFFE ID in the Subject
Alternative Name (SAN) URI field, along with the corresponding key pair.</t>
          </li>
          <li>
            <t>JWT-SVID, a signed JWT containing the workload's SPIFFE ID in the <tt>"sub"</tt>
claim.</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. This
    <bcp14>SHOULD</bcp14> be a separate JWT-SVID from the one used in step A). The
    Identity Provider validates the JWT-SVID and issues a new credential
    such as an OAuth 2.0 access token, to the workload.</t>
          </li>
          <li>
            <t>B2) Using the credential issued in step B1, the workload can access resources
    outside of its trust domain.</t>
          </li>
        </ul>
        <t>Here are example claims for a JWT-SVID:</t>
        <sourcecode type="json"><![CDATA[
{
  "aud": [
    "external-authorization-server"
  ],
  "exp": 1729087175,
  "iat": 1729086875,
  "sub": "spiffe://example.org/myservice"
}
]]></sourcecode>
      </section>
      <section anchor="cloudproviders">
        <name>Cloud Providers</name>
        <t>Workload forms in cloud platforms vary. Historically, virtual
machines were the most common. The introduction of containerization brought
hosted container environments or Kubernetes clusters. Containers have evolved
into <tt>serverless</tt> offerings. Regardless of the actual workload packaging,
distribution, or runtime platform, all these workloads need identities.</t>
        <t>The biggest cloud providers have established the pattern of an "Instance
Metadata Endpoint". Aside from allowing workloads to retrieve metadata about
themselves, it also allows them to receive identity. The credential types
offered can vary, and JWTs are commonly found across cloud providers.
The issued credential provides proof to anyone it is being presented to that the
workload platform has attested the workload and it can be considered
authenticated.</t>
        <t>Within a cloud provider, the issued credential can often directly be used to
access resources of any kind across the platform, making integration between the
services straightforward. From the workload perspective, no credential needs to be
issued, provisioned, rotated or revoked, as everything is handled internally by
the platform.</t>
        <t>This is not true for resources outside of the platform, such as on-premise
resources, generic web servers or other cloud provider resources. Here, the
workload first needs to federate to the Secure Token Service (STS) of the
respective cloud, which is effectively an Identity Provider. The STS issues
a new credential with which the workload can then access resources.</t>
        <t>This pattern also applies when accessing resources in the same cloud but across
different security boundaries (e.g., different account or tenant). The actual
flows and implementations may vary in these situations though.</t>
        <t>When a workload needs to access both internal platform resources and external
resources, it <bcp14>SHOULD</bcp14> obtain separate credentials for each purpose. The credential
used for internal platform access (step A) <bcp14>SHOULD NOT</bcp14> be reused for federation
to an external STS (step B1), as these represent different trust and audience
boundaries. The workload may need to contact the Instance Metadata Service
multiple times to obtain appropriately scoped credentials.</t>
        <figure anchor="fig-cloud">
          <name>Workload identity in a cloud provider</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="544" width="544" viewBox="0 0 544 544" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 40,32 L 40,272" fill="none" stroke="black"/>
                <path d="M 40,336 L 40,528" fill="none" stroke="black"/>
                <path d="M 64,96 L 64,160" fill="none" stroke="black"/>
                <path d="M 64,448 L 64,512" fill="none" stroke="black"/>
                <path d="M 112,160 L 112,440" fill="none" stroke="black"/>
                <path d="M 128,160 L 128,416" fill="none" stroke="black"/>
                <path d="M 168,160 L 168,224" fill="none" stroke="black"/>
                <path d="M 184,96 L 184,160" fill="none" stroke="black"/>
                <path d="M 304,448 L 304,512" fill="none" stroke="black"/>
                <path d="M 352,80 L 352,160" fill="none" stroke="black"/>
                <path d="M 392,192 L 392,256" fill="none" stroke="black"/>
                <path d="M 392,384 L 392,448" fill="none" stroke="black"/>
                <path d="M 512,80 L 512,160" fill="none" stroke="black"/>
                <path d="M 512,192 L 512,256" fill="none" stroke="black"/>
                <path d="M 512,384 L 512,448" fill="none" stroke="black"/>
                <path d="M 536,32 L 536,272" fill="none" stroke="black"/>
                <path d="M 536,336 L 536,528" fill="none" stroke="black"/>
                <path d="M 40,32 L 536,32" fill="none" stroke="black"/>
                <path d="M 352,80 L 512,80" fill="none" stroke="black"/>
                <path d="M 64,96 L 184,96" fill="none" stroke="black"/>
                <path d="M 184,112 L 344,112" fill="none" stroke="black"/>
                <path d="M 64,160 L 184,160" fill="none" stroke="black"/>
                <path d="M 352,160 L 512,160" fill="none" stroke="black"/>
                <path d="M 392,192 L 512,192" fill="none" stroke="black"/>
                <path d="M 168,224 L 384,224" fill="none" stroke="black"/>
                <path d="M 392,256 L 512,256" fill="none" stroke="black"/>
                <path d="M 40,272 L 536,272" fill="none" stroke="black"/>
                <path d="M 40,336 L 536,336" fill="none" stroke="black"/>
                <path d="M 392,384 L 512,384" fill="none" stroke="black"/>
                <path d="M 128,416 L 384,416" fill="none" stroke="black"/>
                <path d="M 64,448 L 304,448" fill="none" stroke="black"/>
                <path d="M 392,448 L 512,448" fill="none" stroke="black"/>
                <path d="M 64,512 L 304,512" fill="none" stroke="black"/>
                <path d="M 40,528 L 536,528" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="392,416 380,410.4 380,421.6" fill="black" transform="rotate(0,384,416)"/>
                <polygon class="arrowhead" points="392,224 380,218.4 380,229.6" fill="black" transform="rotate(0,384,224)"/>
                <polygon class="arrowhead" points="352,112 340,106.4 340,117.6" fill="black" transform="rotate(0,344,112)"/>
                <polygon class="arrowhead" points="120,440 108,434.4 108,445.6" fill="black" transform="rotate(90,112,440)"/>
                <g class="text">
                  <text x="504" y="52">Cloud</text>
                  <text x="204" y="100">1)</text>
                  <text x="232" y="100">get</text>
                  <text x="296" y="100">credentials</text>
                  <text x="396" y="116">Instance</text>
                  <text x="468" y="116">Metadata</text>
                  <text x="124" y="132">Workload</text>
                  <text x="436" y="132">Service/Endpoint</text>
                  <text x="220" y="212">A)</text>
                  <text x="260" y="212">access</text>
                  <text x="452" y="228">Resource</text>
                  <text x="16" y="308">B1)</text>
                  <text x="68" y="308">federate</text>
                  <text x="152" y="308">B2)</text>
                  <text x="196" y="308">access</text>
                  <text x="340" y="356">External</text>
                  <text x="400" y="356">(e.g.</text>
                  <text x="448" y="356">other</text>
                  <text x="500" y="356">cloud)</text>
                  <text x="452" y="420">Resource</text>
                  <text x="108" y="484">Secure</text>
                  <text x="160" y="484">Token</text>
                  <text x="216" y="484">Service</text>
                  <text x="272" y="484">(STS)</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
    +-------------------------------------------------------------+
    |                                                       Cloud |
    |                                                             |
    |                                      +-------------------+  |
    |  +--------------+ 1) get credentials |                   |  |
    |  |              +------------------->| Instance Metadata |  |
    |  |   Workload   |                    |  Service/Endpoint |  |
    |  |              |                    |                   |  |
    |  +-----+-+----+-+                    +-------------------+  |
    |        | |    |                                             |
    |        | |    |                           +--------------+  |
    |        | |    |     A) access             |              |  |
    |        | |    +-------------------------->|   Resource   |  |
    |        | |                                |              |  |
    |        | |                                +--------------+  |
    +--------+-+--------------------------------------------------+
             | |
B1) federate | | B2) access
             | |
    +--------+-+--------------------------------------------------+
    |        | |                      External (e.g. other cloud) |
    |        | |                                                  |
    |        | |                                +--------------+  |
    |        | |                                |              |  |
    |        | +------------------------------->|   Resource   |  |
    |        v                                  |              |  |
    |  +-----------------------------+          +--------------+  |
    |  |                             |                            |
    |  |  Secure Token Service (STS) |                            |
    |  |                             |                            |
    |  +-----------------------------+                            |
    +-------------------------------------------------------------+
]]></artwork>
          </artset>
        </figure>
        <t>The steps shown in <xref target="fig-cloud"/> are:</t>
        <ul spacing="normal">
          <li>
            <t>1) The workload retrieves one or more identity credentials from the Instance
   Metadata Service or Endpoint. This endpoint exposes an API and is available
   at a well-known, but local-only location such as 169.254.169.254. Each
   credential <bcp14>SHOULD</bcp14> be scoped to its intended use with a distinct audience.</t>
          </li>
        </ul>
        <t>When the workload needs to access a resource within the cloud (e.g., located in
the same security boundary; protected by the same issuer as the workload
identity):</t>
        <ul spacing="normal">
          <li>
            <t>A) The workload directly accesses the protected resource with a credential
   scoped for that resource, as issued in Step 1.</t>
          </li>
        </ul>
        <t>When the workload needs to access a resource outside of the cloud (e.g.,
different cloud; same cloud, but different security boundary):</t>
        <ul spacing="normal">
          <li>
            <t>B1) The workload uses a separate cloud-issued credential, audienced for the
    external STS, to federate to the Secure Token Service of the other
    cloud/account. This credential <bcp14>SHOULD NOT</bcp14> be the same as the one used in
    step A). The STS validates the credential and issues a new credential,
    such as an access token to the workload.</t>
          </li>
          <li>
            <t>B2) Using the credential issued in step B1, the workload can access the
    resource outside, assuming the credential has the necessary permissions.</t>
          </li>
        </ul>
        <t>It is important to distinguish the credential obtained from the Instance Metadata
Service from a workload identity document commonly used in attestation systems.
A workload identity document typically represents attestation evidence
that is evaluated by a relying party or attestation service. In contrast,
some credentials issued by the metadata service are already the result of such
attestation and are intended to be directly consumed by relying services for
authentication and authorization decisions.</t>
        <t>In many cloud environments, the credential retrieved from the metadata service
is a bearer token. Possession of such a token is sufficient to use it, which
introduces risks around token handling and exposure. Some providers mitigate this
by constraining token scope, lifetime, or audience, or by requiring additional
proof-of-possession mechanisms. These mechanisms reduce the risk of token replay
or misuse if the token is exfiltrated.</t>
        <t>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>SHOULD</bcp14> be scoped as narrowly as possible: each <bcp14>SHOULD</bcp14> carry the
smallest set of audiences that lets it serve its purpose. A credential for direct access
to a platform resource <bcp14>SHOULD</bcp14> be scoped to that resource; a credential used to
federate to an Identity Provider <bcp14>SHOULD</bcp14> carry that Identity Provider as its sole audience.
See <xref target="audience"/> for the rationale and for specific requirements on the <tt>"aud"</tt> claim of
JWT-based credentials.</t>
          <t>As long as the workload platform supports issuance of multiple credentials, a workload
<bcp14>SHOULD</bcp14> obtain a distinct credential for each resource or Identity
Provider it interacts with. In particular, the credential used to federate to an Identity
Provider <bcp14>SHOULD NOT</bcp14> be used for direct platform access; reusing a credential across these
contexts conflates trust boundaries and increases the impact of a compromise
(see <xref target="audience"/>).</t>
        </section>
        <section anchor="security-credential-delivery-filesystem">
          <name>Filesystem</name>
          <t>Access control to the mounted file <bcp14>SHOULD</bcp14> be configured to limit reads to
authorized applications. Linux supports solutions such as DAC (uid and gid) or
MAC (e.g., SELinux, AppArmor).</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 <bcp14>SHOULD</bcp14> be isolated from other host OS paths and processes. 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 and protective measures <bcp14>SHOULD</bcp14> be implemented. Depending on the platform
these attacks can affect other workloads and their ability to receive a platform
credential.</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 <bcp14>SHOULD</bcp14> 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. See
<xref section="3.1" sectionFormat="of" target="JWT-BCP"/> for details on explicit typing. Without explicit typing, a token intended for one purpose
(e.g., a refresh token or an identity assertion) may be accepted in a context
where a different token type is expected, enabling cross-protocol or
cross-context token confusion attacks.</t>
        <t>Issuers <bcp14>SHOULD</bcp14> use <tt>authorization-grant+jwt</tt> as a <tt>"typ"</tt> value according to
<xref target="OAUTH-JWT"/>. For broad support, <tt>JWT</tt> or <tt>JOSE</tt> <bcp14>MAY</bcp14> be used by
issuers and accepted by authorization servers but it is important to highlight
that a wide range of tokens, meant for all sorts of purposes, use these values
and would be accepted. Using generic type values such as <tt>JWT</tt> or <tt>JOSE</tt> is
acceptable only when the deployment cannot support more specific types, for
instance due to limitations in existing infrastructure or token libraries. Even
in such cases, additional validation of token claims and context is essential to
mitigate confusion.</t>
      </section>
      <section anchor="custom-claims-are-important-for-context">
        <name>Custom claims are important for context</name>
        <t>Some platform-issued credentials 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>SHOULD</bcp14> make use of these claims.
Ignoring custom claims may result in overly permissive authorization decisions,
such as granting a credential issued for an untrusted branch the same access as
one issued for a protected branch. Platform issuers <bcp14>SHOULD</bcp14> allow differentiation
based on the <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>SHOULD NOT</bcp14> exceed the lifetime of the workloads instance they represent.
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>SHOULD</bcp14> invalidate credentials when an instance of the workload
stops, pauses, or ceases to exist and <bcp14>SHOULD</bcp14> offer validators a mechanism to
query this status. 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.
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>SHOULD</bcp14> compensate with shorter token lifetimes, stricter audience scoping, and
additional network-level controls such as IP allowlisting or mutual TLS. This
proof of possession applies to both the platform credential and the access token
of the external authorization domains.</t>
      </section>
      <section anchor="audience">
        <name>Audience</name>
        <t>For issued credentials in the form of JWTs, they <bcp14>MUST</bcp14> be audienced using the
<tt>"aud"</tt> claim. Each JWT <bcp14>SHOULD</bcp14> only carry a single audience. Using multiple
audiences in a single token means that any relying party listed in the <tt>"aud"</tt>
claim can present that token to any other party listed in the same claim,
potentially gaining unintended access. A single-audience token limits the blast
radius if the token is compromised or misused. We RECOMMEND using
URIs to specify audiences. See <xref section="3" sectionFormat="of" target="OAUTH-RESOURCEINDICATORS"/> for more details and
security implications.</t>
        <t>Some workload platforms provide credentials for interacting with their own APIs
(e.g., Kubernetes). These credentials <bcp14>MUST NOT</bcp14> be used beyond the platform API.
In the example of Kubernetes, a token used for anything other than the Kubernetes
API itself <bcp14>MUST NOT</bcp14> carry the Kubernetes server in the <tt>"aud"</tt> claim. Reusing a
platform API token for federation or resource access outside the platform
conflates trust boundaries: the token's audience includes the platform, so any
relying party that accepts it could impersonate the workload back to the
platform.</t>
      </section>
      <section anchor="multi-tenancy-considerations">
        <name>Multi-Tenancy Considerations</name>
        <t>In multi-tenant platforms, relying parties <bcp14>MUST</bcp14> carefully evaluate which attributes
are considered trustworthy when making authorization decisions. Access or federation
<bcp14>MUST NOT</bcp14> be granted based solely on untrusted or easily forgeable attributes.
In particular, the <tt>"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>SHOULD</bcp14> ensure that attributes used for authorization are bound
to a trust domain under their control or validated by an entity with a clearly
defined trust boundary. Failing to do so may allow a malicious tenant to obtain
credentials that are indistinguishable from those of a legitimate tenant, leading
to cross-tenant privilege escalation or unauthorized access to shared resources.</t>
      </section>
    </section>
    <section anchor="IANA">
      <name>IANA Considerations</name>
      <t>This document does not require actions by IANA.</t>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>The authors and contributors would like to thank the following people for their feedback and contributions to this document (in no particular order): Dag Sneeggen, Ned Smith, Dean H. Saxe, Yaron Sheffer, Andrii Deinega, Marcel Levy, 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 986?>

<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>-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:
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
cu25xhhZPn6n/i+leYQbGc0AAA==

-->

</rfc>
