<?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.8 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-salowey-wimse-arch-01" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.20.1 -->
  <front>
    <title abbrev="WIMSE Architecture">Workload Identity in a Multi System Environment (WIMSE) Architecture</title>
    <seriesInfo name="Internet-Draft" value="draft-salowey-wimse-arch-01"/>
    <author initials="J." surname="Salowey" fullname="Joseph Salowey">
      <organization>Venafi</organization>
      <address>
        <email>joe@salowey.net</email>
      </address>
    </author>
    <author initials="Y." surname="Rosomakho" fullname="Yaroslav Rosomakho">
      <organization>Zscaler</organization>
      <address>
        <email>yaroslavros@gmail.com</email>
      </address>
    </author>
    <author initials="H." surname="Tschofenig" fullname="Hannes Tschofenig">
      <organization/>
      <address>
        <email>hannes.tschofenig@gmx.net</email>
      </address>
    </author>
    <date year="2024" month="April" day="01"/>
    <area>General</area>
    <workgroup>wimse</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 38?>

<t>The increasing prevalence of cloud computing and micro service architectures has led to the rise of complex software functions being built and deployed as workloads, where a workload is defined as a running instance of software executing for a specific purpose.  This document discusses an architecture for designing and standardizing protocols and payloads for conveying workload identity and security context information.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Workload Identity in Multi System Environments Working Group mailing list (wimse@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/wimse/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/jsalowey/wimse-arch"/>.</t>
    </note>
  </front>
  <middle>
    <?line 42?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The increasing prevalence of cloud computing and micro service architectures has led to the rise of complex software functions being built and deployed as systems composed of workloads, where a workload is defined as a running instance of software executing for a specific purpose.</t>
      <t>Workloads need to be provisioned with an identity when they are started. Often, additional information needs to be provided, such as trust anchors and security context details. Workload identity credential is used to authenticate communications between workloads. Workloads make use of identity information and additional context information to perform authentication and authorization.</t>
      <t>This architecture considers two ways to express identity information: X.509 certificates often used in the TLS layer and JSON Web Tokens (JWTs) used at the application layer. Collectively, these are referred to as WIMSE tokens. The applicability of given token format depends on application and security context and will be explored in later sections.</t>
      <t>Once the workload is started and has obtained identity information, it can start performing its functions. Once the workload is invoked it may require interaction with other workloads. An example of such interaction is shown in <xref target="I-D.ietf-oauth-transaction-tokens"/> where an externally-facing endpoint is invoked using conventional authorization mechanism, such as an OAuth 2.0 access token. The interaction with other workload may require the security context associated with the authorization to be passed along the call chain.</t>
      <t>In the rest of the document we describe terminology and use cases, discuss details of the architecture, and discuss threats.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>This document uses the following terms:</t>
      <ul spacing="normal">
        <li>
          <t>Workload</t>
        </li>
      </ul>
      <t>A workload is a running instance of software executing for a specific purpose. Workload typically interacts with other parts of a larger system. A workload may exist for a very short durations of time (fraction of a second) and run for a specific purpose such as to provide a response to an API request. Other kinds of workloads may execute for a very long duration, such as months or years. Examples include database services and machine learning training jobs.</t>
      <ul spacing="normal">
        <li>
          <t>Security Context</t>
        </li>
      </ul>
      <t>A security context provides information needed for a workload to perform its function. This information is often used for authorization, accounting and auditing purposes and often contains information about the request being made. Some examples include user information, software and hardware information or information about what processing has already happened for the request. Different pieces of context information may originate from different sources.</t>
      <ul spacing="normal">
        <li>
          <t>Identity Proxy</t>
        </li>
      </ul>
      <t>Identity proxy is an intermediary that can inspect, replace or augment workload identity and security context information. Identity proxy can be a capability of a transparent network service, such as a security gateway, or it can be implemented in a service performing explicit connection processing, such as an ingress gateway or a Content Delivery Network (CDN) service.</t>
      <ul spacing="normal">
        <li>
          <t>Attestation</t>
        </li>
      </ul>
      <t>Attestation is the function through which a task verifies the identity of a separate Workload. (TBD: sync definition with reference RaTS architecture)</t>
    </section>
    <section anchor="architecture">
      <name>Architecture</name>
      <section anchor="workload-identity">
        <name>Workload Identity</name>
        <section anchor="bootstrapping-workload-identity">
          <name>Bootstrapping Workload Identity</name>
          <t>A workload needs to obtain its identity early in its lifecycle. This identity is sometimes referred to as the "bottom turtle" on which further identity and security context is built.</t>
          <t>Identity bootstrapping often utilizes identity information provisioned through mechanisms specific to hosting platforms and orchestration services. This initial bootstrapping information is used to obtain specific identity credentials for a workload. This process may use attestation  to ensure the workload receives correct identity credentials. An example of a bootstrapping process follows.</t>
          <t><xref target="arch-fig"/> provides an example of software layering at a host running workloads. During startup, workloads bootstrap their identity with the help of an agent. The agent may be associated with one or more workloads to help ensure that workloads are provisioned with the correct identity. The agent provides attestation evidence and other relevant information to a server. After obtaining identity credentials from the Server it passes them to the workload. The server validates this information and provides the agent with identity credentials for the workloads it is associated with. The server can use a variety of internal and external means to validate the request against policy.</t>
          <figure anchor="arch-fig">
            <name>Host Software Layering in a Workload Identity Architecture.</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="480" width="472" viewBox="0 0 472 480" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 8,32 L 8,128" fill="none" stroke="black"/>
                  <path d="M 8,224 L 8,448" fill="none" stroke="black"/>
                  <path d="M 24,80 L 24,112" fill="none" stroke="black"/>
                  <path d="M 32,272 L 32,336" fill="none" stroke="black"/>
                  <path d="M 72,136 L 72,272" fill="none" stroke="black"/>
                  <path d="M 88,128 L 88,264" fill="none" stroke="black"/>
                  <path d="M 136,80 L 136,112" fill="none" stroke="black"/>
                  <path d="M 136,320 L 136,408" fill="none" stroke="black"/>
                  <path d="M 152,32 L 152,128" fill="none" stroke="black"/>
                  <path d="M 160,272 L 160,336" fill="none" stroke="black"/>
                  <path d="M 280,272 L 280,336" fill="none" stroke="black"/>
                  <path d="M 296,256 L 296,272" fill="none" stroke="black"/>
                  <path d="M 304,320 L 304,408" fill="none" stroke="black"/>
                  <path d="M 336,144 L 336,248" fill="none" stroke="black"/>
                  <path d="M 352,144 L 352,248" fill="none" stroke="black"/>
                  <path d="M 416,272 L 416,336" fill="none" stroke="black"/>
                  <path d="M 432,256 L 432,320" fill="none" stroke="black"/>
                  <path d="M 448,224 L 448,448" fill="none" stroke="black"/>
                  <path d="M 8,32 L 152,32" fill="none" stroke="black"/>
                  <path d="M 24,80 L 136,80" fill="none" stroke="black"/>
                  <path d="M 24,112 L 136,112" fill="none" stroke="black"/>
                  <path d="M 8,128 L 152,128" fill="none" stroke="black"/>
                  <path d="M 8,224 L 448,224" fill="none" stroke="black"/>
                  <path d="M 296,256 L 432,256" fill="none" stroke="black"/>
                  <path d="M 32,272 L 160,272" fill="none" stroke="black"/>
                  <path d="M 280,272 L 416,272" fill="none" stroke="black"/>
                  <path d="M 152,304 L 288,304" fill="none" stroke="black"/>
                  <path d="M 416,320 L 432,320" fill="none" stroke="black"/>
                  <path d="M 32,336 L 160,336" fill="none" stroke="black"/>
                  <path d="M 280,336 L 416,336" fill="none" stroke="black"/>
                  <path d="M 8,416 L 448,416" fill="none" stroke="black"/>
                  <path d="M 8,448 L 448,448" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="360,248 348,242.4 348,253.6" fill="black" transform="rotate(90,352,248)"/>
                  <polygon class="arrowhead" points="344,248 332,242.4 332,253.6" fill="black" transform="rotate(90,336,248)"/>
                  <polygon class="arrowhead" points="312,408 300,402.4 300,413.6" fill="black" transform="rotate(90,304,408)"/>
                  <polygon class="arrowhead" points="312,320 300,314.4 300,325.6" fill="black" transform="rotate(270,304,320)"/>
                  <polygon class="arrowhead" points="296,304 284,298.4 284,309.6" fill="black" transform="rotate(0,288,304)"/>
                  <polygon class="arrowhead" points="160,304 148,298.4 148,309.6" fill="black" transform="rotate(180,152,304)"/>
                  <polygon class="arrowhead" points="144,408 132,402.4 132,413.6" fill="black" transform="rotate(90,136,408)"/>
                  <polygon class="arrowhead" points="144,320 132,314.4 132,325.6" fill="black" transform="rotate(270,136,320)"/>
                  <polygon class="arrowhead" points="96,264 84,258.4 84,269.6" fill="black" transform="rotate(90,88,264)"/>
                  <polygon class="arrowhead" points="80,136 68,130.4 68,141.6" fill="black" transform="rotate(270,72,136)"/>
                  <g class="text">
                    <text x="76" y="52">Server</text>
                    <text x="80" y="100">Attestation</text>
                    <text x="132" y="164">Identity</text>
                    <text x="396" y="164">Workload</text>
                    <text x="144" y="180">Credentials</text>
                    <text x="396" y="180">to</text>
                    <text x="396" y="196">Workload</text>
                    <text x="416" y="212">Communication</text>
                    <text x="64" y="292">Agent</text>
                    <text x="328" y="292">Workloads</text>
                    <text x="212" y="324">Identity</text>
                    <text x="224" y="340">Credentials</text>
                    <text x="348" y="372">Identity</text>
                    <text x="80" y="388">Attestation</text>
                    <text x="360" y="388">Credentials</text>
                    <text x="36" y="436">Host</text>
                    <text x="96" y="436">Operating</text>
                    <text x="164" y="436">System</text>
                    <text x="208" y="436">and</text>
                    <text x="260" y="436">Hardware</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
  +-----------------+
  |     Server      |
  |                 |
  | +-------------+ |
  | | Attestation | |
  | +-------------+ |
  +---------+-------+
          ^ |                              . .
          | | Identity                     | | Workload
          | | Credentials                  | |    to
          | |                              | | Workload
          | |                              | | Communication
  +-------+-+------------------------------+-+-----------+
  |       | |                              v V           |
  |       | v                         +----------------+ |
  |  +----+----------+              +-+--------------+ | |
  |  | Agent         |              | Workloads      | | |
  |  |              <+--------------+>               | | |
  |  |            ^  |  Identity    |  ^             +-+ |
  |  +------------+--+  Credentials +--+-------------+   |
  |               |                    |                 |
  |               |                    | Identity        |
  |   Attestation |                    | Credentials     |
  |               v                    v                 |
  +------------------------------------------------------+
  | Host Operating System and Hardware                   |
  +------------------------------------------------------+
]]></artwork>
            </artset>
          </figure>
          <t>How the workload obtains its identity credentials and interacts with the agent is subject to different implementations. Some common mechanisms for obtaining this initial identity include:</t>
          <ul spacing="normal">
            <li>
              <t>File System - in this mechanism the identity credential is provisioned to the workload via the filesystem.</t>
            </li>
            <li>
              <t>Local API - the identity credential is provided through an API, such as a local domain socket (for example SPIFFE or QEMU guest agent) or network API (for example Cloud Provider Metadata Server).</t>
            </li>
            <li>
              <t>Environment Variables - identity credential may also be injected into workloads using operating system environment variables.</t>
            </li>
          </ul>
        </section>
        <section anchor="identity-credentials">
          <name>Identity Credentials</name>
          <t>The Agent provisions the identity credentials to the workload. These credentials are represented in form of JWT tokens and/or X.509 certificates.</t>
          <t>JWT bearer tokens are presented to another party as a proof of identity. They are signed to prevent forgery, however since these credentials are often not bound to other information it is possible that they could be stolen and reused elsewhere. To reduce some of these risks, bearer tokens may have a short lifespan. Alternatively, sender constrained tokens can be used such as TLS session binding.</t>
          <t>X.509 certificate credentials consist of two parts:</t>
          <ul spacing="normal">
            <li>
              <t>a certificate is a signed data structure that contains a public key and identity information</t>
            </li>
            <li>
              <t>a corresponding private key</t>
            </li>
          </ul>
          <t>The certificate is presented during authentication, however the private key is kept secret and only used in cryptographic computation to prove that the presenter has access to the private key that corresponds to the public key in the certificate.</t>
        </section>
      </section>
      <section anchor="workload-identity-use-cases">
        <name>Workload Identity Use Cases</name>
        <section anchor="basic-service-authentication-and-authorization">
          <name>Basic Service Authentication and Authorization</name>
          <t>One of the most basic use cases for workload identity is authentication of one workload to another, such as in the case where one service is making a request to another service as part of a larger, more complex application. Following authentication, the request to the service offered by the workload it needs to be authorized. Even in this simple case the identity of a workload is often composed of many attributes such as:</t>
          <ul spacing="normal">
            <li>
              <t>Trigger Information</t>
            </li>
            <li>
              <t>Service Name</t>
            </li>
            <li>
              <t>Instance Name</t>
            </li>
            <li>
              <t>Role</t>
            </li>
            <li>
              <t>Environment</t>
            </li>
            <li>
              <t>Trust Domain</t>
            </li>
            <li>
              <t>Software Attestation</t>
            </li>
            <li>
              <t>Hardware Attestation</t>
            </li>
          </ul>
          <t>These attributes are used for various purposes such as:</t>
          <ul spacing="normal">
            <li>
              <t>ensuring the request is made to the correct service or service instance</t>
            </li>
            <li>
              <t>authorizing access to APIs and resources</t>
            </li>
            <li>
              <t>providing an audit trail of requests within a system</t>
            </li>
            <li>
              <t>providing context for other decisions made within a service</t>
            </li>
          </ul>
          <t>There are several methods defined to perform this authentication.  Some of the most common include:</t>
          <ul spacing="normal">
            <li>
              <t>TLS authentication of the server using X.509 certificates and bearer token, encoded as JWTs.</t>
            </li>
            <li>
              <t>Mutual TLS authentication using X.509 certificate for both client and server.</t>
            </li>
            <li>
              <t>TLS authentication of the server and HTTP request signing using a secret key.</t>
            </li>
          </ul>
          <t><xref target="arch-chain"/> illustrates the communication between different workloads. Two aspects are important
to highlight: First, there is a need to consider the interaction with workloads that are external
to the trust domain (sometimes called cross-domain). Second, the interaction does
not only occur between workloads that directly interact with each other but instead may also
take place across intermediate workloads (in an end-to-end style).</t>
          <figure anchor="arch-chain">
            <name>Workload-to-Workload Communication.</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="384" width="520" viewBox="0 0 520 384" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 8,32 L 8,96" fill="none" stroke="black"/>
                  <path d="M 8,144 L 8,352" fill="none" stroke="black"/>
                  <path d="M 32,192 L 32,304" fill="none" stroke="black"/>
                  <path d="M 72,80 L 72,208" fill="none" stroke="black"/>
                  <path d="M 128,192 L 128,304" fill="none" stroke="black"/>
                  <path d="M 152,32 L 152,96" fill="none" stroke="black"/>
                  <path d="M 216,192 L 216,304" fill="none" stroke="black"/>
                  <path d="M 312,192 L 312,304" fill="none" stroke="black"/>
                  <path d="M 400,192 L 400,304" fill="none" stroke="black"/>
                  <path d="M 496,192 L 496,304" fill="none" stroke="black"/>
                  <path d="M 512,144 L 512,352" fill="none" stroke="black"/>
                  <path d="M 8,32 L 152,32" fill="none" stroke="black"/>
                  <path d="M 8,96 L 152,96" fill="none" stroke="black"/>
                  <path d="M 8,144 L 272,144" fill="none" stroke="black"/>
                  <path d="M 392,144 L 512,144" fill="none" stroke="black"/>
                  <path d="M 32,192 L 128,192" fill="none" stroke="black"/>
                  <path d="M 216,192 L 312,192" fill="none" stroke="black"/>
                  <path d="M 400,192 L 496,192" fill="none" stroke="black"/>
                  <path d="M 120,240 L 224,240" fill="none" stroke="black"/>
                  <path d="M 304,240 L 408,240" fill="none" stroke="black"/>
                  <path d="M 80,288 L 440,288" fill="none" stroke="black"/>
                  <path d="M 32,304 L 128,304" fill="none" stroke="black"/>
                  <path d="M 216,304 L 312,304" fill="none" stroke="black"/>
                  <path d="M 400,304 L 496,304" fill="none" stroke="black"/>
                  <path d="M 8,352 L 512,352" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="448,288 436,282.4 436,293.6" fill="black" transform="rotate(0,440,288)"/>
                  <polygon class="arrowhead" points="416,240 404,234.4 404,245.6" fill="black" transform="rotate(0,408,240)"/>
                  <polygon class="arrowhead" points="312,240 300,234.4 300,245.6" fill="black" transform="rotate(180,304,240)"/>
                  <polygon class="arrowhead" points="232,240 220,234.4 220,245.6" fill="black" transform="rotate(0,224,240)"/>
                  <polygon class="arrowhead" points="128,240 116,234.4 116,245.6" fill="black" transform="rotate(180,120,240)"/>
                  <polygon class="arrowhead" points="88,288 76,282.4 76,293.6" fill="black" transform="rotate(180,80,288)"/>
                  <polygon class="arrowhead" points="80,208 68,202.4 68,213.6" fill="black" transform="rotate(90,72,208)"/>
                  <polygon class="arrowhead" points="80,80 68,74.4 68,85.6" fill="black" transform="rotate(270,72,80)"/>
                  <g class="text">
                    <text x="84" y="52">Workload</text>
                    <text x="84" y="68">(external)</text>
                    <text x="296" y="148">Trust</text>
                    <text x="356" y="148">Boundary</text>
                    <text x="168" y="196">Hop-by-</text>
                    <text x="352" y="196">Hop-by-</text>
                    <text x="152" y="212">Hop</text>
                    <text x="336" y="212">Hop</text>
                    <text x="76" y="228">Workload</text>
                    <text x="172" y="228">Security</text>
                    <text x="260" y="228">Workload</text>
                    <text x="356" y="228">Security</text>
                    <text x="444" y="228">Workload</text>
                    <text x="72" y="292">O</text>
                    <text x="448" y="292">O</text>
                    <text x="168" y="308">E2E</text>
                    <text x="352" y="308">E2E</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
  +-----------------+
  |     Workload    |
  |    (external)   |
  |       ^         |
  +-------+---------+
          |
          |
  +-------+-------------------------Trust Boundary---------------+
  |       |                                                      |
  |       |                                                      |
  |  +----+------+ Hop-by-  +-----------+ Hop-by-  +-----------+ |
  |  |    v      | Hop      |           | Hop      |           | |
  |  | Workload  | Security | Workload  | Security | Workload  | |
  |  |          <+----------+>         <+----------+>          | |
  |  |           |          |           |          |           | |
  |  |           |          |           |          |           | |
  |  |    O<-----+----------+-----------+----------+---->O     | |
  |  +-----------+   E2E    +-----------+   E2E    +-----------+ |
  |                                                              |
  |                                                              |
  +--------------------------------------------------------------+
]]></artwork>
            </artset>
          </figure>
        </section>
        <section anchor="security-context-establishment-and-propagation">
          <name>Security Context Establishment and Propagation</name>
          <t>In a typical system of workloads additional information is needed in order for the workload to perform its function. For example, it is common for a workload to require information about a user or other entity that originated the request. Other types of information may include information about the hardware or software that the workload is running or information about what processing and validation has already been done to the request. This type of information is part of the security context that the workload uses during authorization, accounting and auditing. This context is propagated and possibly augmented from workload to workload using tokens. Workload identity comes into play to ensure that the information in the context can only be used by an authorized workload and that the context information originated from an authorized workload.</t>
        </section>
        <section anchor="delegation-and-impersonation">
          <name>Delegation and Impersonation</name>
          <t>TBD.</t>
        </section>
        <section anchor="asynchronous-and-batch-requests">
          <name>Asynchronous and Batch Requests</name>
          <t>TBD.</t>
        </section>
        <section anchor="cross-boundary-workload-identity">
          <name>Cross-boundary Workload Identity</name>
          <t>As workloads often need to communicate across trust boundaries, extra care needs to be taken when it comes to identity communication to ensure scalability and privacy. (TODO: align with OAuth cross domain identity and authorization)</t>
          <section anchor="egress-identity-generalization">
            <name>Egress Identity Generalization</name>
            <t>A workload communicating with a service, or another workload located outside the trust boundary may need to provide modified identity information. Detailed identity of internal workload originating the communication is relevant inside the trust boundary but could be excessive for the outside world and expose potentially sensitive internal topology information.</t>
            <t>A security gateway at the edge of a trust boundary can be used to validate identity information of the workload, perform context specific authorization of the transaction and replace workload specific identity with a generalized one for a given trust domain.</t>
          </section>
          <section anchor="inbound-gateway-identity-validation">
            <name>Inbound Gateway Identity Validation</name>
            <t>Inbound security gateway is a common design pattern for service protection. This functionality is often found in CDN services, API gateways, load balancers, Web Application Firewalls (WAFs) and other security solutions. Workload identity verification of inbound requests should be performed as a part of these security services. After validation of workload identity, the gateway may either leave it unmodified or replace it with its own identity to be validated by the destination.</t>
          </section>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="traffic-interception">
        <name>Traffic Interception</name>
        <t>Workloads communicating with applications may face different threats to traffic interception in different deployments. In many deployments security controls are deployed for internal communications at lower layers to reduce the risk of traffic observation and modification for network communications. When a security layer, such as TLS, is deployed in these environments. TLS may be terminated in various places, including the workload itself, and in various middleware devices, such as load balancers, gateways, proxies, and firewalls. Therefore, protection is provided only between each adjacent pair of TLS endpoints. There are no guarantees of confidentiality, integrity and correct identity passthrough in those middleware devices and services.</t>
      </section>
      <section anchor="information-disclosure">
        <name>Information Disclosure</name>
        <t>Observation and interception of network traffic is not the only means of disclosure in these systems. Other vectors of information leakage is through disclosure in log files and other observability and troubleshooting mechanisms. For example, an application may log the contents of HTTP headers containing JWT bearer tokens. The information in these logs may be made available to other systems with less stringent access controls, which may result in this token falling into an attackers hands who then uses it to compromise a system. This creates privacy risks and potential surface for reconnaissance attacks. If observed tokens can be reused, this also may allow attackers to impersonate workloads.</t>
      </section>
      <section anchor="workload-compromise">
        <name>Workload Compromise</name>
        <t>Even the most well-designed and implemented workloads may contain security flaws that allow an attacker to gain limited or full compromise. For example, a server side request forgery may result in the ability for an attacker to force the workload to make requests of other parts of a system even though the rest of the workload functionality may be unaffected. An attacker with this advantage may be able to utilize privileges of the compromised workload to attack other parts of the system. Therefore it is important that communicating workloads apply the principle of least privilege through security controls such as authorization.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <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="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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-oauth-transaction-tokens">
          <front>
            <title>Transaction Tokens</title>
            <author fullname="Atul Tulshibagwale" initials="A." surname="Tulshibagwale">
              <organization>SGNL</organization>
            </author>
            <author fullname="George Fletcher" initials="G." surname="Fletcher">
              <organization>Capital One</organization>
            </author>
            <author fullname="Pieter Kasselman" initials="P." surname="Kasselman">
              <organization>Microsoft</organization>
            </author>
            <date day="16" month="March" year="2024"/>
            <abstract>
              <t>   Transaction Tokens (Txn-Tokens) enable workloads in a trusted domain
   to ensure that user identity and authorization context of an external
   programmatic request, such as an API invocation, are preserved and
   available to all workloads that are invoked as part of processing
   such a request.  Txn-Tokens also enable workloads within the trusted
   domain to optionally immutably assert to downstream workloads that
   they were invoked in the call chain of the request.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-oauth-transaction-tokens-01"/>
        </reference>
      </references>
    </references>
    <?line 261?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>Todo: Add your name here.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
P9u7w/1kQgAA

-->

</rfc>
