Aller au contenu
Sécurité medium

Identité machine et workload identity

23 min de lecture

Quand un service A doit appeler un service B, la méthode traditionnelle est de partager un secret (mot de passe, token, clé API). Le problème : ce secret peut être copié, fuité, et dure souvent trop longtemps.

L’identité machine (ou workload identity) propose une approche différente : au lieu de partager un secret, le service prouve son identité grâce à un document cryptographique. Plus de secret applicatif partagé longue durée, attribution précise, durée de vie courte.

  • Ce qu’est une identité machine vs un secret partagé
  • Les deux familles d’identité de workload : interne (M2M) et fédération cloud
  • Comment fonctionne l’attestation (SPIRE vs OIDC cloud)
  • Pourquoi l’identité ne remplace pas l’autorisation
  • Quand utiliser l’identité machine, un secret dynamique ou un secret statique
  • Les pré-requis techniques et pièges courants

Le service payment-api doit appeler le service user-api pour valider un utilisateur. Approche traditionnelle :

payment-api/config.yaml
user_api:
url: https://user-api.internal
api_key: "shared-secret-between-services"

Problèmes :

ProblèmeConséquence
Secret partagéSi un service est compromis, l’autre l’est aussi
Copié partoutDans les configs, les variables d’environnement, les backups
Pas d’attributionImpossible de savoir quel service a fait quelle requête
Rotation pénibleChanger le secret = redéployer tous les services

Au lieu de partager un secret, chaque service prouve qui il est grâce à un document cryptographique (certificat X.509 ou JWT signé). Le service cible vérifie :

  1. Le document est valide (signé par une autorité de confiance)
  2. L’identité correspond bien au service attendu
  3. Le service a le droit d’appeler cette API

Plus de secret applicatif partagé longue durée. Chaque service a sa propre identité, courte, vérifiable, non copiable.

Une identité machine (ou workload identity) est un document cryptographique qui identifie un workload (pod, VM, service, fonction) de façon vérifiable.

Ce n’est pas un mot de passe. C’est une attestation : “Ce workload est bien qui il prétend être, et voici la preuve cryptographique”.

