Créer un pipeline CI/CD sécurisé avec GitHub Actions pour votre application Java
27 juin 2022
0 minutes de lectureGitHub Actions n’a jamais rendu aussi simple la création d’un pipeline d’intégration et de livraison continues (CI/CD) sécurisé pour vos projets GitHub. En intégrant votre pipeline CI/CD à votre dépôt GitHub, GitHub Actions vous permet d’automatiser le processus de build, de test et de déploiement. Vous pouvez créer des workflows qui compilent et testent chaque pull request envoyée à votre dépôt, ou déploient en production les pull requests fusionnées. En intégrant Snyk à votre CI/CD GitHub, vous pouvez automatiser l’analyse de sécurité au cours du cycle de build, avant la mise en production.
Configurer un pipeline CI GitHub Actions pour Java
Les workflows GitHub Actions sont des fichiers YAML dans le dossier .github/workflows. Si vous n’avez pas encore de workflow ou souhaitez en ajouter un, sélectionnez Actions, puis Nouveau workflow.

Pour ce projet Java Spring Boot, j’ai créé un pipeline CI avec Maven comme suit :
Cette action s’exécute à chaque push ou pull request sur la branche master. Basée sur Ubuntu, elle récupère le dépôt et utilise l’action GitHub setup-java — avec Java 17 et Maven — pour créer le fichier JAR Java. Si vous connaissez la syntaxe, ce workflow est relativement simple, mais vous pouvez consulter la documentation GitHub Actions pour découvrir toutes les possibilités.
Intégrer Snyk à votre CI/CD GitHub
Avec Snyk, vous pouvez intégrer des tests de sécurité à votre nouveau projet Java. Il existe deux méthodes principales pour cela. Mais commençons par vérifier que deux éléments sont configurés. Connectez-vous à votre compte Snyk — ou créez-en un gratuitement si ce n’est pas déjà fait. Définissez ensuite votre clé API comme secret SNYK_TOKEN pour votre dépôt GitHub.
Option 1 : intégrer l’interface de ligne de commande Snyk à une étape de build de votre GitHub Action
Vous pouvez utiliser l’interface de ligne de commande Snyk pour lancer automatiquement des analyses de sécurité dans votre build actuel. Suivez les étapes ci-dessous — y compris les quelques étapes supplémentaires après Build with Maven — pour commencer.
Configurez NodeJS version 14 et téléchargez l’interface de ligne de commande Snyk avec npm. Analysez ensuite vos dépendances avec Snyk Open Source et utilisez Snyk Code pour rechercher des vulnérabilités dans votre code personnalisé.
Déclarez ensuite SNYK_TOKEN comme variable d’environnement contenant votre clé API. Vous pouvez utiliser le secret SNYK_TOKEN que vous avez configuré précédemment, ou reprendre l’exemple complet de code de la GitHub Action.
L’avantage de cette approche est que vous n’avez à compiler et à builder votre application qu’une seule fois, ce qui peut vous faire gagner beaucoup de temps pour les applications volumineuses. En revanche, les étapes s’exécutent en série et peuvent se révéler inefficaces si l’une des dernières échoue.
Option 2 : utiliser les GitHub Actions prédéfinies de Snyk pour créer votre pipeline CI/CD
Snyk a créé un ensemble de GitHub Actions pour détecter les vulnérabilités dans vos projets. L’action à utiliser dépend de votre langage de programmation ou de votre outil de build. Pour notre projet Java, nous allons par exemple utiliser l’action GitHub basée sur Maven présentée ci-dessous.
Les actions prédéfinies vous garantissent de disposer des prérequis nécessaires au build de votre application et incluent la dernière version de l’interface de ligne de commande pour analyser votre code. Même si vous devez builder vos applications plusieurs fois, ces actions peuvent s’exécuter individuellement et en parallèle — un avantage considérable de cette approche.
Commençons par analyser nos dépendances. Nous avons déjà un compte Snyk et notre clé API est stockée sous forme de secret nommé SNYK_TOKEN. Plutôt que d’ajouter une étape supplémentaire au job de build, créons un nouveau job nommé opensource-security.
Selon la documentation, la commande par défaut est test. Sans configuration supplémentaire, elle analyse votre application à la recherche de vulnérabilités connues dans vos dépendances. Pour définir un argument CLI spécifique, comme --all-projects afin de prendre en charge les projets imbriqués, utilisez le mot-clé with et définissez la propriété args.

