<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Stephane Nangue</title>
    <description>The latest articles on DEV Community by Stephane Nangue (@stephnangue).</description>
    <link>https://dev.to/stephnangue</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3792001%2F08f732e6-677c-4558-ae58-13c367b5e42a.png</url>
      <title>DEV Community: Stephane Nangue</title>
      <link>https://dev.to/stephnangue</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stephnangue"/>
    <language>en</language>
    <item>
      <title>good to know</title>
      <dc:creator>Stephane Nangue</dc:creator>
      <pubDate>Tue, 17 Mar 2026 22:58:39 +0000</pubDate>
      <link>https://dev.to/stephnangue/good-to-know-45g2</link>
      <guid>https://dev.to/stephnangue/good-to-know-45g2</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/stephnangue" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3792001%2F08f732e6-677c-4558-ae58-13c367b5e42a.png" alt="stephnangue"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/stephnangue/stop-giving-secrets-to-your-workloads-from-long-lived-credentials-to-identity-aware-egress-2joe" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Stop Giving Secrets to Your Workloads: From Long-Lived Credentials to Identity-Aware Egress&lt;/h2&gt;
      &lt;h3&gt;Stephane Nangue ・ Mar 17&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#cloud&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#identity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#security&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#kubernetes&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>cloud</category>
      <category>identity</category>
      <category>security</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>good to read</title>
      <dc:creator>Stephane Nangue</dc:creator>
      <pubDate>Tue, 17 Mar 2026 22:57:36 +0000</pubDate>
      <link>https://dev.to/stephnangue/-4nif</link>
      <guid>https://dev.to/stephnangue/-4nif</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/stephnangue" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3792001%2F08f732e6-677c-4558-ae58-13c367b5e42a.png" alt="stephnangue"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/stephnangue/stop-giving-secrets-to-your-workloads-from-long-lived-credentials-to-identity-aware-egress-2joe" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Stop Giving Secrets to Your Workloads: From Long-Lived Credentials to Identity-Aware Egress&lt;/h2&gt;
      &lt;h3&gt;Stephane Nangue ・ Mar 17&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#cloud&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#identity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#security&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#kubernetes&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>cloud</category>
      <category>identity</category>
      <category>security</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Stop Giving Secrets to Your Workloads: From Long-Lived Credentials to Identity-Aware Egress</title>
      <dc:creator>Stephane Nangue</dc:creator>
      <pubDate>Tue, 17 Mar 2026 22:54:12 +0000</pubDate>
      <link>https://dev.to/stephnangue/stop-giving-secrets-to-your-workloads-from-long-lived-credentials-to-identity-aware-egress-2joe</link>
      <guid>https://dev.to/stephnangue/stop-giving-secrets-to-your-workloads-from-long-lived-credentials-to-identity-aware-egress-2joe</guid>
      <description>&lt;p&gt;&lt;em&gt;How WIMSE rethinks credential exchange in multi-cloud environments — and how to implement it today&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every modern cloud application eventually faces the same uncomfortable truth: to call an external API, it needs a secret. That secret — an API key, an access token, a cloud credential — has to live somewhere. Today, the standard approach is to store that secret in a secret manager and have each workload fetch it at startup. From that point on, the secret lives in the application's memory for as long as the workload runs — ready to be used for every outbound API call. This model is simple to implement, but it carries a category of risk that quietly scales with your infrastructure.&lt;/p&gt;

&lt;p&gt;The more services you run, the more copies of those credentials exist. The more cloud providers you integrate, the wider the attack surface grows. A single leaked key — in a log, in a crash dump, over an insecure channel — can give an attacker everything they need to move laterally across your systems.&lt;/p&gt;

&lt;p&gt;The IETF is actively working on a standard called WIMSE (Workload Identity in a Multi-System Environment) that addresses this problem at its root: instead of distributing long-lived credentials to workloads, you issue short-lived, request-scoped access credentials derived from the workload's verified identity. This article explains what WIMSE proposes, where it still falls short, and how an identity-aware egress gateway can implement the same trust model today — without waiting for the standard to mature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the Building Blocks
&lt;/h2&gt;

&lt;p&gt;Before diving into the architecture, it helps to be precise about some terms that are often conflated.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;workload&lt;/strong&gt; is an independently addressable and executable software entity — a microservice, a container, a virtual machine, a serverless function — that initiates and receives network communication. A workload instance is a single running instantiation of that workload at a given point in time.&lt;/p&gt;

&lt;p&gt;An &lt;strong&gt;identity credential&lt;/strong&gt; is a document asserting who an entity is, with a cryptographic binding that lets a relying party verify the claim without trusting the document alone. The issuer signs the document; the relying party verifies the signature against a known public key or JWKS endpoint. JWT/OIDC tokens, SPIFFE SVIDs, client certificates, and SAML assertions are all examples.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;workload identity credential&lt;/strong&gt; combines both concepts: it is an identity credential whose subject is a workload, identified by a portable, structured URI called a WIMSE-ID or SPIFFE-ID that is globally meaningful across trust domains. It may be cryptographically bound to a key pair, requiring the presenter to prove possession of the private key. SPIFFE X.509-SVIDs and JWT-SVIDs are canonical examples. This is the foundational primitive that WIMSE builds on — and what distinguishes a proper workload identity system from the platform-specific attestation tokens that GitHub Actions, Kubernetes, or AWS issue today.&lt;/p&gt;

&lt;p&gt;An &lt;strong&gt;access credential&lt;/strong&gt; is a piece of data granting permissions to a specific resource or API. It carries entitlements that target services honor. Unlike identity credentials, access credentials are not cryptographically bound to the holder's entitlements, which means anyone holding one can exercise its permissions. API keys, AWS SigV4 keys, and OAuth access tokens are examples.&lt;/p&gt;

&lt;p&gt;The distinction matters because most security incidents involving cloud credentials are not identity credential leaks — they are access credential leaks. Fixing the problem means changing how access credentials are issued, scoped, and consumed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: How Credentials Are Managed Today
&lt;/h2&gt;

&lt;p&gt;Consider a concrete example: an e-commerce application called Just-Buy-It running on Kubernetes. It has an ingress controller, a payments service, and a secret manager. The payments service needs to call Stripe API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffkyfifswct9b31p4ef2f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffkyfifswct9b31p4ef2f.png" alt="secret-handling-today" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At step 0, at startup, the payments-service pod fetches a long-lived Stripe API key from the secret manager and stores it in memory.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A mobile application authenticates and obtains an access token to call the payments-service API.&lt;/li&gt;
&lt;li&gt;The mobile application calls the payments-service through the ingress controller.&lt;/li&gt;
&lt;li&gt;The ingress controller forwards the request to the payments-service over HTTPS (optionally with mTLS).&lt;/li&gt;
&lt;li&gt;The payments-service authenticates the user and uses the Stripe API key it loaded at startup to call Stripe.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This flow has several compounding problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Distributed attack surface&lt;/strong&gt;: One copy of the access credential is deployed to every instance of the payments-service. The more instances you run, the more places the credential can leak from.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Long-lived exposure&lt;/strong&gt;: The credential persists for as long as the workload runs. If it leaks, an attacker can reuse it until it is manually rotated — a window that is often measured in months.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Coarse-grained authorization&lt;/strong&gt;: The credential is scoped to a broad set of Stripe API operations, not to a specific request. Every call in the credential's lifetime uses the same permissions, dramatically increasing the blast radius of a compromise.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Context-unaware authorization&lt;/strong&gt;: Stripe authorizes the call based on credential permissions alone — not on the caller's identity, the time of day, the originating IP, or any other contextual signal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Credentials sprawl&lt;/strong&gt;: Each new external service requires a new long-lived credential in memory. In multi-cloud environments, this multiplies rapidly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Weak audit and attribution&lt;/strong&gt;: Multiple instances share the same credential. There is no per-instance identity, so tracing a specific API call back to a specific workload instance is difficult or impossible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Possession equals identity&lt;/strong&gt;: Anyone holding the access credential can call Stripe. There is no proof of who — or what — is presenting it, making workload impersonation trivially easy.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These issues do not just add up linearly — they compound. In a multi-cloud, multi-system environment with dozens of services and hundreds of instances, they become an unmanageable liability.&lt;/p&gt;

&lt;h2&gt;
  
  
  The WIMSE Approach: Identity-First Credential Exchange
&lt;/h2&gt;

&lt;p&gt;WIMSE (Workload Identity in a Multi-System Environment) is a specification being developed at the IETF to standardize how workloads obtain and use access credentials securely. Its core insight is straightforward: instead of distributing a long-lived access credential to a workload at startup, derive a short-lived, request-scoped access credential from the workload's verified identity at call time.&lt;/p&gt;

