Maximize Page
Tech & DevOps HubEspace Tech & DevOps: Explorez le monde du Dev, du Cloud et des outils DevOps à travers nos articles et discussions Explore the world of development, the cloud and DevOps tools

Actions pinnés par SHA - dependabot

Date de l'article:18-12-2025
CI/CD Github-Actions security
Remplacement des tags mutables des GitHub Actions par leurs SHA de commit pour sécuriser la supply chain, Nous ferons la configuration de Dependabot pour les mises à jour automatiques
En Bref;

Nous abordons ici la sécurité de la "supply chain", notamment la gestion des tags mutables,
Nous verrons la configuration des fichiers associés, l'utilisation d'actions GitHub "pinnées par SHA" ainsi que la mise en place de Dependabot.
Le verrouillage des versions dans le Dockerfile et les scans Maven, la gestion des secrets et des tableaux de bord Dependabot, ainsi que le processus de mise à jour des actions CI via pull requests.


"Supply Chain" et tags mutables

Les attaques de "supply chain" ciblent le pipeline CI/CD et ses dépendances.
Un vecteur courant est l'usage de tags mutables comme @v1 ou latest dans les workflows, le Dockerfile, .. qui peuvent être redirigés vers un commit malveillant, entraînant ainsi l'exécution de code compromis

Éviter :latest, :main ou v1
Épingler les versions par SHA ou digest d'image

Configurations des fichiers et mise en place: Actions pinnés par SHA

GitHub Actions encourage l'utilisation d'actions de son marketplace, qui sont des composants réutilisables permettant d'automatiser des tâches spécifiques

Process example avec l'action "checkout"

Pour chaque action, on se rends sur le lien Github de l'action: actions/checkout, ici l'action est de récupérer le repository.
On parcours le readme, on regarde les màj et la version qui nous corresponds. Pour l'instant, la dernière version est la v6.0.2

→ Pour obtenir le SHA court, on clique sur " Tags" (ou release),
→ cliquez ensuite sur le lien du SHA court, représenté comme suit: de0fac2.
→ Dans la page suivante, le SHA long apparait dans l'url: https://github.com/actions/checkout/commit/de0fac2e4500dabe0009e67214ff5f5447ce83dd:
→ en vert, la partie qu'il faut remplacer dans les actions des pipelines:

Dans le pipeline:
Remplacez la version v6.0.2
steps:
- name: Checkout code
  uses: actions/checkout@v6.0.2
Par le SHA long, comme ceci:
steps:
- name: Checkout code
  uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
Ajouter la version en commentaire est aussi une bonne pratique. Pour vous, mais aussi, lors de la mise à jour, Dependabot modifie également le commentaire
Configurer Dependabot
Utiliser des SHA rend la mise à jour manuelle pénible. La solution standard est d'utiliser le Dependabot de GitHub

doc officielle : dependabot-quickstart-guide | demo example : dependabot-demo

Ajout du fichier .github/dependabot.yml
version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"

  - package-ecosystem: "maven"
    directory: "/"
    schedule:
      interval: "weekly"

  - package-ecosystem: "docker"
    directory: "/"
    schedule:
      interval: "weekly"

Configuration complète (couvre les workflows, le Dockerfile et les dépendances Java)

Le contenu du fichier dépend uniquement de ce que l'on veut surveiller
     Il suffit d'ajouter, par exemple; - package-ecosystem: "github-actions",
     de lui donner le chemin d'accès, et l'interval à suivre pour qu'il s'occuppe de tout, où presque

Centralisation: Dependabot n'utilise qu'un seule fichier
     Il scanne tous les fichiers yaml, situés dans le dossier .github/workflows/

Automatisation des SHA: Dependabot détecte si une nouvelle version existe,
     Il crée ensuite une PR (de plusieurs fichiers parfois) en mettant à jour le(s) SHA,
     Il ajoute un commentaire avec le(s) numéro(s) de version

Stabilité: On recoit les mises à jour sur une branche séparée.
     On peut ainsi tester les mises à jourt AVANT de les merger dans les différentes branches


Le fichier "Dockerfile"

Utiliser un SHA pour l'image de base, c'est comme pour les Actions;
On utilise un SHA pour le FROM afin d'être 100% reproductible

Dans ce cas, il va surveiller la ligne "FROM gcr.io/distroless/java17-debian12" et proposer une "Pull Request" dès qu'une nouvelle image de base, plus sécurisée, sera publiée par Google

→ Une fois que l'on obtiens le SHA, modifiez le Dockerfile ainsi:
FROM gcr.io/distroless/java17-debian12@sha256:le_sha_ici