Pendant que Snyk analyse nos dépendances, vérifions la présence de vulnérabilités dans le code Java de notre GitHub Action. Pour cela, répétez le processus précédent en configurant un troisième job dédié, puis définissez la propriété command sur code test.
Notez que les trois jobs s’exécutent en parallèle, ce qui est souvent plus efficace.
Ajouter une livraison continue sécurisée à votre CI/CD GitHub
Abordons maintenant la partie déploiement — ou livraison — de votre CI/CD GitHub. Une fois le build et les tests terminés, il est temps de publier le package sur GitHub. Pour cela, nous allons utiliser le plug-in Maven Release dans notre projet Java.
Nous voulons publier le package uniquement une fois le job de build et les deux jobs de sécurité terminés avec succès. Nous allons donc ajouter une propriété needs contenant la liste des jobs prérequis à la publication. Nous pouvons ainsi nous assurer que le package n’est pas déployé avant d’avoir été entièrement compilé et sécurisé.
Les commandes Maven release:prepare et release:perform vérifient que la version de la publication est correcte et publient effectivement le package dans notre dépôt GitHub. Puisque nous confions cette tâche à Maven, apportez les modifications suivantes à votre fichier pom.xml.
Même si notre application nouvellement publiée ne présente actuellement aucune vulnérabilité, rien ne garantit qu’elle restera sécurisée indéfiniment. De nouvelles vulnérabilités peuvent apparaître à différents endroits. Il est donc essentiel de surveiller en continu votre code et vos dépendances après le déploiement de l’application.
En plus des analyses effectuées pendant le développement, vous pouvez aussi utiliser Snyk pour surveiller les dépendances après le déploiement. Une fois la publication terminée, utilisez à nouveau l’action Snyk prédéfinie, mais définissez cette fois la propriété command sur monitor.
L’arborescence des dépendances, qui reste statique après la publication, sera alors envoyée à Snyk pour être surveillée. Vous pouvez désormais consulter votre projet dans l’interface Snyk et recevoir automatiquement des notifications si une nouvelle vulnérabilité est détectée dans l’une de vos dépendances. Vous vous assurez ainsi que votre projet Java publié reste exempt de vulnérabilités.

Intégrer la sécurité à vos GitHub Actions
Avec GitHub Actions, créer un pipeline CI/CD pour votre projet GitHub est très simple. Et grâce aux actions Snyk, vous pouvez facilement intégrer des analyses de sécurité à plusieurs niveaux pour toutes vos applications.
GitHub représente dans l’image ci-dessous le pipeline que nous avons créé aujourd’hui. Certains jobs s’exécutent en parallèle, tandis que d’autres dépendent de la réussite d’autres jobs. Vous pouvez consulter le projet complet dans ce dépôt GitHub.

Aujourd’hui, nous avons utilisé Snyk Code et Snyk Open Source pour analyser le code source Java et les dépendances du pipeline. Vous pouvez également étendre cette approche en analysant les fichiers Docker avec Snyk Container et les fichiers Kubernetes avec Snyk IaC.
Avec les Snyk GitHub Actions, vous pouvez ajouter automatiquement des analyses à votre workflow GitHub Actions et combiner les actions selon les besoins de votre projet, afin de garantir la sécurité de votre code aujourd’hui et à l’avenir.
Lancez-vous dans les challenges Capture The Flag
Apprenez à résoudre des challenges Capture The Flag en regardant à la demande notre atelier virtuel d’initiation.