&lt;p&gt;WIMSE introduces the concept of a trust domain — a logical grouping of systems sharing a common set of security controls and policies. In our Just-Buy-It example, there are two trust domains: just-do-it.prod.com and stripe.com. Within each trust domain, workload identity credentials are issued by a &lt;strong&gt;CA/Credential Service&lt;/strong&gt; — either X.509 certificate-based or JWT-based. Three additional components orchestrate the credential exchange:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Context Service&lt;/strong&gt;: Exchanges the mobile app's access token for a security context token containing verified information about the calling entity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Token Service&lt;/strong&gt;: Accepts a workload identity credential and a security context token, and issues a WIMSE token.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;External Token Service&lt;/strong&gt;: Operated by the external provider (Stripe in our example), it accepts a WIMSE token and returns a short-lived, request-scoped access credential.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1iplhu3b39o9bebne6uf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1iplhu3b39o9bebne6uf.png" alt="secret-handling-wimse" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is how the revised flow works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The mobile application authenticates and obtains an access token.&lt;/li&gt;
&lt;li&gt;The mobile application calls the payments-service through the Gateway Service, which now acts as an identity proxy.&lt;/li&gt;
&lt;li&gt;The Gateway Service exchanges the mobile app's access token for a security context token from the Context Service.&lt;/li&gt;
&lt;li&gt;The Gateway authenticates to the payments-service using its workload identity credential and forwards the request along with the security context token. Requests without a security context token are automatically denied.&lt;/li&gt;
&lt;li&gt;The payments-service authenticates to the Token Service using its workload identity credential and passes the security context token. The Token Service issues a WIMSE token.&lt;/li&gt;
&lt;li&gt;The payments-service presents the WIMSE token to Stripe's Token Service, which returns a short-lived stripe_api_key scoped to the current request.&lt;/li&gt;
&lt;li&gt;The payments-service uses the short-lived, scoped stripe_api_key to call Stripe API.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The improvements are significant. Access credentials are short-lived and expire before an attacker can reuse them. They are issued per-request and scoped to that request, enabling fine-grained authorization. They are bound to the security context, so a leaked credential cannot be replayed without the matching context. The same workload identity credential can be used to request access credentials from multiple external systems, enabling a unified authentication posture across clouds. And because each workload instance receives its own unique credential, every API call becomes attributable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where WIMSE Still Falls Short
&lt;/h2&gt;

&lt;p&gt;WIMSE is a meaningful step forward, but it is still a draft specification — and it will not reach standard status before at least 2028, with broad ecosystem adoption likely arriving around 2029–2030. More importantly, even once standardized, it leaves several gaps that enterprise customers will find difficult to accept:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Credentials still reach workloads&lt;/strong&gt;: Even though they are short-lived, WIMSE still hands access credentials to workloads. Credential theft, replay attacks, and misuse before expiration remain possible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Issuance-time control only&lt;/strong&gt;: Once an access credential is issued, none of the WIMSE components are in the request path anymore. If a credential is misused during its validity window, there is no mechanism to intervene in real time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fragmented audit trails&lt;/strong&gt;: WIMSE logs credential issuance events; workloads log API calls. Producing a complete, correlated audit trail requires joining logs from multiple systems — a significant operational burden.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Distributed security logic&lt;/strong&gt;: Every workload must independently implement the full protocol — credential exchange, token refresh, caching, error handling, retry logic. In a system with hundreds of services, this produces a distributed, inconsistently maintained security implementation instead of a single enforcement layer.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Warden: The WIMSE Trust Model, Available Today
&lt;/h2&gt;

&lt;p&gt;Warden is not a replacement for WIMSE. It implements the same trust model — workload identity credentials, per-request scoped access, and cross-domain authorization — but as a gateway rather than a distributed protocol. When WIMSE becomes a standard, Warden will be a natural implementation of it. In the meantime, it solves the problem today, with existing infrastructure, without waiting for ecosystem-wide adoption.&lt;br&gt;
In our use case, Warden remplaces the Context Service and the Token Service. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy3k68gt6l4ui92ci211v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy3k68gt6l4ui92ci211v.png" alt="wimse-with-warden" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is how the revised flow works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The mobile application authenticates and obtains an access token.&lt;/li&gt;
&lt;li&gt;The mobile application calls the payments-service through the Gateway Service.&lt;/li&gt;
&lt;li&gt;The Gateway authenticates to the payments-service using its workload identity credential and forwards the request.
The payments-service determines it needs to call Stripe API. The Stripe endpoint is configured on the payments-service to point to Warden. &lt;/li&gt;
&lt;li&gt;The payments-service authenticates to Warden using its workload identity credential and makes the call exactly as it would to Stripe directly. Warden evaluates a policy based on the full request context — including a role passed by the payments-service — to decide whether to allow the request.&lt;/li&gt;
&lt;li&gt;Based on the request context, Warden uses a privileged access credential stored in its vault — long-lived but regularly rotated automatically — to mint a short-lived stripe_api_key scoped to the current request.&lt;/li&gt;
&lt;li&gt;Warden forwards the request to Stripe API using the short-lived, scoped stripe_api_key. The credential never leaves Warden.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Warden advantages Over the Naive WIMSE Implementation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No credential distribution&lt;/strong&gt;: Warden calls cloud APIs on behalf of workloads. Credentials never reach workload processes — not even short-lived ones. The attack surface is reduced to a single, hardened component.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Continuous control&lt;/strong&gt;: Because Warden sits directly in the request path, it can inspect every request, enforce policy, and block calls in real time — not just at credential issuance time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Complete audit trails&lt;/strong&gt;: Every outbound API call passes through Warden with a unique access credential bound to a specific workload identity. The audit trail is unified and attributable by construction.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Works with existing systems&lt;/strong&gt;: WIMSE requires standardization, broad ecosystem adoption, and client-side support from every workload and external provider. Warden works immediately with existing infrastructure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reduced operational complexity&lt;/strong&gt;: Workloads do not implement credential exchange. They simply send requests, and Warden handles everything. Policy enforcement is centralized; debugging is straightforward; upgrades are isolated to one component.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Better developer experience&lt;/strong&gt;: Security happens transparently. Developers write normal HTTP calls; the gateway handles the rest.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The credential distribution problem is not new, but it is getting harder to ignore. As cloud architectures grow more distributed — more services, more providers, more workload instances — the gap between what today's secret-manager model can safely support and what modern infrastructure demands continues to widen.&lt;/p&gt;

&lt;p&gt;WIMSE offers the right conceptual framework: derive short-lived, request-scoped access credentials from verifiable workload identities, and never hand long-lived secrets to workloads. The standard is still years away from broad adoption, but the architecture does not have to wait.&lt;/p&gt;

&lt;p&gt;Warden implements this trust model today as an open-source, identity-aware egress gateway for cloud APIs. It currently proxies AWS, Azure, GCP, HashiCorp Vault, OpenBao, GitLab, GitHub, Mistral AI and OpenAI — with a roadmap targeting 100+ cloud providers, SaaS products and AI providers. The goal is to make the WIMSE model operationally available to any team, regardless of whether their cloud providers and service mesh have adopted the emerging standard.&lt;/p&gt;

&lt;p&gt;If you are building infrastructure where workload identity and credential security matter, Warden is worth a look: &lt;a href="https://github.com/stephnangue/warden" rel="noopener noreferrer"&gt;https://github.com/stephnangue/warden&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>identity</category>
      <category>security</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>I Spent 4 Years Running HashiCorp Vault in Banks. Here's What It Can't Do.</title>
      <dc:creator>Stephane Nangue</dc:creator>
      <pubDate>Wed, 25 Feb 2026 16:09:23 +0000</pubDate>
      <link>https://dev.to/stephnangue/i-spent-4-years-running-hashicorp-vault-in-banks-heres-what-it-cant-do-3e06</link>
      <guid>https://dev.to/stephnangue/i-spent-4-years-running-hashicorp-vault-in-banks-heres-what-it-cant-do-3e06</guid>
      <description>&lt;p&gt;&lt;em&gt;I've deployed and operated HashiCorp Vault in financial institutions across Europe for more than four years. Vault is an incredible piece of software. I've built my career around it. But after watching the same pattern play out at every organization, I realized Vault solves only half the problem — and the other half is about to get much worse.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Vault solves the secrets problem. It doesn't solve the access problem.
&lt;/h2&gt;

&lt;p&gt;Vault is brilliant at what it does: store secrets, rotate credentials, issue short-lived tokens, manage encryption keys. It's the foundation of secrets management for good reason.&lt;/p&gt;

