Retour au journal

Cybersécurité

Secrets de CI : remplacer les clés durables par des identités courtes

Les jetons temporaires réduisent l’exposition des déploiements. Définir la confiance OIDC, les droits du job et les tests d’accès refusé.

20 septembre 20267 min de lecturePar Malo Kessler
Secrets de CI : remplacer les clés durables par des identités courtes

Ce qu’il faut retenir

  • Une identité temporaire limite la durée de validité d’un accès, mais sa portée doit aussi être restreinte.
  • Le fournisseur cloud doit vérifier quel dépôt, quel contexte et quel workflow peuvent obtenir un rôle.
  • Un job compromis peut agir pendant la durée de son accès : runner, dépendances et environnement restent à protéger.

Une clé cloud a été créée pour un déploiement, copiée dans la CI, puis réutilisée par plusieurs projets. Des mois plus tard, personne ne sait précisément quels jobs en dépendent. Sa rotation devient risquée et sa fuite donne un accès durable. Le problème peut se traiter en changeant le modèle : le job prouve son identité au fournisseur, qui lui accorde un jeton temporaire au lieu de lui confier une clé permanente.

La confiance remplace la copie d’un secret

OpenID Connect, ou OIDC, permet d’échanger une preuve d’identité du workflow contre un accès court auprès d’un service compatible. La documentation GitHub Actions décrit cette relation entre plateforme de CI et fournisseur cloud. Le jeton d’identité contient des attributs que le destinataire vérifie avant d’émettre des droits. L’identité du job et les autorisations qu’il reçoit sont deux décisions distinctes.

L’avantage tient à la disparition d’une clé cloud de longue durée du coffre de la CI. Il ne faut pas en déduire qu’aucun secret n’existe plus dans le système. Un fournisseur tiers peut encore exiger une clé API. Une application possède ses propres credentials. Chaque accès est inventorié et traité selon le mécanisme réellement disponible ; une migration OIDC n’efface pas les dépendances restantes.

Cette granularité rejoint le principe développé dans notre dossier sur les agents et la sécurité : une identité prouvée ne devrait recevoir que les actions nécessaires à sa mission. Un job chargé d’envoyer une image au registre n’a pas besoin de lire la base clients ni de modifier la politique de comptes cloud.

Écrire une politique de confiance étroite

Le fournisseur doit accepter l’émetteur attendu, l’audience prévue et les attributs correspondant au contexte autorisé. Faire confiance à toute la plateforme de CI ouvre un périmètre beaucoup trop large. Le sujet du jeton, les informations du dépôt et du workflow, ainsi que l’environnement, servent à limiter la relation selon les possibilités du fournisseur. Les formats précis évoluent : les recopier depuis un exemple ancien sans les vérifier peut autoriser le mauvais contexte ou bloquer le bon.

Une branche dite « production » reste une règle utile seulement si son accès est protégé. Il faut examiner qui peut modifier le workflow, déclencher une exécution, approuver l’environnement ou réutiliser un job. Un acteur capable de changer le code exécuté par un rôle de production dispose indirectement de ce rôle. La revue des règles de dépôt appartient donc à la conception de la confiance.

Distinguer publier et déployer

Le rôle de build construit l’artefact. Le rôle de publication écrit dans un espace limité du registre. Le rôle de déploiement met à jour un service ou un environnement précis. Cette séparation évite d’accorder au travail de compilation les droits nécessaires à la production. Elle réduit aussi le rayon d’impact d’une dépendance malveillante exécutée pendant le build.

La durée accordée suit la durée utile de l’opération, avec les contraintes du fournisseur. Un jeton court ne rend pas acceptable un rôle administrateur. Pendant quelques minutes, un droit de suppression ou de création d’identité reste dangereux. L’autorisation doit donc être testée par ce qu’elle permet et ce qu’elle refuse, au-delà de sa date d’expiration.

Un déploiement de documentation ne doit pas ouvrir le cloud

Exemple hypothétique : une équipe possède un dépôt d’application et un dépôt de documentation. Les deux publient des fichiers, mais seule l’application peut mettre à jour le service de production. Les jobs obtiennent des rôles différents. Le dépôt de documentation écrit uniquement dans son compartiment de stockage. Une contribution externe à la documentation n’accède à aucune identité de production.

La recette lance un job légitime, puis plusieurs variantes refusées : dépôt voisin, branche de test, environnement différent, workflow non prévu. Elle tente également une action hors périmètre avec un jeton valide. Un refus à l’authentification ne teste pas le même contrôle qu’un refus d’autorisation ; les deux preuves sont nécessaires. Les journaux associent le rôle obtenu à l’exécution sans enregistrer les jetons eux-mêmes.

La grille de confiance d’un job

DimensionQuestion à poserVérification
ÉmetteurQui signe l’identité ?Plateforme et clés attendues
ContexteQuel job peut obtenir le rôle ?Dépôt, workflow et environnement autorisés
PortéeQue peut faire le jeton ?Actions et ressources limitées
TempsCombien de temps l’accès est-il utile ?Expiration et comportement après échéance

La durée courte ne nettoie pas le runner

Un runner compromis peut utiliser le jeton au moment où il est présent. Une action tierce peut recevoir plus d’accès que prévu si les permissions du job sont trop larges. Un cache de build peut réintroduire un fichier dangereux. Une identité courte réduit la persistance d’un secret exfiltré, mais ne remplace pas l’isolement des exécutions, la revue des actions et l’intégrité des artefacts.

Les logs de débogage sont une autre voie de fuite. Le masquage automatique d’un secret connu est un filet, pas une autorisation à imprimer les variables. Les jetons doivent rester dans le chemin d’authentification nécessaire, avec le moins d’étapes capables de les lire. Un artefact d’échec ou un dump mémoire peut aussi contenir des informations sensibles ; sa conservation suit une politique explicite.

Les intégrations entre outils multiplient les frontières de confiance. Une étape qui télécharge un script et l’exécute avant le déploiement devient un acteur de cette chaîne. Épingler une dépendance réduit l’incertitude sur ce qui est exécuté ; vérifier sa provenance et sa maintenance traite une autre partie du risque.

Migrer sans laisser la vieille clé en secours permanent

Commencer par un job limité permet de valider le fournisseur, les attributs et les refus attendus. Le nouveau parcours est observé sur des exécutions réelles. Ensuite, la clé durable est désactivée, les appels restants sont identifiés et la procédure d’incident mise à jour. Garder indéfiniment l’ancien secret « au cas où » laisse intact le risque que la migration devait réduire.

Un secours peut être nécessaire, mais il a un propriétaire, un usage exceptionnel et une durée. Il ne se confond pas avec un accès ordinaire caché dans un second coffre. Le plan de retour explique comment restaurer un déploiement fonctionnel sans réintroduire un compte partagé tout puissant. Les essais doivent être suffisamment isolés pour ne pas modifier la production simplement afin de prouver un accès.

Mesurer les droits qui disparaissent

Un inventaire suit les clés durables restantes, les rôles obtenus temporairement et les jobs pouvant les demander. Le délai de rotation et les refus d’accès inattendus éclairent la maintenance. Le coût de gestion entre dans le coût réel de l’infrastructure : réduire les secrets partagés peut simplifier les opérations, à condition que la politique de confiance soit lisible.

La prochaine étape utile consiste à choisir une clé de déploiement partagée, à tracer ses utilisateurs puis à concevoir un rôle temporaire pour une seule opération. La réussite se constate lorsque le job fonctionne avec ce rôle, que les contextes voisins sont refusés et que l’ancienne clé ne sert plus.

Sources et références

Mise à jour du 1er octobre 2026 : références vérifiées à cette date. Les mécanismes décrits sont durables ; les options exactes restent à vérifier dans la version du produit utilisée.