<?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.21 (Ruby 3.3.0) -->
<?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-00" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.25.0 -->
  <front>
    <title abbrev="Workload Identity">Workload Identity Practices</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-wimse-workload-identity-practices-00"/>
    <author initials="A." surname="Schwenkschuster" fullname="Arndt Schwenkschuster" role="editor">
      <organization>SPIRL</organization>
      <address>
        <email>arndts.ietf@gmail.com</email>
      </address>
    </author>
    <author initials="B." surname="Hofmann" fullname="Benedikt Hofmann">
      <organization>Siemens</organization>
      <address>
        <email>hofmann.benedikt@siemens.com</email>
      </address>
    </author>
    <author initials="H." surname="Tschofenig" fullname="Hannes Tschofenig">
      <organization>Siemens</organization>
      <address>
        <email>hannes.tschofenig@gmx.net</email>
      </address>
    </author>
    <author initials="E." surname="Giordano" fullname="Edoardo Giordano">
      <organization>Nokia</organization>
      <address>
        <email>edoardo.giordano@nokia.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="2024" month="December" day="04"/>
    <area>Applications and Real-Time</area>
    <workgroup>Workload Identity in Multi System Environments</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 87?>

<t>The use of the OAuth 2.0 framework in container orchestration systems poses challenges, particularly in managing credentials such as client_id and client_secret, which can be complex and prone to errors. To address this, the industry has shifted towards a federation-based approach where credentials of the underlying workload platform are used as assertions towards an OAuth authorization server, leveraging the Assertion Framework for OAuth 2.0 Client Authentication <xref target="RFC7521"/>, specifically <xref target="RFC7523"/>.</t>
      <t>This specification describes a meta flow in <xref target="overview"/>, gives security recommendations in <xref target="recommendations"/> and outlines concrete patterns in <xref target="patterns"/>.</t>
    </abstract>
  </front>
  <middle>
    <?line 93?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Workloads often require access to external resources to perform their tasks. For example, access to a database, a web server or another workload. These resources are protected by an authorization server and can only be accessed with an access token. The challenge for workloads is to get this access token issued.</t>
      <t>Traditionally, workloads were provisioned with client credentials and use the corresponding client credential flow (Section 1.3.4 <xref target="RFC6749"/>) to retrieve an access token. This model comes with a set of challenges that make it insecure and high-maintenance. Secret materials need to be provisioned and rotated, which often happens manually. It also can be stolen and used by attackers to impersonate the workload.</t>
      <t>A solution to this problem is to not provision secret material to the workload and use the platform the workload runs on to attest for it. Many workload platforms offer a credential, in most cases a JWT token. Signed by a platform-internal authorization server, the credential attests the workload and its attributes. Based on <xref target="RFC7521"/> and its JWT profile <xref target="RFC7523"/>, this credential can then be used as a client assertion towards a different authorization server.</t>
    </section>
    <section anchor="terminology">
      <name>Terminology</name>
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
"OPTIONAL" 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>
      <t>For the scope of this specification, the term authorization server is only used for the authorization server of the external authorization domain as highlighted in <xref target="fig-overview"/>.</t>
      <t>Even though, technically, the platform credential is also issued by an authorization server within the workload platform, this specification only refers to it as "platform issuer" or just "platform".</t>
    </section>
    <section anchor="oauth-assertion-in-workload-environments">
      <name>OAuth Assertion in Workload Environments</name>
      <section anchor="overview">
        <name>Overview</name>
        <t><xref target="fig-overview"/> illustrates a generic pattern that applies across all of the patterns described in <xref target="patterns"/>:</t>
        <figure anchor="fig-overview">
          <name>OAuth2 Assertion Flow in generic Workload Environment</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="416" width="496" viewBox="0 0 496 416" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 16,32 L 16,160" fill="none" stroke="black"/>
                <path d="M 16,272 L 16,400" fill="none" stroke="black"/>
                <path d="M 32,80 L 32,144" fill="none" stroke="black"/>
                <path d="M 40,320 L 40,384" fill="none" stroke="black"/>
                <path d="M 96,144 L 96,208" fill="none" stroke="black"/>
                <path d="M 96,240 L 96,320" fill="none" stroke="black"/>
                <path d="M 176,144 L 176,176" fill="none" stroke="black"/>
                <path d="M 176,208 L 176,320" fill="none" stroke="black"/>
                <path d="M 224,240 L 224,320" fill="none" stroke="black"/>
                <path d="M 240,80 L 240,144" fill="none" stroke="black"/>
                <path d="M 256,320 L 256,336" fill="none" stroke="black"/>
                <path d="M 256,368 L 256,384" fill="none" stroke="black"/>
                <path d="M 288,80 L 288,144" fill="none" stroke="black"/>
                <path d="M 352,320 L 352,336" fill="none" stroke="black"/>
                <path d="M 352,368 L 352,384" fill="none" stroke="black"/>
                <path d="M 376,144 L 376,176" fill="none" stroke="black"/>
                <path d="M 376,208 L 376,240" fill="none" stroke="black"/>
                <path d="M 456,80 L 456,144" fill="none" stroke="black"/>
                <path d="M 464,320 L 464,384" fill="none" stroke="black"/>
                <path d="M 488,32 L 488,160" fill="none" stroke="black"/>
                <path d="M 488,272 L 488,400" fill="none" stroke="black"/>
                <path d="M 16,32 L 488,32" fill="none" stroke="black"/>
                <path d="M 32,80 L 240,80" fill="none" stroke="black"/>
                <path d="M 288,80 L 456,80" fill="none" stroke="black"/>
                <path d="M 32,144 L 88,144" fill="none" stroke="black"/>
                <path d="M 104,144 L 240,144" fill="none" stroke="black"/>
                <path d="M 288,144 L 368,144" fill="none" stroke="black"/>
                <path d="M 384,144 L 456,144" fill="none" stroke="black"/>
                <path d="M 16,160 L 488,160" fill="none" stroke="black"/>
                <path d="M 224,240 L 376,240" fill="none" stroke="black"/>
                <path d="M 16,272 L 488,272" fill="none" stroke="black"/>
                <path d="M 40,320 L 168,320" fill="none" stroke="black"/>
                <path d="M 184,320 L 256,320" fill="none" stroke="black"/>
                <path d="M 352,320 L 464,320" fill="none" stroke="black"/>
                <path d="M 256,352 L 352,352" fill="none" stroke="black"/>
                <path d="M 40,384 L 256,384" fill="none" stroke="black"/>
                <path d="M 352,384 L 464,384" fill="none" stroke="black"/>
                <path d="M 16,400 L 488,400" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="384,144 372,138.4 372,149.6" fill="black" transform="rotate(270,376,144)"/>
                <polygon class="arrowhead" points="360,352 348,346.4 348,357.6" fill="black" transform="rotate(0,352,352)"/>
                <polygon class="arrowhead" points="264,352 252,346.4 252,357.6" fill="black" transform="rotate(180,256,352)"/>
                <polygon class="arrowhead" points="184,320 172,314.4 172,325.6" fill="black" transform="rotate(90,176,320)"/>
                <polygon class="arrowhead" points="104,144 92,138.4 92,149.6" fill="black" transform="rotate(270,96,144)"/>
                <g class="text">
                  <text x="268" y="52">External</text>
                  <text x="360" y="52">Authorization</text>
                  <text x="444" y="52">Domain</text>
                  <text x="112" y="116">Authorization</text>
                  <text x="196" y="116">Server</text>
                  <text x="336" y="116">Protected</text>
                  <text x="412" y="116">Resource</text>
                  <text x="132" y="196">3)</text>
                  <text x="172" y="196">access</text>
                  <text x="224" y="196">token</text>
                  <text x="340" y="196">4)</text>
                  <text x="380" y="196">access</text>
                  <text x="12" y="228">2)</text>
                  <text x="56" y="228">present</text>
                  <text x="128" y="228">assertion</text>
                  <text x="364" y="292">Workload</text>
                  <text x="436" y="292">Platform</text>
                  <text x="404" y="340">Credential</text>
                  <text x="140" y="356">Workload</text>
                  <text x="388" y="356">issued</text>
                  <text x="428" y="356">by</text>
                  <text x="276" y="372">1)</text>
                  <text x="312" y="372">pull/</text>
                  <text x="396" y="372">Platform</text>
                  <text x="308" y="388">push</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
 +----------------------------------------------------------+
 |                           External Authorization Domain  |
 |                                                          |
 | +-------------------------+     +--------------------+   |
 | |                         |     |                    |   |
 | |   Authorization Server  |     | Protected Resource |   |
 | |                         |     |                    |   |
 | +-------^---------+-------+     +----------^---------+   |
 +---------+---------+------------------------+-------------+
           |         |                        |
           |   3) access token           4) access
           |         |                        |
2) present assertion |                        |
           |         |     +------------------+
           |         |     |
 +---------+---------+-----+--------------------------------+
 |         |         |     |             Workload Platform  |
 |         |         |     |                                |
 |  +------+---------v-----+---+           +-------------+  |
 |  |                          |           | Credential  |  |
 |  |        Workload          <-----------> issued by   |  |
 |  |                          | 1) pull/  | Platform    |  |
 |  +--------------------------+    push   +-------------+  |
 +----------------------------------------------------------+
]]></artwork>
          </artset>
        </figure>
        <t>The figure outlines the following steps which are applicable in any pattern.</t>
        <ul spacing="normal">
          <li>
            <t>1) retrieve credential issued by platform. The way this is achieved and whether this is workload (pull) or platform (push) initiated differs based on the platform.</t>
          </li>
          <li>
            <t>2) present credential as an assertion towards an authorization server in an external authorization domain. This step uses the assertion_grant flow defined in <xref target="RFC7521"/> and, in case of JWT format, <xref target="RFC7523"/>.</t>
          </li>
          <li>
            <t>3) On success, an access token is returned to the workload to access the protected resource.</t>
          </li>
          <li>
            <t>4) The access token is used to access a protected resource in the external authorization domain. For instance by making a HTTP call.</t>
          </li>
        </ul>
        <t>Accessing different protected resources may require steps 2) to 4) again with different scope parameters. Accessing a protected resource in an entirely different authorization domain often requires the entire flow to be followed again, to retrieve a new platform-issued credential with an audience for the external authorization server. This, however, differs based on the platform and implementation.</t>
      </section>
      <section anchor="credential-format">
        <name>Credential format</name>
        <t>For the scope of this document we focus on JSON Web Token credential formats. Other formats such as X.509 certificates are possible but not as widely seen as JSON Web Tokens.</t>
        <t>The claims in the present assertion vary greatly based on use case and actual platform, but a minimum set of claims are seen across all of them. <xref target="RFC7523"/> describes them in detail and according to it, all MUST be present.</t>
        <sourcecode type="json"><![CDATA[
{
  "iss": "https://example.org",
  "sub": "my-workload",
  "aud": "target-audience",
  "exp": 1729248124
}
]]></sourcecode>
        <t>For the scope of this specification, the claims can be described the following. Everything from <xref target="RFC7523"/> applies.</t>
        <dl newline="true">
          <dt>iss</dt>
          <dd>
            <t>The issuer of the workload platform. While this can have any format, it is important to highlight that many authorization servers leverage OpenID Connect <xref target="OIDC"/> and/or OAuth 2.0 Authorization Server Metadata <xref target="RFC8414"/> to retrieve JSON Web Keys <xref target="RFC7517"/> for validation purposes.</t>
          </dd>
          <dt>sub</dt>
          <dd>
            <t>Subject which identifies the workload within the domain/workload platform instance.</t>
          </dd>
          <dt>audience</dt>
          <dd>
            <t>One or many audiences the platform issued credential is eligible for. This is crucial when presenting the credential as an assertion towards the external authorization server which MUST identify itself as an audience present in the assertion.</t>
          </dd>
        </dl>
      </section>
    </section>
    <section anchor="recommendations">
      <name>Security Recommendations</name>
      <t>All security considerations in section 8 of <xref target="RFC7521"/> apply.</t>
      <section anchor="issuer-subject-and-audience-validation">
        <name>Issuer, subject and audience validation</name>
        <t>Any authorization server that validates and accepts platform-issued credentials MUST take the following claims into account before accepting assertions:</t>
        <ul spacing="normal">
          <li>
            <t>Issuer</t>
          </li>
          <li>
            <t>Subject</t>
          </li>
          <li>
            <t>Audience</t>
          </li>
          <li>
            <t>Expiration</t>
          </li>
        </ul>
        <t>Failure to verify any of these properties can result in impersonation or accepting an assertion that was issued for a different purpose.</t>
      </section>
      <section anchor="token-type-validation">
        <name>Token type validation</name>
        <t>Authorization servers MUST validate the token type of the assertion. For example, OAuth Refresh or ID tokens MUST NOT be accepted.</t>
      </section>
      <section anchor="custom-claims-are-important-for-context">
        <name>Custom claims are important for context</name>
        <t>Some platform issued credentials have custom claims that are vital for context and are required to be validated. For example in a continuous integration and deployment platform where a workload is scheduled for a GIT repository, the branch is crucial. A 'main' branch may be protected and considered trusted to federate to external authorization servers, other branches may not be and are not allowed to access protected resources.</t>
        <t>Authorization servers that validate assertions SHOULD make use of these claims. Platform issuers SHOULD allow differentiation based on the subject claim alone.</t>
      </section>
      <section anchor="token-lifetime">
        <name>Token lifetime</name>
        <t>Tokens SHOULD NOT exceed the lifetime of the workloads they represent. For example, a workload that has an expected lifetime of an hour should not receive a token valid for 2 hours or more.</t>
        <t>For the scope of this specification, where a platform issued credential is used to authenticate to retrieve an access token for an external authorization domain, a short-lived credential is recommended.</t>
      </section>
      <section anchor="workload-lifecycle-and-invalidation">
        <name>Workload lifecycle and invalidation</name>
        <t>Platform issuers SHOULD invalidate those when the workload stops, pauses or ceases to exist. How these credentials are invalidated is not in scope of this specification.</t>
      </section>
      <section anchor="proof-of-possession">
        <name>Proof of possession</name>
        <t>Credentials SHOULD be bound to workloads and proof of possession SHOULD be performed when these credentials are used. This mitigates token theft. This proof of possession applies to the platform credential and the access token of the external authorization domains.</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>Add your name here.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <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="RFC7521">
          <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="RFC7523">
          <front>
            <title>JSON Web Token (JWT) Profile for OAuth 2.0 Client Authentication and Authorization Grants</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="B. Campbell" initials="B." surname="Campbell"/>
            <author fullname="C. Mortimore" initials="C." surname="Mortimore"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification defines the use of a JSON Web Token (JWT) Bearer Token as a means for requesting an OAuth 2.0 access token as well as for client authentication.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7523"/>
          <seriesInfo name="DOI" value="10.17487/RFC7523"/>
        </reference>
        <reference anchor="RFC6749">
          <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="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="RFC8414">
          <front>
            <title>OAuth 2.0 Authorization Server Metadata</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <author fullname="J. Bradley" initials="J." surname="Bradley"/>
            <date month="June" year="2018"/>
            <abstract>
              <t>This specification defines a metadata format that an OAuth 2.0 client can use to obtain the information needed to interact with an OAuth 2.0 authorization server, including its endpoint locations and authorization server capabilities.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8414"/>
          <seriesInfo name="DOI" value="10.17487/RFC8414"/>
        </reference>
        <reference anchor="RFC7519">
          <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="RFC7517">
          <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="RFC8693">
          <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="OIDC" target="https://openid.net/specs/openid-connect-core-1_0.html">
          <front>
            <title>OpenID Connect Core 1.0 incorporating errata set 1</title>
            <author>
              <organization>Sakimura, N., Bradley, J., Jones, M., de Medeiros, B., and C. Mortimore</organization>
            </author>
            <date year="2014" month="November"/>
          </front>
        </reference>
        <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>
      </references>
    </references>
    <?line 235?>

<section anchor="patterns">
      <name>Patterns</name>
      <section anchor="kubernetes">
        <name>Kubernetes</name>
        <t>In Kubernetes, the primary concept of machine identity is implemented through "service accounts" <xref target="KubernetesServiceAccount"/>. These accounts can be explicitly created or a default one is automatically assigned. Service accounts utilize JSON Web Tokens (JWTs) <xref target="RFC7519"/> as their credential format, with these tokens being cryptographically signed by the Kubernetes Control Plane.</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 (which is particularly relevant to the scope of this document).</t>
        <t>To programatically use service accounts, workloads can:</t>
        <ul spacing="normal">
          <li>
            <t>use the Token Request API <xref target="TokenReviewV1"/> of the control plane</t>
          </li>
          <li>
            <t>have the token projected into the file system of the workload. This is commonly referred to as "projected service accout token".</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, when a Kubernetes Deployment is removed from the server. It is important to highlight, that invalidation is only in effect if the Token Review API <xref target="TokenReviewV1"/> of Kubernetes is used to validate the token.</t>
          </li>
        </ul>
        <t>To validate service account tokens, Kubernetes offers workloads to:</t>
        <ul spacing="normal">
          <li>
            <t>make us 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 decentrally validate the tokens signature.</t>
          </li>
          <li>
            <t>Optionally, a JSON Web Key Set <xref target="RFC7517"/> is exposed via a webserver. This allows the Service Account Token to be validated outside of the cluster and without line of sight towards the actual Kubernetes Control Plane API.</t>
          </li>
        </ul>
        <figure anchor="fig-kubernetes">
          <name>OAuth2 Assertion Flow in a Kubernetes Workload Environment</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="592" width="464" viewBox="0 0 464 592" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,176" fill="none" stroke="black"/>
                <path d="M 8,272 L 8,576" fill="none" stroke="black"/>
                <path d="M 24,80 L 24,144" fill="none" stroke="black"/>
                <path d="M 40,480 L 40,544" fill="none" stroke="black"/>
                <path d="M 48,320 L 48,384" fill="none" stroke="black"/>
                <path d="M 80,144 L 80,192" fill="none" stroke="black"/>
                <path d="M 80,224 L 80,320" fill="none" stroke="black"/>
                <path d="M 88,384 L 88,416" fill="none" stroke="black"/>
                <path d="M 88,448 L 88,480" fill="none" stroke="black"/>
                <path d="M 192,144 L 192,224" fill="none" stroke="black"/>
                <path d="M 192,256 L 192,320" fill="none" stroke="black"/>
                <path d="M 224,384 L 224,416" fill="none" stroke="black"/>
                <path d="M 224,464 L 224,480" fill="none" stroke="black"/>
                <path d="M 240,80 L 240,144" fill="none" stroke="black"/>
                <path d="M 240,288 L 240,320" fill="none" stroke="black"/>
                <path d="M 256,80 L 256,144" fill="none" stroke="black"/>
                <path d="M 280,320 L 280,384" fill="none" stroke="black"/>
                <path d="M 344,144 L 344,192" fill="none" stroke="black"/>
                <path d="M 344,224 L 344,288" fill="none" stroke="black"/>
                <path d="M 384,480 L 384,544" fill="none" stroke="black"/>
                <path d="M 424,80 L 424,144" fill="none" stroke="black"/>
                <path d="M 456,32 L 456,176" fill="none" stroke="black"/>
                <path d="M 456,272 L 456,576" fill="none" stroke="black"/>
                <path d="M 8,32 L 456,32" fill="none" stroke="black"/>
                <path d="M 24,80 L 240,80" fill="none" stroke="black"/>
                <path d="M 256,80 L 424,80" fill="none" stroke="black"/>
                <path d="M 24,144 L 72,144" fill="none" stroke="black"/>
                <path d="M 88,144 L 240,144" fill="none" stroke="black"/>
                <path d="M 256,144 L 336,144" fill="none" stroke="black"/>
                <path d="M 352,144 L 424,144" fill="none" stroke="black"/>
                <path d="M 8,176 L 456,176" fill="none" stroke="black"/>
                <path d="M 8,272 L 456,272" fill="none" stroke="black"/>
                <path d="M 240,288 L 344,288" fill="none" stroke="black"/>
                <path d="M 48,320 L 184,320" fill="none" stroke="black"/>
                <path d="M 200,320 L 280,320" fill="none" stroke="black"/>
                <path d="M 48,384 L 80,384" fill="none" stroke="black"/>
                <path d="M 96,384 L 216,384" fill="none" stroke="black"/>
                <path d="M 232,384 L 280,384" fill="none" stroke="black"/>
                <path d="M 40,480 L 384,480" fill="none" stroke="black"/>
                <path d="M 40,544 L 384,544" fill="none" stroke="black"/>
                <path d="M 8,576 L 456,576" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="352,144 340,138.4 340,149.6" fill="black" transform="rotate(270,344,144)"/>
                <polygon class="arrowhead" points="232,384 220,378.4 220,389.6" fill="black" transform="rotate(270,224,384)"/>
                <polygon class="arrowhead" points="200,320 188,314.4 188,325.6" fill="black" transform="rotate(90,192,320)"/>
                <polygon class="arrowhead" points="96,384 84,378.4 84,389.6" fill="black" transform="rotate(270,88,384)"/>
                <polygon class="arrowhead" points="88,144 76,138.4 76,149.6" fill="black" transform="rotate(270,80,144)"/>
                <g class="text">
                  <text x="244" y="52">External</text>
                  <text x="336" y="52">Authorization</text>
                  <text x="420" y="52">Domain</text>
                  <text x="104" y="116">Authorization</text>
                  <text x="188" y="116">Server</text>
                  <text x="304" y="116">Protected</text>
                  <text x="380" y="116">Resource</text>
                  <text x="12" y="212">3)</text>
                  <text x="56" y="212">present</text>
                  <text x="128" y="212">assertion</text>
                  <text x="316" y="212">5)</text>
                  <text x="356" y="212">access</text>
                  <text x="148" y="244">4)</text>
                  <text x="188" y="244">access</text>
                  <text x="240" y="244">token</text>
                  <text x="404" y="292">Kubernetes</text>
                  <text x="416" y="308">Cluster</text>
                  <text x="116" y="356">Workload</text>
                  <text x="52" y="436">1)</text>
                  <text x="100" y="436">schedule</text>
                  <text x="180" y="436">2)</text>
                  <text x="232" y="436">projected</text>
                  <text x="304" y="436">service</text>
                  <text x="224" y="452">account</text>
                  <text x="280" y="452">token</text>
                  <text x="124" y="516">Kubernetes</text>
                  <text x="200" y="516">Control</text>
                  <text x="256" y="516">Plane</text>
                  <text x="288" y="516">/</text>
                  <text x="328" y="516">kubelet</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+-------------------------------------------------------+