&lt;p&gt;But here's what I kept seeing in every deployment, from mid-size fintechs to major European banks:&lt;/p&gt;

&lt;p&gt;Teams would spend months setting up Vault. Secrets engines configured. Policies written. AppRole or Kubernetes auth wired up. Audit logs enabled. Everything by the book.&lt;/p&gt;

&lt;p&gt;And then a service would authenticate to Vault, receive AWS credentials, and... that was it. The service walked away with real credentials and did whatever it wanted. No one knew which API calls it actually made. No one could distinguish between Service A and Service B if they shared an IAM role. And if something went wrong, CloudTrail would tell you the role name — not which of your twelve microservices actually called &lt;code&gt;s3:DeleteObject&lt;/code&gt; at 3 AM.&lt;/p&gt;

&lt;p&gt;Vault's job ends at the moment it hands over the credential. What happens after that is a blind spot.&lt;/p&gt;

&lt;h2&gt;
  
  
  The audit gap
&lt;/h2&gt;

&lt;p&gt;Let me be specific about what's missing. Imagine you have five services that authenticate to Vault and receive AWS credentials via the AWS secrets engine. Vault's audit log tells you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service A requested credentials at 10:00&lt;/li&gt;
&lt;li&gt;Service B requested credentials at 10:05&lt;/li&gt;
&lt;li&gt;Service C requested credentials at 10:12&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Great. Now one of those services makes an unusual API call — say, &lt;code&gt;iam:CreateUser&lt;/code&gt; in a production account. CloudTrail shows the IAM role made the call. But which service? You can't tell. The credentials Vault issued are identical in terms of IAM role. You're left correlating timestamps and hoping for the best.&lt;/p&gt;

&lt;p&gt;This isn't a Vault bug. It's a gap in the model. Vault manages credential &lt;em&gt;lifecycle&lt;/em&gt; — issuance, rotation, revocation. It doesn't manage credential &lt;em&gt;usage&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Short-lived credentials are not enough
&lt;/h2&gt;

&lt;p&gt;The industry has converged on "short-lived credentials" as the answer to secrets sprawl. And it's a good answer — a credential that expires in 15 minutes is better than one that lives forever.&lt;/p&gt;

&lt;p&gt;But a credential that lives for 15 minutes can still do unlimited damage in 15 minutes. Scope is defined at issuance, not at the moment of each request. Once the credential is in the service's hands, it can make any API call the IAM policy allows, as many times as it wants, until expiration.&lt;/p&gt;

&lt;p&gt;In a financial institution, the question isn't just "did this service have valid credentials?" It's "exactly what API calls did this service make, when, and were they all expected?" Short-lived credentials don't answer that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter AI agents — and the problem gets urgent
&lt;/h2&gt;

&lt;p&gt;For the last four years, this audit gap was an annoyance. Something you worked around with convention, extra tooling, and a lot of manual correlation. Humans are predictable enough that you can mostly get away with it.&lt;/p&gt;

&lt;p&gt;AI agents change everything.&lt;/p&gt;

&lt;p&gt;We're now giving autonomous software access to production cloud accounts. An AI coding agent that needs to push to GitHub, read from S3, and deploy to Azure. A data analysis agent that queries DynamoDB. An infrastructure agent that provisions resources via Terraform.&lt;/p&gt;

&lt;p&gt;These agents are non-deterministic. They make decisions at runtime. They might call an API you didn't expect, in an order you didn't predict. And they're multiplying — one team might run ten agents, each with cloud access.&lt;/p&gt;

&lt;p&gt;The question isn't whether AI agents will have cloud credentials. They already do. The question is whether anyone knows what they're doing with them.&lt;/p&gt;

&lt;p&gt;With Vault alone, the answer is no.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's missing: request-level visibility
&lt;/h2&gt;

&lt;p&gt;The gap is between credential issuance and credential usage. Vault handles the first part well. Nothing handles the second.&lt;/p&gt;

&lt;p&gt;What you actually need is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Per-request identity&lt;/strong&gt; — know which specific workload or agent made each individual API call, not just which IAM role&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-request audit&lt;/strong&gt; — log every API call with the workload identity attached, not just credential issuance events&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-request policy&lt;/strong&gt; — enforce what API calls are allowed at the moment they happen, not just at credential issuance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero credential exposure&lt;/strong&gt; — the workload shouldn't hold credentials at all, eliminating the risk of credential theft or misuse&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  This is why I built Warden
&lt;/h2&gt;

