Dans le cadre d’une culture DevSecOps, maintenir les environnements de développement et de production à jour au niveau système et applicatif apporte de nombreux bénéfices pour les développeurs et pour les clients. Appliquer cette démarche sur les dépendances des projets peut aussi apporter plus de sécurité. En effet les mises à jour incluent souvent des Security Fixes et ont moins de chances de contenir des vulnérabilités.
Au-delà de la sécurité, la mise à jour de dépendances apporte un certain nombre de correctifs, qui ont majoritairement un impact positif sur l’applicatif de nos projets.
Aussi, il peut être préférable d’effectuer des mises à jour de façon itérative, par petits incréments et de façon automatisée, que de faire de gros updates façon Big-Bang. Cela permet de garder un environnement sujet à moins de failles et un risque de régression amoindri.
Durant le développement, il n’est pas toujours simple de suivre les évolutions des nombreuses librairies dont nos projets dépendent. Cela participe à l’entropie des projets et la conséquence est au mieux une dette technique latente qui s’accumule petit à petit, au pire, l’inclusion de failles de sécurité.
Dependabot est un outil puissant pour faciliter une mise à jour. Voyons pourquoi…
Dependabot : comment ça marche ?
Version Update
Dependabot est aujourd’hui complètement intégré à GitHub que l’on peut utiliser pour automatiser l’analyse et les mises à jour des dépendances de nos projets développés en ruby, JavaScript, python, php, python.NET, Rust et Elixir.
Il fonctionne en analysant les fichiers de dépendance de nos projets et en vérifiant qu’il n’existe pas une version plus récente dans les dépôts officiels ou des projets (GitHub). Après analyse, il crée automatiquement des pull requests (ou merge requests pour Gitlab) pour les dépendances qui ne sont pas à jour. Typiquement, il va lire le fichier correspondant en fonction du langage qu’on lui spécifie, package.json comme exemple pour du js.
Voyons comment cela se traduit sur Gitlab une fois le projet dependabot-script cloné :
Depuis le projet dependabot-script sous Gitlab, il faut créer un cron qui exécutera la pipeline => menu CI / CD > Schedules :
- On set la périodicité : (1 fois par semaine, 2 fois par semaine…)
- La target branch : master, develop..
- On ajoute les variables d’entrées :
- PROJECT_PATH : le chemin pointant sur le projet à analyser (davidson/app_skills)
- PACKAGE_MANAGER_SET : la liste des gestionnaires de dépendances à appliquer. (maven, npm, bundler, composer..)
- DIRECTORY_PATH : Si on souhaite spécifier le répertoire qui contient le fichier manifeste (package.json….)
- PULL_REQUEST_ASSIGNEE : un entier qui correspond à l’ID de celui dont on veut assigner la merge request
- GITLAB_HOSTNAME : git-twister.davidson-idf.fr
- GITLAB_ACCESS_TOKEN : Dependabot va avoir besoin d’accéder à l’API de Gitlab pour créer une merge request. Il lui faut donc un token pour s’authentifier avec les droits nécessaires.
Un cron sous le projet Dependabot-script ne peut gérer qu’un projet à la fois. Cela implique que si l’on désire analyser plusieurs projets, il faudra créer un nouveau cron.
Une fois les builds lancés, nous obtiendrons des merge request comme ci-dessous :

Lors d’une merge request qu’il effectue automatiquement, il génère les notes de publication, le journal des modifications de la librairie ainsi que les commits en commentaire pour faciliter le travail de revue d’impacts (si ces informations sont évidemment disponibles).

Security update
(Attention : les fonctionnalités présentées ici sont à confirmer et ne sont parfois pas présente sur Gitlab)
Fonctionnalité sur GitHub
L’outil dispose d’une flexibilité pratique pour discerner facilement le type de MR qui a été généré. En effet, chaque MR affichera un label spécifique en fonction des gains apportés par la mise à jour de la dépendance concernée.
Ci-dessous nous pouvons voir une MR de sécurité.

Lorsqu’elles ne sont pas sécurisées ou qu’une nouvelle vulnérabilité est découverte dans une dépendance déjà détenue, l’outil nous informe avec des alertes de sécurité pour les dépendances vulnérables.
S’il peut suggérer un correctif, il envoie également une MR pour mettre à jour notre manifeste de dépendance avec la version non vulnérable la plus proche.
Dependabot repère les failles de sécurité en se fiant aux :
• Vulnérabilités ajoutées à la base de données de conseil GitHub
• Vulnérabilités type CVE
Il donne également un score de compatibilité de la dépendance qu’il veut mettre à jour.

A noter : Il est possible d’ignorer la mise à jour d’une dépendance en le spécifiant à dependabot.
Maintenabilité
Étant un projet aujourd’hui pris en charge par GitHub, ses chances d’être supporté sur le long terme sont accrues.
Intégration du projet pour nos besoins :
L’un de ses plus grands attraits est de pouvoir configurer l’outil de façon à s’adapter au projet que l’on vise.
En effet, Il possible de configurer ce qui s’appelle le « GITLAB_AUTO_MERGE » pour merger automatiquement la MR quand elle passe nos tests.
Avec un prérequis : à défaut de l’utiliser uniquement à titre préventif, si on veut pouvoir exploiter sa capacité à faire des MR et merger automatiquement sans interventions humaines, il nous faut avoir des tests fiables de notre code. L’ensemble de ce processus de gestion automatisé des dépendances ne fonctionne que si l’on dispose d’une solide suite de tests.

En une phrase :
Disposer d’une couverture de tests complète, pour merger en toute confiance dans la branche master.