|                         External Authorization Domain |
|                                                       |
| +--------------------------+ +--------------------+   |
| |                          | |                    |   |
| |   Authorization Server   | | Protected Resource |   |
| |                          | |                    |   |
| +------^-------------+-----+ +----------^---------+   |
|        |             |                  |             |
+--------+-------------+------------------+-------------+
         |             |                  |
3) present assertion   |              5) access
         |             |                  |
         |       4) access token          |
         |             |                  |
+--------+-------------+------------------+-------------+
|        |             |     +------------+  Kubernetes |
|        |             |     |                  Cluster |
|    +---+-------------v-----+----+                     |
|    |                            |                     |
|    |    Workload                |                     |
|    |                            |                     |
|    +----^----------------^------+                     |
|         |                |                            |
|         |                |                            |
|    1) schedule     2) projected service               |
|         |             account token                   |
|         |                |                            |
|   +-----+----------------+-------------------+        |
|   |                                          |        |
|   |     Kubernetes Control Plane / kubelet   |        |
|   |                                          |        |
|   +------------------------------------------+        |
|                                                       |
+-------------------------------------------------------+
]]></artwork>
          </artset>
        </figure>
        <t>The steps shown in <xref target="fig-kubernetes"/> are:</t>
        <ul spacing="normal">
          <li>
            <t>1) The Kubernetes Control Plane schedules the workload. This is much simplified and technically happens asynchronously.</t>
          </li>
          <li>
            <t>2) The Kubernetes Control Plane projects the service account token into the workload. This step is also much simplified and technically happens alongside the scheduling with step 1.</t>
          </li>
          <li>
            <t>3) Workloads present the projected service account token as a client assertion towards an external authorization server according to <xref target="RFC7523"/>.</t>
          </li>
          <li>
            <t>4) On success, an access token is returned to the workload to access the protected resource.</t>
          </li>
          <li>
            <t>5) The access token is used to access the protected resource in the external authorization domain.</t>
          </li>
        </ul>
        <t>As an example, the following JSON showcases the claims a Kubernetes Service Account token carries.</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": "https://kubernetes.default.svc",  # matches the first value passed to the --service-account-issuer flag
  "jti": "ea28ed49-2e11-4280-9ec5-bc3d1d84661a",  # ServiceAccountTokenJTI feature must be enabled for the claim to be present
  "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>Secure Production Identity Framework For Everyone, also known as SPIFFE, is a cloud native compute foundation (CNCF) adopted project which defines an API defined called "Workload API" to delivery machine identity to workloads. Workloads can retrieve either X509 based or JWT credentials without the need to authenticate making it very easy to use. How workloads authenticate on the API is not part of the specification. It is common to use platform metadata from the operating system and the workload platform for authentication on the Workload API.</t>
        <t>For the scope of this document, the JWT formatted credential is the most relevant one. SPIFFE referres to it as "JWT-SVID" (JWT - SPIFFE Verifiable Identity Document).</t>
        <t>Workloads are required to specify at least one audience when requesting a JWT-SVID from the Workload API.</t>
        <t>To allow validation, SPIFFE offers</t>
        <ul spacing="normal">
          <li>
            <t>to download a set JWK encoded public keys that can be used to validate JWT signatures. In SPIFFE this is referred to as the "JWT trust bundle".</t>
          </li>
          <li>
            <t>invoke a validation method on the Workload API to validate JWT-SVIDs</t>
          </li>
        </ul>
        <t>Additionally, many SPIFFE deployments choose to separately publish the signing keys as a JSON Web Key Set on a web server to allow validation where the Workload API is not available.</t>
        <t>The following figure illustrates how a workload can use its JWT-SVID to access a protected resource outside of SPIFFE.</t>
        <figure anchor="fig-spiffe">
          <name>OAuth2 Assertion Flow in a SPIFFE Environment</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="480" width="480" viewBox="0 0 480 480" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,144" fill="none" stroke="black"/>
                <path d="M 8,240 L 8,464" fill="none" stroke="black"/>
                <path d="M 32,256 L 32,320" fill="none" stroke="black"/>
                <path d="M 32,384 L 32,448" fill="none" stroke="black"/>
                <path d="M 40,64 L 40,128" fill="none" stroke="black"/>
                <path d="M 88,128 L 88,160" fill="none" stroke="black"/>
                <path d="M 88,192 L 88,256" fill="none" stroke="black"/>
                <path d="M 192,144 L 192,192" fill="none" stroke="black"/>
                <path d="M 192,224 L 192,256" fill="none" stroke="black"/>
                <path d="M 208,320 L 208,336" fill="none" stroke="black"/>
                <path d="M 208,368 L 208,384" fill="none" stroke="black"/>
                <path d="M 232,64 L 232,128" fill="none" stroke="black"/>
                <path d="M 264,64 L 264,128" fill="none" stroke="black"/>
                <path d="M 336,128 L 336,160" fill="none" stroke="black"/>
                <path d="M 336,192 L 336,256" fill="none" stroke="black"/>
                <path d="M 376,256 L 376,320" fill="none" stroke="black"/>
                <path d="M 376,384 L 376,448" fill="none" stroke="black"/>
                <path d="M 448,64 L 448,128" fill="none" stroke="black"/>
                <path d="M 472,32 L 472,144" fill="none" stroke="black"/>
                <path d="M 472,240 L 472,464" fill="none" stroke="black"/>
                <path d="M 8,32 L 472,32" fill="none" stroke="black"/>
                <path d="M 40,64 L 232,64" fill="none" stroke="black"/>
                <path d="M 264,64 L 448,64" fill="none" stroke="black"/>
                <path d="M 40,128 L 80,128" fill="none" stroke="black"/>
                <path d="M 96,128 L 232,128" fill="none" stroke="black"/>
                <path d="M 264,128 L 328,128" fill="none" stroke="black"/>
                <path d="M 344,128 L 448,128" fill="none" stroke="black"/>
                <path d="M 8,144 L 472,144" fill="none" stroke="black"/>
                <path d="M 8,240 L 472,240" fill="none" stroke="black"/>
                <path d="M 32,256 L 184,256" fill="none" stroke="black"/>
                <path d="M 200,256 L 376,256" fill="none" stroke="black"/>
                <path d="M 32,320 L 376,320" fill="none" stroke="black"/>
                <path d="M 32,384 L 200,384" fill="none" stroke="black"/>
                <path d="M 216,384 L 376,384" fill="none" stroke="black"/>
                <path d="M 32,448 L 376,448" fill="none" stroke="black"/>
                <path d="M 8,464 L 472,464" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="344,128 332,122.4 332,133.6" fill="black" transform="rotate(270,336,128)"/>
                <polygon class="arrowhead" points="216,384 204,378.4 204,389.6" fill="black" transform="rotate(90,208,384)"/>
                <polygon class="arrowhead" points="200,256 188,250.4 188,261.6" fill="black" transform="rotate(90,192,256)"/>
                <polygon class="arrowhead" points="96,128 84,122.4 84,133.6" fill="black" transform="rotate(270,88,128)"/>
                <g class="text">
                  <text x="260" y="52">External</text>
                  <text x="352" y="52">Authorization</text>
                  <text x="436" y="52">Domain</text>
                  <text x="104" y="100">Authorization</text>
                  <text x="188" y="100">Server</text>
                  <text x="320" y="100">Protected</text>
                  <text x="396" y="100">Resource</text>
                  <text x="20" y="180">2)</text>
                  <text x="64" y="180">present</text>
                  <text x="136" y="180">assertion</text>
                  <text x="308" y="180">4)</text>
                  <text x="348" y="180">access</text>
                  <text x="156" y="212">3)</text>
                  <text x="196" y="212">access</text>
                  <text x="248" y="212">token</text>
                  <text x="428" y="260">Workload</text>
                  <text x="428" y="276">Platform</text>
                  <text x="212" y="292">Workload</text>
                  <text x="156" y="356">1)</text>
                  <text x="184" y="356">get</text>
                  <text x="236" y="356">JWT-SVID</text>
                  <text x="148" y="420">SPIFFE</text>
                  <text x="212" y="420">Workload</text>
                  <text x="264" y="420">API</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+---------------------------------------------------------+