Tester avant de procéder au changement
Avec Docker:
Récupérer la dernière version de l'image:
docker pull gcr.io/distroless/java17-debian12
Afficher le SHA exact (le Digest)
docker inspect --format='{{index .RepoDigests 0}}' \
	gcr.io/distroless/java17-debian12
Avantage majeur: Si Google pousse une mise à jour qui casse l'application, le build ne bougera pas car il est "verrouillé" sur le SHA spécifiquement configuré
Le scan Maven

Pour Java, c'est encore plus puissant:
Dependabot analyse le fichier pom.xml. Si on mets à jour une dépendance, il vérifie les versions disponibles sur Maven Central. Il regroupe les mises à jour si on utilise l'option groups, ce qui évite d'avoir 50 PRs ouvertes

optimizing-java-packages-dependabot

Le regroupement réduit le "bruit" des Pull Requests en fusionnant plusieurs mises à jour liées, en une seule PR

Efficace pour les frameworks comme Spring où les dépendances doivent souvent être mises à jour simultanément pour éviter les conflits de version
version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    groups:
      production-dependencies:
        patterns: ["*"]
        dependency-type: "production"
      minor-and-patch:
        update-types: ["patch", "minor"]

Configuration des secrets
Si vos workflows contiennent des secrets, il faudra les configurer ou les copier dans la section spécifique au secrets dependabot:

settings → secrets/dependabot

C'est la condition pour qu'il puisse faire tourner la CI dans les PR
Dependabot secrets
Secrets are credentials that are encrypted. Anyone with collaborator access to this repository can use these secrets for Dependabot.

Secrets are not passed to forks.
Repository secrets                     
Name                    Last updated
 POSTGRES_PASSWORD     2 days ago

Tableaux de bords des mise à jour
Depuis l'onglet Insights → Dependencies graph où nous avons 3 tabs:
  • Dependencies: Contient une liste de dépendance, On peut filtrer par eco-system (Maven, Github Actions), on peux aussi activer la soumission automatique afin de recevoir des alertes Dependabot pour les vulnérabilités connues
  • Dependents:
  • Dependabot: Affiche les récentes mise à jour et les fichiers modifiés

Tableaux de bords des alertes
On voit les notifications d'alertes depuis le projet, onglet Security 1 Cliquez sur Dependabot dans le menu de gauche pour accéder aux alertes:
Vulnerability Alert
       Dependabot 1
Dependabot alerts
Dependency files checked 6 hours ago
 is:open

 Apache Tomcat Vulnerable to Improper Resource Shutdown or Release   Low 
#1 opened 2 days ago • Detected in org.apache.tomcat.embed:tomcat-embed-core (Maven) • pom.xml    #132

Process de mise à jour CI/PR
D'une part, on recoit un email nous avertissant d'une mise à jour mais on peux aussi le remarquer, au dessus de l'onglet pull requests
Cibler la branche

Pour ma stratégie Git, les alertes de mise à jour sont envoyés sur la branche [develop], idéal pour suivre le cycle normal des PR/merges

version: 2
updates:
  - package-ecosystem: "github-actions"
    target-branch: develop
    directory: "/"
    schedule:
      interval: "weekly"

    groups:
      github-actions:
        patterns:
          - "*"
bump dependabot

Déroulé du PR: CI FAILED

Contexte:
Le build est rouge et on a fermé le PR, on reçoit alors un message avec des instructions: →

On peut aussi configurer le fichier pour n'autoriser que les versions majeurs:
groups:
  major-and-patch:
    update-types: ["patch", "major"]
Email notification:
Bump org.apache.tomcat.embed:tomcat-embed-core from 10.1.45 to 10.1.47 (PR #132) dependabot[bot] left a comment : 

OK, I won't notify you again about this release, but will get in touch when a new version is available. 

If you'd rather skip all updates until the next major or minor version, 
let me know by commenting @dependabot ignore this major version or @dependabot ignore this minor version.

If you change your mind, just re-open this PR and I'll resolve any conflicts on it.

Déroulé du PR: CI SUCCESS

Une CI verte enclenche le processus de merge habituel

PR green → merge (develop)

La mise à jour de certaines actions CI/CD (dependabot) sont succeptible d'engendrer des modifications dans les workflows, images et/ou le code, le repository constitue dès lors, La source de vérité
Dans l'article suivant, nous créerons et automatiserons la promotion entre les branches [develop] et [staging] et ensuite de [staging] vers la production [main]

Laissez-moi un commentaire

En postant un commentaire anonyme, vous adhérez automatiquement aux conditions d'utilisation du site.