<?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.20 (Ruby 3.3.3) -->
<?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-bcp-02" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.24.0 -->
  <front>
    <title abbrev="Workload Identity">OAuth 2.0 Client Assertion in Workload Environments</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-wimse-workload-identity-bcp-02"/>
    <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>
    <author initials="A." surname="Schwenkschuster" fullname="Arndt Schwenkschuster">
      <organization>SPIRL</organization>
      <address>
        <email>arndts.ietf@gmail.com</email>
      </address>
    </author>
    <date year="2024" month="November" day="13"/>
    <area>Security</area>
    <workgroup>WIMSE</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 86?>

<t>The use of the OAuth 2.0 framework for container orchestration systems poses a challenge as managing secrets, such as client_id and client_secret, can be complex and error-prone. Instead of manual provisioning these credentials the industry has moved to a federation-based approach where credentials of the underlying workload platform are used as assertions towards an OAuth authorization server leveraging the Client Assertion Flow <xref target="RFC7521"/>, in particular <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 92?>

<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 234?>

<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>-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:
H4sIAAAAAAAAA809aXcbuZHf+Svw5A9jjdiUKMmWrLebN7JsZzQZH2tpxsnm
ZTLNbpDEqNnN7UMyIym/fesA0EAfpCxPNsscJrtxFAp1VwEKgmBQqjKRJ+L9
aVXOxf5oT5wlSqalOC0KmZcqS4VKxacsv0qyMBav02uVZ+kCWhSDcDLJ5fVJ
/fY8hueqXA3iLErDBQwb5+G0DJQsp8GNWhQyuNFtA6XbBpNoGeztD6KwlLMs
X53AfNNsMFDL/ESUeVWU+3t7L6BBmMvwRFzIqMpxChxolmfVEuY/f3vxenAl
V/AsPhHnaSnzVJbBK5x8MCjKMI3/HiZZCgCtZDFYqpOBEPk0knFRrhL9VIgy
i5yvKkUIzYMiy8tcTgv7e7Xwfpa5imzjKFsQhsxvlSYqraeRn8sgUUUZwCCT
LIFmQfbtDrwBtC3C5VKlM247CGFTshygDeAtflQKrV+OxPfZdBGmqX7KuH4p
Uxmrq7LxUi5ClZyIOT8cTXSr7wolAchiBMDqllkO817w40Fjzu9H4rKIYBCZ
qpk37fcwqizab8289HpU2tffzRafR7A9D5j09Uj8UcGehmnmTfk6zsI8zpov
9YyS345m+u13aXalwuY63+HD5oR/GYmPWZEtwqu5P+NfwjwrkvC69VrPucrN
8+/+UURhIvPmfP/Nj5szno7ERTS/kekVIAiIHVq4857maVz2tNBTh9ikGCGP
AWrhUWtHP5x//HEwSLN8EZbqWiLxf3xztj8ev9Bfj57tj+uvB/rr86ND0+B4
fHRovh6OD21bZ4TxkWnw/AWMgEzszPf+/NXZCQNlaVq4MIZXalHl4VC8Gw3F
yzyME7kaih/gxw/At8VQvIWvsRRvZSxBAsGDl/AAGFucjcRbYE61yHLJgxqR
tpTp+StxlgEBRiX8m0sxBgGn0ijLl1kOwKUzIXP4EopClmKsu4f5TAIvz8ty
WZzs7mYwjoqRZHeLpYwK/SCIeGD4N5fB+O97o3m5SHiIGITZiTgGIruWi4nM
xf7e+BBe/amakGiSxYXMr1UkT6Moq0DKeIDXrYRuJnS7bgCvbPuRynZBiBS7
AFskl2WxW2h5CV9opCDkkYpdF9LxnngbrgDKfYTyMruS6Ud5reTNz+Ne0KiV
4Gbi9MO5+LkHfx3ggeiUuQQQnZdBuFS7SByoF0AbgOoJcllkVR7JYrfE2eA3
zhZcjz3o94/FaTUD1mgs4H8qWZQPWAG1+79bAk23YQ2DIAhEOAG1Ekagwi7n
UlSFFNlUwOCOsp7mICZQFQpgN9A7aRmCpsmBqaK5xN6kwYsViI1FIZZZAcsO
RTQPk0SmMynCQoBWCGfICUAquSyBs4oqmuObiCyBv6uY+Ez/4lZDEYWpmEhU
dctEfqYWwEpZHizBPpAj0MIwJ9gEADLMUIWJgBfXqgB4cDJYBqwHhiIzIEwK
WhjoXEBBvgKtAYAB88SgiQHgKTTjtQSTsICnoCXzLAQwb+awC944GkcVqO88
WeFcxuYQyyQsUSyBzCR8xrjK0Bg6AEJ2A5oDHqUaxSyr1D80GoGFALeJhP9n
lOFELXvpTZLdiNtbLVfv74doQS1DeBlVSZjbVwf39yPcWlUIlCtqqkkGxFwR
5WpCW7WQIJymOCIMcnsLKMmRBXDUGcjWQhgGF7lksyMOeTHUvvHw/p42KqtK
NEgKJBjcTQnglWg06V7mFwGIlLhQMQjkweAJGld5FlcRDjcYGMsPsV4CLyFx
K8AtCBlZID4F2DowEuy+5QN8upQ57QPgT+XAbcVVMRJvgILl5xDpaeiMECKH
hLjt8FTcyInZB2gO2h2GyO0Og5FCdFVPhjsNpFKCoIbtnqxwbzt3lUgcXmZp
skLCZgCgz41CQkhriICLaR6HjZD5biwuFMENAgTWB9/djvCuqGSM+w46TiEA
MAZourr3jWSQmVcMAMx9HqEjxCgUkAhBB8Gal1kaI1m2GjMFPQXjmZY8Hh2M
DpkOUcnf328jwEAIuQLa7lqsQnaMZYL8DlhlnJDSBHazeEAmDkvg9ytg5RIN
HCROSZDO1WwegHkCxnkagtgcoSkPU0JroBBaUCqZ3yf++rE37CA0iwFPcwVc
z9Q2BykAVqOWL8kKhE4pYKDMCKeizAAugyje/rIMoyuZ0xapBRBiAVtQMhYt
GQ0Gp2DxJxVhCxrSPgJMk0Qu9PYC5dVQatlp18J96gG9vbJSyGuRV7ASng25
DxQBEpUqwboJ01VbhiHLTZFunW0mSbPIoG8UsqT/4dOl2cQLNUs1DuwggUo1
e3bxxJBJq6YiBqxoL03BQ3gJQqtCHSlekpDOUlcM2oYIE2BuqhLpysIhY9mZ
DncRdSlupZXWhrit2K6ltojVlJRy2bmcEcqvS5kvVJol2WzFahXcRlwL9N96
+9PF5daQ/xXv3tP3j6//66fzj69f4feL709//NF+4RYD+PH+px/1e/xW9zx7
//bt63evuDM8FY1Hb0//skU27GDr/YfL8/fvTn/cwh0kPICRUS1oKcBAzBS0
WUuU14QKoyYAq+ng5dkHMdY8jZY94Ju+o+UO30FNpmwuk3zjn4DbFWpSCUoJ
pgUWAi98qUpgoSFOUMyzG+AywCigDqUz7nsRgfnLSrapuJheAMZFt4hVBc9O
eznV43W21DrcKg+/UZyhHEEIUagk8L+SkAArnqpZUOtIAPv1tUSEZtVsDuDJ
aJ4CsCRxPVZ0qA4lNsoQltTrVAZKQdou2WbPYQd+ePVkOLL4QSoWWxYImjHf
QsX2G1qC9s0WkS6bJA+IywyeQGONhMGgiRShkqQi05AkxEyCvagiYwGwBAei
AC5D1QWuFuIjMVtiDQWX+jyT4WQw+Oc//ynCsLieDcRO8OjPzkDcif7Pa0Mc
p97evGLiEHfre2/4UO9+2HeoUef7HdO7f/Y75/87Xtne/sIumOhs7w/Wqvmo
rR2/9+PnNuv6pV5U37p/aa57p9XH/dbEVXO/m3D2wip4Nr/9wbZva9WfQ/Pm
i6fY3wZdBSalp3EeDpL7rQMNa5e8Fpsb+crjntbQHtRWinwwksjnnvW9u9Fw
Z9dbQ3ptf+84jRtEYHqvmeTO+35Wi27q5/e2a7Of/3Bm+4Mj5bt6d809Boqo
kmSXeNAizOm9Zmto3cuqmPes+6ukJUjdwe2JeOKKe456/OcW6Y79ppMKctKI
/y5NsnXPJhIMiFa89RpRD0yzBEagsEEpl4W2y9FWId0RhWAqk1EBtqvWDaDE
vkXsWT/DU7pmG4zOYxfrJlyxIiU/ao7d2OIEC4Y8P/PSKuCnuDnbqEOtXn2K
GN8GaMDfQi9C24mFmBgz1bUFCEyH7V37l0IDHZZnj4FA619vxWjnCpGIdhEj
187w91keAgjkvcVyqlKjbj2rmsx+tPhRSaN1zaHXYSPS8C0KyPcphndQFA6b
fh6iEfamylN2wzy7Bt0S3XbuetTG06bxQczipjUHJXuvHiDs6C60HbUBV2iE
gldZogOJxAKeJpJgKL6/vPwg0LBD142mwee1P9CeEd3GlQ1YMBHvkx+MymKG
NgR5ufUYbPkuQwy5AZTg5tQz9a0Jtx9oJ5dg+PV5J9qc9SIojGbuytvPLgCz
HfIAQjj03XZwoG8c145ZyiFfG8moYoWRS2uD92Bdu01EoUMBzoAkp3At97CX
hzEclCA0zogMUkdMM3n2uRTW8blBAKOKvOIfLt6/E5/kRMdso+ZgsBnvSR7o
nzaG+efRs70XIkJ2IjPchITArFUoosBhJVc+xKBGjNtUSEm+hT9lMWJZGCWh
WhSGXNumwXWYr8Qsl2GJYSSDIXT9iUERO2FUUjjUegoIQyjALVWLamGDKjwR
AssQNU1xkJAOfztBQ3yHAMayDFWip4zAxaWIJbodQxqG3NyJXcSI7Pbfiiwd
3IJZsgX0s3UitkwIXEfmRlk+A68X3hfVBN8vVjany8+BuvA5h9ADQ2v8Tn5e
wrvx0f6L/cPj8f7h4J601sOdS40VHd+pfRBPJY0EeH35Cp2zmZjm2cJDlPZt
YLm3J9fFMozk/QDWOjgh2cU+mPF2Wm7dSHyaY9yCQxUhxqAoYLayMhfjXgVy
QJaXKLsB4dZLNeExaN7FaYUJLctm7ur2FhNoLO13AVd1AqDTR3gLO49BUx0C
OBxjCMAVFZa2/yRXhcHO+AhaoUi4DhPFAWOwVXJKGgC2YL8BRxfV5DeEiPU9
J/GnSjZiQo5nzNJttx2DN3J8hGluJhIY/30qUXdrHPHjwpcwbcEGCJeAYGJo
aKJ1KgWTqogkH0aRNJ2buP0D9PpG2ajRQJykcbHCGJdMpmZQI2uNqNBosZOR
a2+qGsCV84P4t0+aEXzQb8C7NuofwTNlkiMklwod5D1GIvYsBSD8FQvjc6Jy
zPTwbpKMMJDW2w9z9ZAqU7JuKQsjZDDluEYDFYypEuPDvhFpxSqbCZihBAaf
ZjqXsKRdqzM1J2ht8CLgi6ZJ+HZqCOlb8frzUuV6FW9ADlYcRgPYcY+QvJjH
C7JmljiwZJaGjaoS2qg6PkzRm9yFxaMXRMZNWBjSRCZyo5Gaixj3rMHK1bKB
6U6BQPgyaObwWt1dC6malPwUCguJj3IKC5oj9CBQqLceFiOSE4Nfykmgmq6K
EgSmo31qUWZSjMASg8FFtljHkwVLxsgbjmNLMOY1Bhnd8ZiAcmnsH5MHMEuP
vbWRZUVdVVplFdGNnOlkJ44Uy2WSrciKsCBypjCshRRqmGgu4yqxW/bH80uA
APZKlVmuY4QTMMFR1FlpAnaf+AaF2jfmHVqSE9cqpmSS5kxcC5Yx8Zp0JlN6
ubFOZTAUnNviObS9iqbKRFpskeWiLcLawO4wdkd9BObxsZsL1cFsyuXUqefC
qOBR7fuyyrQ9CJ6a+BXP5xmLRuzQUIIqs1zeSNRUlmohweJicq0D64CzSGp9
b5o1lXXBgW3YR23YNDKLjlODi5+zoAbThHHmDosKHhCIkfAqiQndII+lImub
OZFwR+SzT20LUl/Zw2Pmhi7X6zfrQ9XVBXJd0o4JeoPziciApeVYjnbdmtJq
HiMbbIwAURStooQJUaWuHOsjC9sKxRgIQ9bJntUAomIJZL8MyRFG4SApjUWs
oooSy95uOioHSErZ4YmxcadQF/Yjnpf0Ic/gLfwXHQL05XAJZ87YGnrguQko
JdqCms5w9cv2CE4nneiWsV1uB+y4tybJqko1I42q5fxcTkv9rmsmE6jX7npX
PgOBLJte+UMSLAWZJuen707RDnWtjNsn+PReFy9Yhy3OZKF5xJQBcHvw1LED
jXcaXaXZDYjcmdTZitM4FivkMix5M+mmIAhAZkRX2OWDyTncPrFpBto9p5bn
9kldhgMvz1Pnpc715GqBzpkujeLClAjMVClMLaq23Nl3JSmTY+IIfB1dhmWK
p7bAsOqr5bq/N1UIprVxV0DEJCpS6BlG6CGiQCRDQU5DtDgyBKXAvciwco7y
VCiSKXE7srVgdtiqVIn6h2x6quLpD58ui21r1mMuMCx0rUXLcx5yWIApU5sH
E0k2Wb5alhmo1eVcw1LYFDIi1ME+0EeZZwnqBBLlLVBJ3YgFrFKh/vZrpKyX
4foNzuggh7iCiRC7qqt3OuSh0+30wzls/USWN+g/19aYz7+12uwoVXmq3ZzC
qd+hFB44atq56w9gbGPIIEO2BRzWG4rKtElPbv0HEAuZt6ZcoF2ldnvrVejB
9mp2jvQ2LHEbcAyywWqrEUD5jZUcGdpkgqM3y9ht6lHHjQI9UOcutXVGqUs7
oLeikufDtOVLMGJEtmQ5wKaBo6czWinLZaxL0OaicUXAyDBxmtoX1MyUS665
Rno0tsUyA/5ajTrHNGod6yk+U6DFKvqOEVfuWBOlRWjpmSeEBBClbMtYnajR
RmstXJNd5/BrPWU1oB4CaQcoq2ntDrlh6NL2q9rAJU3NtXIU6yCC1JG78zXB
iCGbP672thl64EEJ7IIwTT0itMWenTToAOiYLG33hRnDPm9wg5ZCQ3e4jEOO
LdLR5qkh3c1g6t3BdwqZBemkdLZpSENi/DCnGiawDtNv0ObGULazd1SURMHy
wglMEbkseBGocqoJEBGWmNTYQBlaT1d8CSdqknKRAAQTARHkJFnaiC5ouhDA
5AD9+2VdcRZ6USDQLqUXCMKYymeUyjF4ayFX3rkBYZfAG1XKxsX1PTjMH6ER
YYVVQsXsnM1RWKKBTJTS+4KjZU4YRgdN+3QObigHMLnu4LGJtJ1Bf+5vfcHB
3Zqe6z/Yc23OcE2dwbpUf18dwJ3Ts7vEgHr21hd8zZx6Kb/4S2mvs1lXcOcO
5A/bMZPzq6aERr61A6MNSugbsmPOwUFXmUCr7bN2GcIDxm69Peyrc+hou2bc
x2Nm7W54jXfcMw+b9rEDyjMtJHTPnRYwdU2BV1TgrvOuZ+y16Gn0bJcRPLTn
o+bc8XlAf36xOO3v2T32eki+tud42wbS6DElz5uG4UPn9IyAfwG0PeUzXTJ2
x+/5BfK9JnOnZ6/u2hXou4Lh19fzMXN+gQZsrPMxn7uv0Lhu3UrtxG+sXPHs
4XXlK5zb52JWWyTqRAvu0aE80cUpl2scW0vlRY+ftMCkc4ERBMyJsZHo1Jza
gvWwWKXRHMDMqiJZmYKTtVNrhiqsed8ymGtLsgEY1ZaYqtYHg5hk6YzMNXZw
aeF0mAajBTTk2NSU1KdAjA7UNSJdvqEFd0Mxd2/o0pzXcFPazUKXw39xocuz
BxW6dA/wsFKXweBUI0H7gH6+jEx3JGku9HdS4+Ga44Ma0ijMc86Aewl/Ttz/
VYgneI6BUg44rj6wJusMIaYmOLCNbhTvxzeFDWPVrjr5rSmGtTBk44S/7Jhk
sGx1HLPTg42K62gLGv3NKx84GD8fHxyOD+ihCkt6uLe3d3RkH/rFCz0DD5tr
naq8oHRIhYU+RVHTRxA0DlAGulJgmoR44nnrt1LhjDLcP5bx4YtgX47HweH+
8V7wQkbPgkl0EI/j48Pnz8chz+tHDcll+uHyXEwluWvAqAWlemSKpXR1vTzn
TMwpGWI3nN47oQiA3DJmMaRKNQ66VKP+PdQNshjf3fZA9CGL30GL83SabYSs
JgbigTjmcBjOIOxpSYZf26kEHkI23j8a7cF/xhoseFUpKiN5dnz47Hk02Qvi
eG8vOHwm42By9OIoePbs6HgaRxKWEm9Rn3u9omUW2/U7Uzh1KsHzF9FkOnlx
9OI4+O36xSxtzXp0dBw+O9iLgsnB9DA4PIpgF6P4WRBO9sbH08nzw+nBgT+r
pg5NHBsAaM0X7h0fxc/CvUCO4zg4PJBR8OIgjILp+CA+hpnHB+HUnw+kZBpO
QYIY2j8e7+3vDXSDrXQybTOFrtjhGMOJD/GJSxwnLqy6RqetoQMd12I9/Vqn
ZtdIH127RXJqiyP4F3xA7IM9U2jvkBBv7NFWjIVRRQ9KkqcXH87fvHm9LW6f
FEuM6d5juPkLRxmyMsRMBCkiHnNIWhIAzKpYpHR2nc63ViWK3kqXYIinZ+/O
3oALFmeYNjd6TpeCcJUmiW7kB1O0icoV/tmydgq83OL4Dabe8lU7F+FmmkaO
juUSBZ31k4pyxH/GIjcdBs2pBNTNMZnoCjKpOWPnxc11GaUqBYEiwT7BNqDO
OOXmRMzdbjqbS7E0TvxglNzEd/xsmw5FciRZD16nqxamYMlGMLEigw/o65CY
SWO1C4ko0+knFDRkLrZ707EmXM8qti6fLVsJUXxPp+ts/J9OOjPxmNi4e7IH
Bgsufj5/tUUpGRGYpj9jEYqiEmlLqK+crEG92c2SCBvWLkUC28Q5I1u5Q/pW
61auSjUQ1Iht4OQy01H5Ogo8NGBy0BXtHSRUYBU+70cVij98+hMogAhke+yF
OSmmrAPqrQAwIsEGJAs8I26mMmXcjQQDArxFZxhzUjrAg4ncIhNMpdcgTgAa
J3wNZDTP4q7db4JBSOHco3MIl6rONER1CQlQ7TzLKDsGS8f63xLrRGnVxZwp
ChaFCCcUkGHbiq1istY9vVy2Ea9LAVqwa+YKr0OVINHoUtTaGtQF+u7BLjAN
3UoH3BHkOH3+kmliQ0m2E69lnPweAdb1IdaHBVn75t7pf7ezyaFe8+6u7tt/
Igv+1xEwdfs+fl5eUysc5K/3l+Yr1yX3Y3Ltgdp75EPY/YOfDETnGalG064T
WJtHbr3tOeLV1bR31K9BS9expsBEIVt9d5zAIW3ll4VzbClNX9+HRCUfMa/f
t5ujenMSXt/NU3Q36Og73qYbFazw+pK+XzRv93rbO9y13q/Bs/tA6yBPCzy0
75fO+5hAofiaiF8z5sdm/APifRorDw3xafegFd6rr1zQNRVdZlLXDrTOz3AC
3a+BX3+Wxgn11YYsy87C2J8MSXd4rFk9zmeDJs3rFv5/Hfj6ujiYc+oGKzKd
vXIKgpMsuxKJuuKTGSfdkS32nM18gTdfwBvUjjXtvwDffHz0zIs14cPnx/qh
cauJ3PyTMruLlXazjRs9uHz/6v2JuMkVlttO0C2jYBViw6xMV2KTG/oBrxiJ
sfbh9gk5pkvz4L72E+j8HzWvbwfxDqcU83BJ5yr4DMv3qihh5foiBOAmyq1r
D1TfQGOdHXbZ6jIxrpswjjaeVDK3TmlU4lExihfW11HJmmURCidGoKsA9KRm
aLzpBR2+hEztofiVdycBavpVTKtU1xWid0ROClbMfJSzMI+xiS2M55qBmtHC
6IrubcIzbAXfVmIqxvMqpZqe+lQWHpHiylJ2mmFQ45uz38Q1fFSITk5tXUWI
93RMQ4p406Et3htNCVx2RmADKKY4Ud++wDXHv56bM472JM/rNF5mMPCvVK9M
5SggukJyQeqSvImazVCiaWIwpDIS77DGXrM4V2M17izSFxZZR5xJE4+SFTK5
xpCv0nfr1HUfCy5A5npoixu+Gql2nPGoQmG2icgSz8iNkNqdQ4XavUZ3lqWq
jRV0HXyzJ7U8F11DxnWyVJxFESM+kcU1jVrWknjSBVDdQQWqCqfrbmQj7sDX
2NT3n9kqfzc2ghXTn7iYMWzsBvNQC3i6e4qOgMbg7Ecl30LVkKR1ZSIRykpc
KTp4QxjyCoBNSMc5GGEqIZ0MUsGxHlzSrw4sxGf1UTd9pwtukZMpWqgikWFM
7ERqM0Rocyx5pqIqIIoh+K3uGpGPClMIRxgYujc9Dc01Tygjcon+fUwX0cj6
OJ/CgyUYBYiFubsIMbXyVg/I/1hjyi87qhnc1R8OYr2bvFJ9CIO2EJjAHJev
HXnqAfoDKAsw4ow0JOlBIlRPjQLGIXnvWrK6PFUXX+szWV1nNviES+qvuU1S
FF/hwvdIpmGuspasqQpzGm7N6YPm6Titt83JHf+UGaOVrnhyK2bdA5heWVfv
2bIaO5yE0kaDllPNK8qcyIT4IpPWs0pFvyW9KS6xpusGe5y79t+R0uuBma7r
/J2eKpO6a28BWHcFmNv10bN2FYEZf7mzBqxeaz2HN2EHDM4PjyQ2+PyN94P+
UTtmHbwcu6GQ/htjXh50XUjzgAm6Grzc3xwU6Ri7sfad9VjawFI767enl1jY
yN2wuRsYy/beaUF+zQ92TPSAP04Th7DWhw2scee2u+vo3YzJNBD3B2Ftu67e
nXN3/rxrrLtz45q9rTl51y2y1mG6e27zOR1bIuzprbOBu4+b29i/feu+Xrvu
LsgfivN+aumSj+uX8aVzd/depyvW9350yMaP2LBBuzlgw+3kA+M11HptuIaT
nkXNjDZc0+8wjegwGF2+4Znx1ha1KRBrYzinkHgFTz1TjexnPKrWb7xoI8qb
0AC9jWs7bS7OGv3rYybWCW/fnYTHHU1Z1peuuFWa3171pts1t3W1Gfox5CdO
ZI0pHhDvOakHMfbjU7oQthya8rBtiiy9bCLIRslorI7bbR5/iQNbwc3YGarV
f2nwDI2An6wB7o49bFAOrAxzxb9XRA2DS+bsvPQOz+86B+fNpeG3TyIVxcC4
Zw86b2+6cXKzpEOHS7WUdHUYXQMy5fhBO3TAfp7gs1V0hLtKR+KD60cgkauy
0udQOV86qVRCp0uWQMXuJcLVEtHHP2sHz6Nq9u66L791M8DOqAsYcmgOebND
yHG0rjumuIu5S9q7kcsNlNa3AuDGamxZZHk1IaETaNLs2r+I3ydjuyFl+4Cc
7aYr8da4OBtOm/QrzbvNh1x0586TLl89c/sWTVpSz5ptq501Fe7rksjma196
s9eCd+2bvjRq/8x9J1+6emzMAa+ZptWm9xBMb4+Nc/RhrjP318Tc47x/PXNn
58uwuBJPjT+x/WWdHzpzT/2A/+l+13tCqjmH8I6INByEfedCSCPYHjpwzwkm
/9O9e7/Thjk68dzRibvuAV33klDx+23Yl38aRjxo9YfY8J1a3zUUHmzfoxnR
Mu97bvHZ7bzD5+nZeXD2yv52iSqkPyMhnroBeWtCbZuCaXMdR2ci1rGzWiRZ
uxo+CI7Vy6btmmsRl6BmyFZNVnweI5dhvAILky7xACuqyqngsT5ssZyjFe9a
9pTT7U8fM3BfZhz3XV260ZRs553pgPW5fxkpOQP/hgMa/xbTWt/AAUv37h7V
KVzKUtsX+uLHOq9lEqb1LYd5vjKLAFyryA26MzgyqihGjn9CxV56qWHG6kz+
8z6S72dBv/ipHM1GYqZKfbHU9tBcjGuMeX150RPxc5gre+PLtf3BlduvyGF1
/k5Lh/lbp2H8+6Z008ZdrHWVJVd7ereFdFyPpdIoqWKDHydzWFStKwOZixUX
ndo/TNSf/nAtbnvjU4NIqRph/aWujXs9ai+/9bdAOuZdU5vJLr6+hBL/ME77
Lxu0SZgO2tssZi79au12QMPzF/XFHF7dCewvpwibf+XDu25T1xLgJXt0mwD9
OUYSPnxwhC5XoYzUEAi3J6xCrpK+zvL5CxyXbs7Rd3tgcY45hYKIpEgQp9K9
HbPyig5WKS6SbhLJyq2dN1f5mJyZuXTNuRtL3wIFyoJud4RmVLs+UQlXCjyx
pd267mI1QPvmr38VlxlfO9K4vGOqUMD4fznib3+jTviHMvHfb8Vb6KML2amj
U1JBKTKdpmwGn+xqeRS8egkZG7Wv/csOSHp4CDBWn7Uh9q0zvH105tcY2Odc
OVU3O989e1XPRjvcc3slt/ppyXdYoGWiFz3Wi34d4718qM8qalTo93sDMwEf
ydBBOvq7oOLTHwf/CxqyXmnodAAA

-->

</rfc>