|                           External Authorization Domain |
|   +-----------------------+   +----------------------+  |
|   |                       |   |                      |  |
|   | Authorization Server  |   |  Protected Resource  |  |
|   |                       |   |                      |  |
|   +-----^-----------------+   +--------^-------------+  |
+---------+------------+-----------------+----------------+
          |            |                 |
 2) present assertion  |             4) access
          |            |                 |
          |       3) access token        |
          |            |                 |
+---------+------------+-----------------+----------------+
|  +------+------------v-----------------+----+  Workload |
|  |                                          |  Platform |
|  |                  Workload                |           |
|  |                                          |           |
|  +---------------------+--------------------+           |
|                        |                                |
|                 1) get JWT-SVID                         |
|                        |                                |
|  +---------------------v--------------------+           |
|  |                                          |           |
|  |           SPIFFE Workload API            |           |
|  |                                          |           |
|  +------------------------------------------+           |
+---------------------------------------------------------+
]]></artwork>
          </artset>
        </figure>
        <t>The steps shown in <xref target="fig-spiffe"/> are:</t>
        <ul spacing="normal">
          <li>
            <t>1) The workload request a JWT-SVID from the SPIFFE Workload API with an audience that identifies the external authorization server.</t>
          </li>
          <li>
            <t>2) The workload presents the JWT-SVID as a client assertion in the assertion flow based on <xref target="RFC7523"/>.</t>
          </li>
          <li>
            <t>3) On success, an access token is returned to the workload to access the protected resource.</t>
          </li>
          <li>
            <t>4) The access token is used to access the protected resource in the external authorization domain.</t>
          </li>
        </ul>
        <t>The claims of a JWT-SVID for example look like this:</t>
        <sourcecode type="json"><![CDATA[
{
  "aud": [
    "external-authorization-server"
  ],
  "exp": 1729087175,
  "iat": 1729086875,
  "sub": "spiffe://example.org/myservice"
}
]]></sourcecode>
        <t>TODO: write about "iss" in JWT-SVID.</t>
      </section>
      <section anchor="cloudproviders">
        <name>Cloud Providers</name>
        <t>Workload in cloud platforms can have any shape or form. Historically, virtual machines were the most common, with the introduction of containerization, hosted container environment or Kubernetes clusters were introduced, and lately, <tt>serverless</tt> functions are offered. Regardless of the actual workload packaging, distribution and runtime platform, all are in need of identity.</t>
        <t>To create a common identity interface across cloud services and offerings, the pattern of an <tt>Instance Metadata Endpoint</tt> has been established by the biggest cloud providers. Next to the option for workloads to get metadata about themselves, it also allows them to receive identity. The credential types offered can vary. JWT, however, is the one that is common across all of them. The issued credential allows 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 easy and <tt>credential less</tt>. While the term is technically misleading, from a user perspective, no credential needs to be issued, provisioned, rotated or revoked, as everything is handled internally by the platform.</t>
        <t>Resources outside of the platform, for example resources or workloads in other clouds, generic web servers or on-premise resources, are most of the time, however, protected by different domains and authorization servers and deny the platform issued credential. In this scenario, the pattern of using the platform issued credential as an assertion in the context of <xref target="RFC7521"/>, for JWT particularly <xref target="RFC7523"/> towards the authorization server that protected the resource to get an access token.</t>
        <figure anchor="fig-cloud">
          <name>OAuth2 Assertion Flow in a cloud environment</name>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="544" width="496" viewBox="0 0 496 544" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 32,32 L 32,176" fill="none" stroke="black"/>
                <path d="M 32,272 L 32,528" fill="none" stroke="black"/>
                <path d="M 48,80 L 48,144" fill="none" stroke="black"/>
                <path d="M 64,320 L 64,384" fill="none" stroke="black"/>
                <path d="M 64,448 L 64,512" fill="none" stroke="black"/>
                <path d="M 104,144 L 104,192" fill="none" stroke="black"/>
                <path d="M 104,224 L 104,320" fill="none" stroke="black"/>
                <path d="M 160,384 L 160,400" fill="none" stroke="black"/>
                <path d="M 160,432 L 160,448" fill="none" stroke="black"/>
                <path d="M 208,144 L 208,224" fill="none" stroke="black"/>
                <path d="M 208,256 L 208,320" fill="none" stroke="black"/>
                <path d="M 240,256 L 240,320" fill="none" stroke="black"/>
                <path d="M 248,80 L 248,144" fill="none" stroke="black"/>
                <path d="M 264,320 L 264,384" fill="none" stroke="black"/>
                <path d="M 264,448 L 264,512" fill="none" stroke="black"/>
                <path d="M 272,80 L 272,144" fill="none" stroke="black"/>
                <path d="M 360,144 L 360,192" fill="none" stroke="black"/>
                <path d="M 360,224 L 360,256" fill="none" stroke="black"/>
                <path d="M 384,320 L 384,336" fill="none" stroke="black"/>
                <path d="M 384,368 L 384,464" fill="none" stroke="black"/>
                <path d="M 448,80 L 448,144" fill="none" stroke="black"/>
                <path d="M 464,32 L 464,176" fill="none" stroke="black"/>
                <path d="M 472,320 L 472,464" fill="none" stroke="black"/>
                <path d="M 488,272 L 488,528" fill="none" stroke="black"/>
                <path d="M 32,32 L 464,32" fill="none" stroke="black"/>
                <path d="M 48,80 L 248,80" fill="none" stroke="black"/>
                <path d="M 272,80 L 448,80" fill="none" stroke="black"/>
                <path d="M 48,144 L 96,144" fill="none" stroke="black"/>
                <path d="M 112,144 L 248,144" fill="none" stroke="black"/>
                <path d="M 272,144 L 352,144" fill="none" stroke="black"/>
                <path d="M 368,144 L 448,144" fill="none" stroke="black"/>
                <path d="M 32,176 L 464,176" fill="none" stroke="black"/>
                <path d="M 240,256 L 360,256" fill="none" stroke="black"/>
                <path d="M 32,272 L 488,272" fill="none" stroke="black"/>
                <path d="M 64,320 L 200,320" fill="none" stroke="black"/>
                <path d="M 216,320 L 264,320" fill="none" stroke="black"/>
                <path d="M 384,320 L 472,320" fill="none" stroke="black"/>
                <path d="M 264,352 L 384,352" fill="none" stroke="black"/>
                <path d="M 64,384 L 264,384" fill="none" stroke="black"/>
                <path d="M 64,448 L 152,448" fill="none" stroke="black"/>
                <path d="M 168,448 L 264,448" fill="none" stroke="black"/>
                <path d="M 384,464 L 472,464" fill="none" stroke="black"/>
                <path d="M 64,512 L 264,512" fill="none" stroke="black"/>
                <path d="M 32,528 L 488,528" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="392,352 380,346.4 380,357.6" fill="black" transform="rotate(0,384,352)"/>
                <polygon class="arrowhead" points="368,144 356,138.4 356,149.6" fill="black" transform="rotate(270,360,144)"/>
                <polygon class="arrowhead" points="216,320 204,314.4 204,325.6" fill="black" transform="rotate(90,208,320)"/>
                <polygon class="arrowhead" points="168,448 156,442.4 156,453.6" fill="black" transform="rotate(90,160,448)"/>
                <polygon class="arrowhead" points="112,144 100,138.4 100,149.6" fill="black" transform="rotate(270,104,144)"/>
                <g class="text">
                  <text x="252" y="52">External</text>
                  <text x="344" y="52">Authorization</text>
                  <text x="428" y="52">Domain</text>
                  <text x="112" y="116">Authorization</text>
                  <text x="196" y="116">Server</text>
                  <text x="320" y="116">Protected</text>
                  <text x="396" y="116">Resource</text>
                  <text x="16" y="212">B1)</text>
                  <text x="64" y="212">present</text>
                  <text x="108" y="212">as</text>
                  <text x="160" y="212">assertion</text>
                  <text x="336" y="212">B3)</text>
                  <text x="380" y="212">access</text>
                  <text x="176" y="244">B2)</text>
                  <text x="220" y="244">access</text>
                  <text x="272" y="244">token</text>
                  <text x="456" y="292">Cloud</text>
                  <text x="284" y="324">1)</text>
                  <text x="312" y="324">get</text>
                  <text x="332" y="340">identity</text>
                  <text x="164" y="356">Workload</text>
                  <text x="428" y="356">Instance</text>
                  <text x="428" y="388">Metadata</text>
                  <text x="136" y="420">A1)</text>
                  <text x="180" y="420">access</text>
                  <text x="428" y="420">Service/</text>
                  <text x="428" y="436">Endpoint</text>
                  <text x="128" y="484">Protected</text>
                  <text x="204" y="484">Resource</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
   +-----------------------------------------------------+
   |                       External Authorization Domain |
   |                                                     |
   | +------------------------+  +---------------------+ |
   | |                        |  |                     | |
   | | Authorization Server   |  | Protected Resource  | |
   | |                        |  |                     | |
   | +------^------------+----+  +----------^----------+ |
   |        |            |                  |            |
   +--------+------------+------------------+------------+
            |            |                  |
