No more static passwords between services
Workload identity and SPIFFE: letting services prove who they are.
Workload identity and SPIFFE: letting services prove who they are.

Think about how your services authenticate to each other and to the cloud. In many companies, the answer is static credentials. An access key in an environment variable. A shared API token in a config file. A database password copied into five places. They rarely get rotated, and when one leaks, you often don't know where else it's used.
Humans moved past this a while ago: single sign-on, MFA, short-lived sessions. Workloads deserve the same.
Static credentials have three big weaknesses:
Zero trust is the idea that nothing should be trusted just because it's inside your network. Every request should prove who it comes from. For workloads, that means giving every service a strong, verifiable identity.
The easiest win: let your workloads authenticate to cloud services using their platform identity instead of keys.
On Kubernetes, every pod runs with a service account. Cloud providers can trust Kubernetes service account tokens and exchange them for short-lived cloud credentials:
The setup: link a Kubernetes service account to a cloud role. Pods using that service account automatically get temporary credentials, rotated for them, scoped to that role. No secret to store, nothing to leak for long.
apiVersion: v1
kind: ServiceAccount
metadata:
name: orders
namespace: shop
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/shop-orders
The same idea works in CI: OIDC federation lets GitHub Actions, GitLab CI and others get cloud credentials without stored keys.
The safest credential is the one that's issued for a few minutes, to one workload, for one job, and then simply expires.
Cloud workload identity solves "my pod talking to my cloud provider". But what about service-to-service calls, across clusters, clouds and on-premises machines?
SPIFFE (Secure Production Identity Framework For Everyone) is a CNCF standard for workload identity, independent of any platform. It defines:
spiffe://acme.com/ns/shop/sa/orders.SPIRE is the reference implementation. A SPIRE server issues identities, and agents on each node attest workloads: they check what the workload really is (which Kubernetes service account, which node, which process) before handing out an identity. Certificates are rotated automatically, often every hour.
Many tools speak SPIFFE: service meshes like Istio and Linkerd use SPIFFE-style identities internally, and Envoy, Cilium and various databases and proxies can use SVIDs.
With identities in place, services can use mutual TLS (mTLS): both sides present certificates, so each knows exactly who it's talking to, and the traffic is encrypted.
Doing mTLS by hand in every application is painful. That's why it's usually handled by:
On top of mTLS, you can write authorisation policies: "only the checkout service may call payments on /charge". That's real zero trust: identity-based access, not network-based.
You don't need SPIRE on day one. A practical path:
Yes. Removing static credentials eliminates one of the most common causes of breaches. The first steps, cloud workload identity and CI OIDC, are surprisingly easy and give immediate benefit.
My take: services should prove who they are every time, with credentials that expire before anyone can misuse them. Passwords are for humans, and even we're giving them up.
— Desly