<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.17 (Ruby 3.0.2) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>

<?rfc rfcedstyle="yes"?>
<?rfc tocindent="yes"?>
<?rfc strict="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc text-list-symbols="-o*+"?>
<?rfc docmapping="yes"?>

<rfc ipr="trust200902" docName="draft-ietf-wimse-workload-identity-bcp-01" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="Workload Identity">Best Current Practice for OAuth 2.0 Client Authentication in Workload Environments</title>

    <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>Microsoft</organization>
      <address>
        <email>arndts.ietf@gmail.com</email>
      </address>
    </author>

    <date year="2024" month="July" day="08"/>

    <area>Security</area>
    <workgroup>WIMSE</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 70?>

<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. "Service account token volume projection", a term introduced by Kubernetes, provides a way of injecting JSON Web Tokens (JWTs) to workloads.</t>

<t>This document describes the current best practices to avoid client_secret provisioning and leverage platform attestation to receive access tokens from an OAuth 2.0 authorization server via RFC 7523.</t>



    </abstract>



  </front>

  <middle>


<?line 76?>

<section anchor="introduction"><name>Introduction</name>

<!-- Introduce the environment -->
<t>In workload scenarios dedicated management entities, also referred to as "control plane" entities, are used to start, monitor and stop workloads dynamically. These workloads frequently interact with each other and other entities within the corporate network or online. When one workload, acting as an OAuth client, wants to gain access to a protected resource hosted on another workload or on the Internet (referred here generically as a resource server) then authorization is typically required.</t>

<!-- The challenge -->
<t>To authenticate workloads accessing resources, each workload instance requires unique credentials. This poses challenges in environments where workloads start, stop, relocate, and scale dynamically. Manual configuration, rotation, and management efforts can result in management overhead at best and security risks such as credential exposure at worst.</t>

<!-- What are service account tokens and what are their attributes -->
<t>"Service account token volume projection" is a feature in the Kubernetes container orchestration system that enables users to attach platform-attested tokens to their workloads. Workloads use these tokens to authenticate themselves to APIs within the platform's control plane. While this token is used for access, it functions more like an ID Token rather than an Access Token in the OAuth context. Workloads do not receive a refresh token, and there is no involvement of authorization or consent; it simply serves as proof of the workload's identity. Workloads have several methods to obtain such tokens from Kubernetes, including through the TokenRequest API invoked by business logic or Token volume projection, which mounts the token into the workload's file system and ensures it remains up-to-date. Token volume projection offers the advantage of requiring no manual intervention by the application beyond reading a file.</t>

<!-- How Service Account Tokens can be/are used in combination with RFC 7523 to access OAuth2 protected resources -->
<t>Initially designed to authenticate access to the control plane API, the industry has recognized the service account token for its low maintenance and platform attestation capabilities and has started using it as a JWT client assertion, as specified in <xref target="RFC7523"/>. This token is presented to an authorization server as a client assertion. The authorization server validates the assertion's signature using <xref target="OIDC"/> metadata or <xref target="RFC8414"/> and uses the claims within the token to authenticate the client. Overall, the authorization server trusts the platform control plane for issuing and delivering these credentials. The authorization server then responds with an Access Token that the workload can use to access an OAuth2-protected resource on a resource server.</t>

<t><xref target="fig-arch"/> illustrates the interaction in the architecture graphically.</t>

<figure title="Protocol Interaction." anchor="fig-arch"><artwork><![CDATA[
                      +---------------+
                      |               |
                      | Authorization |
                      | Server        |
                      |               |
                      +---------------+
                             ^ |
                             | |
  +--------------------------|-|--------------+
  |Cluster                   | | OAuth        |
  |                          | | Exchange     |
  | +---------------+        | | to obtain    |
  | |               |        | | access token |
  | | Control Plane |        | | using        |
  | |               |        | | Service      |
  | +---------------+        | | Account      |
  |         ^|               | | Token        |
  |         ||               | v        +-----+
  |         ||            +----------+  |
  |         ||            |          |+ |        +----------+
  |  Obtain ||            | Workload || |        |          |
  |  Service||            |          ||<-------->| Resource |
  |  Account||            +----------+| | Access | Server   |
  |  Token  ||             +----------+ | Token  |          |
  |         ||                  ^       |        +----------+
  |         ||    Start Workload:       |
  |         ||     with Service :       |
  |         ||    Account Token :       |
  |         ||                  v       |
  |         ||              +-------+   |
  |         |+------------->|       |   |
  |         +---------------| Agent |   |
  |                         |       |   |
  |                         +-------+   |
  |                                     |
  +-------------------------------------+
]]></artwork></figure>

<t>This specification defines the utilization of Service Account Tokens within container orchestration systems, providing a secure and scalable method for creating and managing these tokens while ensuring interoperability with existing OAuth-based authorization systems.</t>

<t>To distinguish between entities, we refer to the OAuth 2.0 Authorization Server within the cluster's control plane as the "Control Plane." Given the presence of two distinct access tokens, we specifically designate the token issued by the Control Plane as the "Service Account Token," thereby differentiating it from the access token issued to an OAuth 2.0 client operating within the workload by a separate authorization server.</t>

<t>In <xref target="recommendations"/>, further details are provided regarding the token content and the associated security properties.</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>The terms 'workload' and 'container' are used interchangeably.</t>

</section>
<section anchor="recommendations"><name>Recommendations</name>

<t>This specification relies on the use of OAuth 2.0 <xref target="RFC6749"/> and
<xref target="RFC7523"/> for client authentication using a JWT.</t>

<t>Service Account Tokens used in container orchestration systems are vulnerable to various threats, as outlined below:</t>

<t><list style="numbers" type="1">
  <t>Token theft: Attackers who compromise a workload can steal tokens to impersonate it and gain unauthorized access to resources.</t>
  <t>Token reuse: Stolen tokens may be reused within their expiration period to gain repeated unauthorized access. However, the expiration time limits the token reuse time window.</t>
  <t>Misconfigured service accounts: mproperly configured service accounts can grant applications excessive privileges.</t>
  <t>Theft of token signing key: Attackers gaining control plane access can steal the token signing key, akin to compromising client_id and client_secret in OAuth, potentially accessing all secrets in the orchestration system.</t>
</list></t>

<t>The following fields are populated in the Service Account Token:</t>

<t><list style="numbers" type="1">
  <t>The 'iss' claim MUST contain a string identifying the worklod orchestrator.</t>
  <t>The 'sub' claim MUST contain a string identifying the workload, also serving as the client_id per <xref target="RFC7523"/>.</t>
  <t>The 'aud' claim MUST identify one or multiple authorization servers intended to receive and authorize the Service Account Token.</t>
</list></t>

<t>Additional processing requirements are specified in <xref target="RFC7523"/>.</t>

</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>This entire document is about security.</t>

</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 title='Normative References' anchor="sec-normative-references">



<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="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>




    </references>

    <references title='Informative References' anchor="sec-informative-references">

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


    </references>


<?line 183?>

<section anchor="example"><name>Example</name>

<t>The functionality described in this specification can be verified using Kubernetes. Modern version of Kubernetes implement service account token volume projection, which enables the ability to inject the Service Account Token with a specific issuer and audience into the workload.</t>

<t>A most important parts of the configuration are (which can be found at the end of the full configuration):</t>

<t><list style="numbers" type="1">
  <t>the path, where the application can find the token, as a file</t>
  <t>the expiration of the token in seconds</t>
  <t>the audience, which will be in the Service Account Token</t>
</list></t>

<figure><sourcecode type="yaml"><![CDATA[
serviceAccountToken:
  path: token
  expirationSeconds: 7200
  audience: "https://localhost:5001/connect/token"
]]></sourcecode></figure>

<t>The full configuration is shown below:</t>

<figure><sourcecode type="yaml"><![CDATA[
apiVersion: apps/v1
kind: Deployment
metadata:
  name: simpleapp
  labels:
    app: simpleapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: simpleapp
  template:
    metadata:
      labels:
        app: simpleapp
    spec:
      containers:
        - name: container1
          image: curlimages/curl:8.2.1
          imagePullPolicy: Always
          command:
            - sleep
            - "3600"
          env:
            - name: TOKEN_PATH
              value: '/var/run/secrets/other_token/token/token'
          volumeMounts:
            - mountPath: '/var/run/secrets/other_token/token'
              name: other-token-path
      volumes:
        - name: other-token-path
          projected:
            sources:
            - serviceAccountToken:
                path: token
                expirationSeconds: 7200
                audience: "https://localhost:5001/connect/token"
]]></sourcecode></figure>

<t>The most important parts of the token, which the workload will obtain, looks as follows:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "aud": [
    "https://localhost:5001/connect/token"
  ],
  "exp": 1691752299,
  "iss": "https://kubernetes.default.svc.cluster.local",
  "sub": "system:serviceaccount:test:default"
}
]]></sourcecode></figure>

<t>A complete token example obtained by the workload is shown below.</t>

<figure><sourcecode type="json"><![CDATA[
{
  "aud": [
    "https://localhost:5001/connect/token"
  ],
  "exp": 1691752299,
  "iat": 1691745099,
  "iss": "https://kubernetes.default.svc.cluster.local",
  "kubernetes.io": {
    "namespace": "test",
    "pod": {
      "name": "simpleapp-5d7dcf96df-n7csk",
      "uid": "9fc443d7-5c7a-48d5-9679-0ee03b17d4c5"
    },
    "serviceaccount": {
      "name": "default",
      "uid": "0bea3006-fb60-49a3-bc80-7e6884d378ae"
    }
  },
  "nbf": 1691745099,
  "sub": "system:serviceaccount:test:default"
}
]]></sourcecode></figure>

<t>To enable the authorization server to use the Service Account Token for client authentication the following configuration is needed:</t>

<t><list style="numbers" type="1">
  <t>the client id is set to <spanx style="verb">system:serviceaccount:test:default</spanx>. In our case we are using the default service account in the test namespace.</t>
  <t>the public key of the token signing key. This can be either configured manually, or dynamically by referencing the JWK endpoint Kubernetes exposes, which is https://kubernetes.default.svc.cluster.local/openid/v1/jwks</t>
</list></t>

<t>Note: Authorization servers that follow the OpenID Connect Core specification, which profiles RFC 7523, will unfortunately run into problem. Here is the why.</t>

<t>For JWT-based client authentication <xref target="OIDC"/> specifies the following:</t>

<t><list style="numbers" type="1">
  <t>The 'jti' claim is mandated for client authentication.</t>
  <t>The 'iss' claim must match the 'sub' claim. Since Kubernetes issues the tokens, and not the workload, the two do not match.</t>
</list></t>

<t><xref target="RFC7523"/>, on the other hand, does not mandate the use of a 'jti' claim and does not mandate that the 'iss' claim  equals the 'sub' claim.</t>

</section>


  </back>

<!-- ##markdown-source:
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

-->

</rfc>