B1) present as assertion |              B3) access
            |            |                  |
            |       B2) access token        |
            |            |   +--------------+
   +--------+------------+---+------------------------------+
   |        |            |   |                        Cloud |
   |        |            |   |                              |
   |   +----+------------v---+--+ 1) get       +----------+ |
   |   |                        |    identity  |          | |
   |   |        Workload        +--------------> Instance | |
   |   |                        |              |          | |
   |   +-----------+------------+              | Metadata | |
   |               |                           |          | |
   |           A1) access                      | Service/ | |
   |               |                           | Endpoint | |
   |   +-----------v------------+              |          | |
   |   |                        |              +----------+ |
   |   |   Protected Resource   |                           |
   |   |                        |                           |
   |   +------------------------+                           |
   +--------------------------------------------------------+
]]></artwork>
          </artset>
        </figure>
        <t>The steps shown in <xref target="fig-cloud"/> are:</t>
        <ul spacing="normal">
          <li>
            <t>1) The workload retrieves identity from the Instance Metadata Endpoint.</t>
          </li>
        </ul>
        <t>In case the workload needs to access a resource within the cloud (protected by the same authorization server that issued the workload identity)</t>
        <ul spacing="normal">
          <li>
            <t>A1) The workload directly access the protected resource with the credential issued in step 1.</t>
          </li>
        </ul>
        <t>In case the workload needs to access a resource outside of the cloud (protected by a different authorization server). This can also be the same cloud but different context (tenant, account).</t>
        <ul spacing="normal">
          <li>
            <t>B1) The workload presents cloud-issued credential as an assertion towards the external authorization server using <xref target="RFC7523"/>.</t>
          </li>
          <li>
            <t>B2) On success, an access token is returned to the workload to access the protected resource.</t>
          </li>
          <li>
            <t>B3) Using the access token, the workload is able to access the protected resource in the external authorization domain.</t>
          </li>
        </ul>
      </section>
      <section anchor="cicd">
        <name>Continuoues integration/deployment systems</name>
        <t>Continuous integration and deployment systems allow their pipelines/workflows to receive identity every time they run. Particularly in situations where build outputs need to be uploaded to resources protected by other authorization server, deployments need to be made, or more generally, protected resources to be accessed, <xref target="RFC7523"/> is used to federate the pipeline/workflow identity to an identity of the other authorization server.</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="464" width="488" viewBox="0 0 488 464" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,160" fill="none" stroke="black"/>
                <path d="M 8,256 L 8,320" fill="none" stroke="black"/>
                <path d="M 8,384 L 8,448" fill="none" stroke="black"/>
                <path d="M 24,64 L 24,128" fill="none" stroke="black"/>
                <path d="M 80,320 L 80,336" fill="none" stroke="black"/>
                <path d="M 80,368 L 80,384" fill="none" stroke="black"/>
                <path d="M 88,128 L 88,176" fill="none" stroke="black"/>
                <path d="M 88,208 L 88,256" fill="none" stroke="black"/>
                <path d="M 200,128 L 200,208" fill="none" stroke="black"/>
                <path d="M 200,240 L 200,256" fill="none" stroke="black"/>
                <path d="M 240,64 L 240,128" fill="none" stroke="black"/>
                <path d="M 288,64 L 288,128" fill="none" stroke="black"/>
                <path d="M 304,320 L 304,336" fill="none" stroke="black"/>
                <path d="M 304,368 L 304,384" fill="none" stroke="black"/>
                <path d="M 392,128 L 392,176" fill="none" stroke="black"/>
                <path d="M 392,208 L 392,256" fill="none" stroke="black"/>
                <path d="M 464,64 L 464,128" fill="none" stroke="black"/>
                <path d="M 480,32 L 480,160" fill="none" stroke="black"/>
                <path d="M 480,256 L 480,320" fill="none" stroke="black"/>
                <path d="M 480,384 L 480,448" fill="none" stroke="black"/>
                <path d="M 8,32 L 480,32" fill="none" stroke="black"/>
                <path d="M 24,64 L 240,64" fill="none" stroke="black"/>
                <path d="M 288,64 L 464,64" fill="none" stroke="black"/>
                <path d="M 24,128 L 80,128" fill="none" stroke="black"/>
                <path d="M 96,128 L 240,128" fill="none" stroke="black"/>
                <path d="M 288,128 L 384,128" fill="none" stroke="black"/>
                <path d="M 400,128 L 464,128" fill="none" stroke="black"/>
                <path d="M 8,160 L 480,160" fill="none" stroke="black"/>
                <path d="M 8,256 L 192,256" fill="none" stroke="black"/>
                <path d="M 208,256 L 480,256" fill="none" stroke="black"/>
                <path d="M 8,320 L 72,320" fill="none" stroke="black"/>
                <path d="M 88,320 L 296,320" fill="none" stroke="black"/>
                <path d="M 312,320 L 480,320" fill="none" stroke="black"/>
                <path d="M 8,384 L 296,384" fill="none" stroke="black"/>
                <path d="M 312,384 L 480,384" fill="none" stroke="black"/>
                <path d="M 8,448 L 480,448" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="400,128 388,122.4 388,133.6" fill="black" transform="rotate(270,392,128)"/>
                <polygon class="arrowhead" points="312,384 300,378.4 300,389.6" fill="black" transform="rotate(90,304,384)"/>
                <polygon class="arrowhead" points="312,320 300,314.4 300,325.6" fill="black" transform="rotate(270,304,320)"/>
                <polygon class="arrowhead" points="208,256 196,250.4 196,261.6" fill="black" transform="rotate(90,200,256)"/>
                <polygon class="arrowhead" points="96,128 84,122.4 84,133.6" fill="black" transform="rotate(270,88,128)"/>
                <polygon class="arrowhead" points="88,320 76,314.4 76,325.6" fill="black" transform="rotate(270,80,320)"/>
                <g class="text">
                  <text x="268" y="52">External</text>
                  <text x="360" y="52">Authorization</text>
                  <text x="444" y="52">Domain</text>
                  <text x="104" y="100">Authorization</text>
                  <text x="188" y="100">Server</text>
                  <text x="344" y="100">Protected</text>
                  <text x="420" y="100">Resource</text>
                  <text x="12" y="196">3)</text>
                  <text x="56" y="196">present</text>
                  <text x="128" y="196">assertion</text>
                  <text x="356" y="196">4)</text>
                  <text x="396" y="196">access</text>
                  <text x="148" y="228">4)</text>
                  <text x="188" y="228">access</text>
                  <text x="240" y="228">token</text>
                  <text x="188" y="292">Task</text>
                  <text x="252" y="292">(Workload)</text>
                  <text x="36" y="356">1)</text>
                  <text x="88" y="356">schedules</text>
                  <text x="244" y="356">2)</text>
                  <text x="292" y="356">retrieve</text>
                  <text x="364" y="356">identity</text>
                  <text x="108" y="420">Continuous</text>
                  <text x="200" y="420">Integration</text>
                  <text x="256" y="420">/</text>
                  <text x="308" y="420">Deployment</text>
                  <text x="388" y="420">Platform</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+----------------------------------------------------------+
|                            External Authorization Domain |
| +--------------------------+     +---------------------+ |
| |                          |     |                     | |
| |   Authorization Server   |     |  Protected Resource | |
| |                          |     |                     | |
| +-------^-------------+----+     +------------^--------+ |
|         |             |                       |          |
+---------+-------------+-----------------------+----------+
          |             |                       |
3) present assertion    |                  4) access
          |             |                       |
          |      4) access token                |
          |             |                       |
+---------+-------------v-----------------------+----------+
|                                                          |
|                    Task (Workload)                       |
|                                                          |
+--------^---------------------------^---------------------+
         |                           |
   1) schedules              2) retrieve identity
         |                           |
+--------+---------------------------v---------------------+
|                                                          |
|       Continuous Integration / Deployment Platform       |
|                                                          |
+----------------------------------------------------------+
]]></artwork>
          </artset>
        </figure>
        <t>The steps shown in <xref target="fig-cicd"/> are:</t>
        <ul spacing="normal">
          <li>
            <t>1) The continuous integration / deployment platform (CI-CD platform) schedules a task (considered a workload) to be performed.</t>
          </li>
          <li>
            <t>2) The workload is able to retrieve identity from the CI-CD platform. This can differ based on the platform and potentially is already supplied during scheduling phase in step 1.</t>
          </li>
          <li>
            <t>3) The workload presents the CI-CD issued credential as an assertion towards the authorization server in the external authorization domain based on <xref target="RFC7521"/>. In case of JWT also <xref target="RFC7523"/>.</t>
          </li>
          <li>
            <t>4) On success, an access token is returned to the workload to access the protected resource.</t>
          </li>
          <li>
            <t>5) Using the access token, the workload is able to access the protected resource in the external authorization domain.</t>
          </li>
        </ul>
        <t>Tokens of different providers look different, but all of them contain claims carrying the basic context of the executed tasks such as source code management data (e.g. git branch), initiation and more.</t>
      </section>
    </section>
    <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="RFC7521"/> and <xref target="RFC7523"/> are the proposed standards for this pattern, some authorization servers use <xref target="RFC8693"/> or a custom API for the issuance of an access token based on an existing platform identity credentials. These pattern are not recommended and prevent interoperability.</t>
      </section>
    </section>
    <section anchor="document-history">
      <name>Document History</name>
      <t>[[ To be removed from the final specification ]]</t>
      <t>-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>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