&lt;p&gt;Warden is an open-source identity-aware egress gateway. It sits in the request path between your workloads and cloud services — not at credential issuance time, but at the moment of every API call.&lt;/p&gt;

&lt;p&gt;Here's how it works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your workload makes a normal API call (say, to AWS S3)&lt;/li&gt;
&lt;li&gt;Warden intercepts the outbound request&lt;/li&gt;
&lt;li&gt;Warden verifies the workload's identity — via mTLS, JWT, Kubernetes service account, SPIFFE, or cloud machine identity&lt;/li&gt;
&lt;li&gt;Warden mints short-lived credentials on the fly (via STS, Vault, or the provider IAM)&lt;/li&gt;
&lt;li&gt;Warden injects the credentials into the request and forwards it to the cloud provider&lt;/li&gt;
&lt;li&gt;Every request is logged with the specific workload identity that made it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The workload never sees, holds, or handles real cloud credentials. They exist only inside the proxy, for the duration of a single request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Warden complements Vault — it doesn't replace it
&lt;/h2&gt;

&lt;p&gt;This is important: Warden isn't a Vault replacement. Vault is still the best secrets manager out there. Warden can use Vault as a credential source — in fact, that's one of the recommended configurations.&lt;/p&gt;

&lt;p&gt;The difference is where they sit in the stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vault&lt;/strong&gt; manages credential lifecycle: storage, issuance, rotation, revocation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warden&lt;/strong&gt; manages credential usage: per-request injection, per-request audit, per-request policy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it this way: Vault is the bank that holds the money. Warden is the accountant that records every transaction and makes sure each one is authorized.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it looks like in practice
&lt;/h2&gt;

&lt;p&gt;Warden currently supports AWS, Azure, GCP, HashiCorp Vault, GitHub, and GitLab as providers. The workload doesn't need any code changes — if your tool supports a custom endpoint URL, it works with Warden.&lt;/p&gt;

&lt;p&gt;A few things that become possible with Warden in the path:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Which agent called s3:PutObject on the production bucket at 2:47 PM?"&lt;/strong&gt; — you can answer this instantly, because every request is logged with the workload identity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Block all destructive operations from AI agents"&lt;/strong&gt; — per-request policy enforcement means you can allow reads but block deletes, regardless of what the IAM role permits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"This agent should only access GitHub repos in the &lt;code&gt;src/&lt;/code&gt; directory"&lt;/strong&gt; — Warden can enforce path-level restrictions that GitHub's own token scoping can't express&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Prove to the auditor that no unauthorized API calls were made last quarter"&lt;/strong&gt; — the audit log is complete, per-request, and tied to identities&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The hard part: proxying cloud APIs
&lt;/h2&gt;

&lt;p&gt;Building Warden has been an exercise in pain, mostly around AWS SigV4 signature verification from the proxy side. Signing a request is well-documented. Verifying one from a man-in-the-middle position — so you can strip the original auth, inject new credentials, and re-sign — is a minefield of undocumented SDK behaviors, URI encoding edge cases, and service-specific quirks.&lt;/p&gt;

&lt;p&gt;S3 alone has path-style vs virtual-hosted buckets, unsigned payloads, chunked signing, and presigned URLs with auth in query parameters. Directory buckets and table buckets use a separate SigV4-S3Express auth flow that's next on the roadmap.&lt;/p&gt;

&lt;p&gt;But the proxy architecture is what makes everything else possible. If you're not in the request path, you can't do per-request anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Warden supports six providers today. The roadmap is 100+ — every major cloud, SaaS, and AI service. The goal is to become the standard identity-aware gateway for how workloads and AI agents access external services.&lt;/p&gt;

&lt;p&gt;The project is open-source, written in Go, and available on GitHub: &lt;a href="https://github.com/stephnangue/warden" rel="noopener noreferrer"&gt;github.com/stephnangue/warden&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've been running Vault and felt the same gap I described — or if you're deploying AI agents and wondering how to govern their cloud access — I'd love to hear from you. Open an issue, start a discussion, or reach out directly.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Stephane has been deploying and operating HashiCorp Vault in financial institutions across Europe for over four years. He is the creator of Warden, an open-source identity-aware egress gateway for cloud and SaaS services.&lt;/em&gt;&lt;/p&gt;




</description>
      <category>security</category>
      <category>devops</category>
      <category>vault</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