ComposantRôle
Identifiant uniqueNom du workload (ex: spiffe://example.org/payment-api)
Document cryptographiqueCertificat X.509 ou JWT signé
Durée de vie courteMinutes ou heures, pas mois
AttestationPreuve que le workload tourne bien où il prétend

La distinction est fondamentale. Un secret peut être copié et utilisé n’importe où, tandis qu’une identité machine est cryptographiquement liée à un workload spécifique.

AspectSecretIdentité machine
NatureDonnée sensible à protégerDocument cryptographique vérifiable
PartagePeut être copiéLiée cryptographiquement au workload
DuréeSouvent longueCourte (certificat temporaire)
AttributionDifficileTriviale (identité unique)
RévocationManuelle, incomplèteAutomatique à expiration

Quand on parle d’identité machine, il faut distinguer deux sous-modèles qui répondent à des besoins différents, même s’ils partagent le même principe de base.

Les deux familles d'identité de workload : identité interne M2M avec SPIFFE/SPIRE et fédération cloud via OIDC

L’identité sert à authentifier les services entre eux, à l’intérieur d’une infrastructure. C’est le domaine de SPIFFE/SPIRE et des service meshes (Istio, Linkerd, Cilium).

Caractéristiques :

  • Certificats X.509 ou JWT signés par une autorité propre
  • Communication mTLS entre services
  • Indépendant du cloud provider
  • Nécessite un agent local (SPIRE Agent) ou un sidecar proxy (Envoy) pour l’intégration

L’identité sert à accéder à des services cloud (S3, GCS, Azure Key Vault) depuis un workload Kubernetes, sans clé statique. C’est le domaine de GKE Workload Identity Federation, EKS IRSA et AKS Workload Identity.

Caractéristiques :

  • Repose sur le fournisseur OIDC du cluster Kubernetes
  • Le cloud vérifie le token OIDC et attribue des credentials temporaires
  • Spécifique à chaque cloud provider
  • Ne nécessite pas d’agent SPIRE : le cluster expose un OIDC issuer, le cloud fait la fédération

Identité et autorisation : deux questions distinctes

Section intitulée « Identité et autorisation : deux questions distinctes »

L’identité répond à “qui est ce workload ?”. Mais elle ne répond pas à “que peut-il faire ?”. Ce sont deux mécanismes séparés.

QuestionMécanismeExemples
Qui suis-je ?Identité (attestation)SVID SPIFFE, token OIDC
Que puis-je faire ?Autorisation (politique)IAM policies, AuthorizationPolicy Istio, Vault policies

Un workload peut avoir une identité valide et se voir refuser l’accès si la politique d’autorisation ne l’autorise pas. L’inverse aussi : une politique trop permissive (“allow all authenticated”) rend l’identité inutile.

En pratique, chaque couche a sa propre politique d’autorisation :

  • Service mesh : AuthorizationPolicy (Istio) ou NetworkPolicy avec identité (Cilium)
  • Vault : policies basées sur le SPIFFE ID ou le rôle Kubernetes
  • IAM cloud : rôle IAM associé au ServiceAccount (IRSA, GKE WIF, AKS WI)
  • Application : vérification du subject du JWT ou du CN du certificat

Le mécanisme d’attestation varie selon le modèle choisi. SPIRE et les solutions cloud suivent des flux différents.

SPIRE procède en deux phases : il atteste d’abord le nœud, puis le workload qui tourne sur ce nœud. Les deux phases doivent réussir pour qu’un SVID soit émis.

Flux d'attestation SPIRE en deux phases : attestation du nœud puis attestation du workload
  1. Attestation du nœud

    Le SPIRE Agent prouve l’identité du nœud au SPIRE Server. Selon l’environnement, les preuves peuvent être un instance identity document AWS, un certificat TPM, ou un token de jointure.

  2. Attestation du workload

    L’agent collecte les preuves du workload : namespace Kubernetes, ServiceAccount, labels, PID du processus. Ces preuves sont comparées aux registration entries configurées dans le serveur.

  3. Émission du SVID

    Si les deux attestations réussissent, le workload récupère un SVID (certificat X.509 ou JWT) via la Workload API, avec un TTL de quelques heures. Le renouvellement est automatique.

Les solutions cloud (GKE, EKS, AKS) suivent un flux différent qui repose sur le fournisseur OIDC intégré au cluster Kubernetes.

Flux de fédération OIDC : le pod obtient un JWT du cluster, le cloud vérifie via OIDC et émet des credentials temporaires
  1. Le pod reçoit un JWT projeté

    Kubernetes projette un token JWT dans le pod, lié à son ServiceAccount.

  2. Le cloud vérifie le token OIDC

    Le cloud provider (AWS IAM, Google IAM, Microsoft Entra) vérifie le JWT auprès de l’OIDC issuer du cluster.

  3. Émission de credentials temporaires

    Si la vérification réussit et que la politique IAM l’autorise, le cloud émet des credentials temporaires (STS token AWS, access token GCP, etc.).

  4. Accès aux services cloud

    Le pod utilise ces credentials pour accéder aux APIs cloud (S3, GCS, Azure Key Vault…).

SPIFFE : un standard majeur pour l’identité de workload

Section intitulée « SPIFFE : un standard majeur pour l’identité de workload »

SPIFFE (Secure Production Identity Framework for Everyone) est un standard CNCF pour les identités de workload, particulièrement pertinent pour les architectures cloud-native et les communications M2M.

Un identifiant unique pour chaque workload :

spiffe://trust-domain/path/to/workload
# Exemples
spiffe://example.org/payment-api
spiffe://example.org/ns/production/sa/frontend
spiffe://mycompany.com/region/eu-west-1/service/checkout

Le document cryptographique qui prouve l’identité. Deux formats :

FormatUsage
X.509-SVIDCertificat X.509 pour mTLS entre services
JWT-SVIDToken JWT pour les APIs et proxies qui ne gèrent pas mTLS

SPIRE (SPIFFE Runtime Environment) est l’implémentation de référence production-ready des APIs SPIFFE. Il se compose de :

ComposantRôle
SPIRE ServerAutorité centrale, signe les SVIDs, vérifie les attestations
SPIRE AgentTourne sur chaque nœud, atteste les workloads, distribue les SVIDs
Workload APIAPI Unix socket pour récupérer les SVIDs depuis les workloads

Les cloud providers proposent leurs propres solutions de fédération d’identité entre Kubernetes et leurs APIs. Ces solutions reposent toutes sur le même principe : le fournisseur OIDC du cluster fédère l’identité vers le système IAM du cloud.

Un pod GKE peut utiliser un service account GCP sans clé JSON :

apiVersion: v1
kind: ServiceAccount
metadata:
name: my-app
annotations:
iam.gke.io/gcp-service-account: my-app@project.iam.gserviceaccount.com

Un pod EKS peut assumer un rôle IAM :

apiVersion: v1
kind: ServiceAccount
metadata:
name: my-app
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789:role/my-app-role

Un pod AKS peut utiliser une identité managée Microsoft Entra :

apiVersion: v1
kind: ServiceAccount
metadata:
name: my-app
annotations:
azure.workload.identity/client-id: <client-id>

L’identité ne suffit pas : il faut un point d’intégration

Section intitulée « L’identité ne suffit pas : il faut un point d’intégration »

Avoir une identité (SVID, JWT cloud) ne sert à rien si le workload ne sait pas l’utiliser. L’identité doit être consommée par une couche d’intégration.

Point d’intégrationComment ça fonctionne
Proxy Envoy / sidecarLe proxy gère mTLS et présente le certificat automatiquement
Service mesh (Istio, Linkerd, Cilium)Injection transparente de l’identité via sidecar ou eBPF
SDK cloud (AWS SDK, google-cloud-go)Le SDK détecte les credentials projetés et les utilise
Vault Agent / CSI driverÉchange l’identité SPIFFE contre un secret dynamique
Bibliothèque applicativeL’application charge explicitement le certificat ou le JWT

L’identité machine supprime le secret applicatif partagé longue durée entre services. C’est un progrès majeur. Mais une chaîne de confiance initiale reste nécessaire :

Élément de confianceRôle
Ancre de confiance (CA root)Signe les certificats SPIFFE
Trust bundleDistribué à tous les workloads pour vérifier les SVIDs
OIDC issuerLe cluster publie une URL vérifiable par le cloud
Configuration de fédérationLie le ServiceAccount K8s au rôle/identité cloud
Plugin d’attestationVérifie l’identité du nœud au démarrage

Ces éléments doivent être protégés, audités et maintenus. La rotation du trust bundle, la configuration de l’OIDC issuer et les plugins d’attestation sont des surfaces d’attaque à surveiller.

Deux microservices communiquent de façon sécurisée grâce aux certificats SPIFFE. Chaque service vérifie l’identité de l’autre. Pas de secret partagé entre les deux services.

En pratique, le mTLS nécessite un point d’intégration : un proxy sidecar (Envoy, géré par un service mesh), ou une bibliothèque capable de charger les X.509-SVIDs depuis la Workload API SPIFFE.

Au lieu d’un mot de passe DB statique :

  1. Le pod a une identité SPIFFE
  2. Il présente cette identité à Vault
  3. Vault vérifie l’identité et génère des credentials DB dynamiques
  4. Le pod se connecte à la DB avec ces credentials temporaires

C’est un usage hybride : l’identité machine (SPIFFE) est utilisée pour obtenir un secret dynamique (Vault), qui sert de credential vers un système qui ne comprend pas les certificats SPIFFE.

Au lieu d’access keys stockées dans le dépôt :

  1. Le workflow GitHub Actions reçoit un token OIDC
  2. AWS/GCP vérifie le token auprès du fournisseur OIDC de GitHub
  3. Le workflow reçoit des credentials temporaires
  4. Aucun secret stocké dans le dépôt
# GitHub Actions avec OIDC vers AWS
permissions:
id-token: write
contents: read
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2
with:
role-to-assume: arn:aws:iam::123456789:role/github-actions
aws-region: eu-west-1

Dans un service mesh (Istio, Linkerd, Cilium) :

  • Chaque pod a un sidecar (ou agent eBPF) avec une identité
  • Le trafic inter-pod est chiffré automatiquement via mTLS
  • L’autorisation est basée sur l’identité, pas sur des secrets
  • L’application n’a aucune modification à faire

Ce guide vient après la comparaison statiques vs dynamiques. Pour choisir la bonne approche, utilisez ce tableau :

BesoinApproche recommandéePourquoi
Pod K8s vers API cloud (S3, GCS)Workload identity native (IRSA, GKE WIF, AKS WI)Pas de secret, fédération OIDC directe
Service interne vers service interneSPIFFE/SPIRE ou service meshmTLS avec identité, pas de secret M2M
Service vers base de données classiqueSecret dynamique (Vault)La DB ne comprend pas les certificats SPIFFE
API tierce avec clé fixeSecret statique sous coffre-fortL’API impose une clé, pas d’alternative
Accès SSH courtCertificat signé (Vault SSH)Pas de clé SSH permanente
CI/CD vers cloudOIDC federation (GitHub → AWS/GCP)Pas d’access key stockée
Application legacy (pas de mTLS)Secret dynamique ou statique sous coffreL’app ne sait pas consommer des certificats

L’identité machine n’est pas toujours le bon point de départ. Elle peut être la bonne réponse à terme sans être la priorité immédiate.

SituationPourquoi reporterCommencer par
Application legacy non modifiableNe sait pas recharger des certificatsSecret dynamique ou statique sous coffre
API externe à clé fixeL’API impose son modèleStocker la clé dans un coffre-fort
Équipe sans culture PKI/OIDCCourbe d’apprentissage trop raideCoffre-fort + rotation automatique
Les secrets sont encore dans le codePriorité : sortir les secretsDétection + coffre-fort
Infrastructure non KubernetesSPIFFE nécessite un runtime compatibleVault avec auth method adaptée

Avant de déployer une solution d’identité machine, vérifiez que votre infrastructure est prête.

Pré-requisDétail
PKI ou trust anchorCA racine pour signer les SVIDs
SPIRE Server en haute disponibilitéRéplication, datastore partagé (PostgreSQL, MySQL)
SPIRE Agent sur chaque nœudDaemonSet Kubernetes ou agent système
Plugin d’attestationAdapté à l’environnement (K8s, AWS, GCP, bare metal)
ObservabilitéMétriques et logs pour détecter les échecs d’attestation
Trust bundle distributionMécanisme pour distribuer et renouveler le bundle
Synchronisation de l’heureNTP configuré : les certificats sont sensibles au clock drift
Pré-requisDétail
OIDC issuer activé sur le clusterConfiguration spécifique par cloud (EKS, GKE, AKS)
Rôle IAM / identité managéeCréé avec les permissions minimales
Federated identity credentialLien ServiceAccount K8s ↔ rôle cloud
SDK cloud compatibleL’application utilise un SDK qui détecte les credentials projetés
PiègeConséquenceComment l’éviter
Croire que l’identité remplace l’autorisationWorkloads authentifiés mais trop autorisésConfigurer des policies d’autorisation granulaires
Penser qu’une annotation K8s suffitL’annotation sans configuration cluster = aucun effetVérifier les pré-requis cluster (OIDC issuer, WIF)
Supposer que toutes les apps gèrent mTLSL’app crashe ou ignore le certificatUtiliser un proxy sidecar ou un service mesh
Ignorer le renouvellementLe certificat expire, l’app planteMonitorer les TTL, tester les renouvellements
Multiplier les identités sans gouvernanceExplosion des SPIFFE IDs, policies ingérablesConvention de nommage + policy-as-code
Ne pas monitorer SPIRE ServerPanne silencieuse = plus de SVIDs émisAlerting sur les métriques SPIRE
LimiteEffet réelMitigation
Intégration applicativeL’application ne sait pas exploiter un certificat ou un JWT SPIFFEPasser par un proxy sidecar, un service mesh ou un SDK
Plan de contrôle critiquePanne SPIRE = émission et renouvellement impactésHaute disponibilité, observabilité, cache local
Débogage plus difficileÉchec authentification/autorisation/transport difficile à isolerLogs structurés sur chaque couche, métriques par service
Compatibilité partielleCertains systèmes ne savent ni mTLS ni OIDCGarder un secret dynamique ou statique sous coffre
Gouvernance d’identitéExplosion des identités et des politiques sans conventionConvention de nommage SPIFFE ID, policy-as-code
Distribution du trust bundleLes workloads doivent recevoir le bundle pour vérifier les SVIDsBundle Federation SPIFFE, rotation planifiée
Clock driftLes certificats sont sensibles aux écarts d’horlogeNTP configuré et surveillé sur tous les nœuds
Latence de renouvellementUn SVID expiré avant renouvellement bloque le workloadTTL avec marge, cache local, alerte sur les échecs
Cas hybridesTout le SI ne parle pas SPIFFE/OIDCApproche progressive, secret dynamique pour le legacy
  1. Inventoriez les flux M2M

    Listez toutes les communications service-to-service qui utilisent des secrets partagés. Identifiez celles qui sont les plus sensibles.

  2. Priorisez par criticité et faisabilité

    Commencez par les flux sensibles (paiement, données utilisateur) et compatibles (services déjà dans K8s, capacité mTLS via mesh).

  3. Déployez l’infrastructure d’identité

    SPIRE pour le M2M interne, workload identity native pour les accès cloud. Les deux peuvent coexister.

  4. Migrez service par service

    Remplacez les secrets partagés par mTLS avec identité ou par OIDC federation. Validez chaque migration indépendamment.

  5. Gardez le secret dynamique pour le legacy

    Les systèmes qui ne supportent pas mTLS/OIDC restent sur Vault avec des credentials dynamiques.

  6. Supprimez les anciens secrets

    Une fois la migration validée et observée en production, supprimez les secrets devenus inutiles.

SituationApproche recommandée
Communication interne K8sSPIFFE/SPIRE ou service mesh
Pod vers cloud (AWS/GCP/Azure)Workload identity native (IRSA, GKE WIF, AKS WI)
CI/CD vers cloudOIDC federation
Service vers DB classiqueSecret dynamique (Vault)
API tierce avec clé fixeSecret statique sous coffre-fort
Legacy sans mTLS ni OIDCSecret dynamique (Vault)
Accès SSH courtCertificat signé (Vault SSH)
  1. L’identité machine n’est pas un mot de passe — c’est une attestation cryptographique vérifiable
  2. Deux familles — identité interne M2M (SPIFFE/SPIRE) et fédération cloud (IRSA, GKE WIF, AKS WI) répondent à des besoins différents
  3. L’identité ne remplace pas l’autorisation — prouver son identité et avoir le droit d’agir sont deux choses distinctes
  4. L’identité nécessite un point d’intégration — proxy, mesh, SDK ou bibliothèque applicative
  5. On remplace le secret applicatif partagé, pas toute confiance — une chaîne de confiance (CA, trust bundle, OIDC issuer) reste nécessaire
  6. SPIFFE est un standard majeur pour le M2M cloud-native, pas le seul modèle d’identité machine
  7. L’identité machine n’est pas toujours la priorité — sortir les secrets du code et utiliser un coffre-fort viennent en premier

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn