Docker pour les développeurs Node.js : 5 conseils pour ne pas compromettre votre sécurité
25 janvier 2021
0 minutes de lectureDocker totalise plus de 50 milliards de téléchargements d’images de conteneurs. Avec des millions d’applications disponibles sur Docker Hub, les applications basées sur des conteneurs sont très populaires et offrent un moyen simple de distribuer et d’utiliser des applications.
Cela dit, créer vos propres applications web avec Docker et Node.js de manière intuitive peut présenter de nombreux risques de sécurité. Alors, comment faire de la sécurité une priorité pour les développeurs Node.js qui utilisent Docker ?
Avant d’aborder les principes essentiels de Docker pour Node.js et la création d’images Docker, examinons quelques questions fréquemment posées sur le sujet.
Comment conteneuriser des applications Node.js avec Docker ?
Exécuter votre application Node.js dans un conteneur Docker peut être aussi simple que de copier le répertoire du projet et d’installer tous les packages npm nécessaires. Mais de nombreux enjeux de sécurité et de production peuvent vous échapper. Le guide suivant présente des conseils pour un environnement de production sur la conteneurisation d’applications web Node.js avec Docker. Il couvre tous les aspects, du choix de l’image de base Docker appropriée et de l’utilisation de builds multiétapes à la gestion sécurisée des secrets et à l’activation correcte de la configuration du framework pour la production.
Cet article présente les informations nécessaires pour mieux comprendre l’impact du choix de l’image de base Docker adaptée à votre application web Node.js et vous aider à trouver l’image Docker la plus sécurisée pour votre application.
En quoi Docker est-il utile aux développeurs Node.js ?
La conteneurisation de votre application Node.js vous permet de regrouper l’application complète, y compris son environnement d’exécution, sa configuration, ses dépendances au niveau du système d’exploitation et tout ce dont elle a besoin pour fonctionner sur différentes plateformes et architectures de processeur. Ces images constituent des artefacts déployables appelés images de conteneurs. Les images Docker sont des bundles logiciels qui permettent de reproduire facilement les builds et offrent aux développeurs Node.js un moyen d’exécuter le même projet ou produit dans tous les environnements.
Enfin, les conteneurs Docker permettent aux développeurs d’expérimenter plus facilement de nouvelles versions de plateformes ou d’autres modifications, sans nécessiter d’autorisations spéciales ni de configuration d’un environnement dédié à l’exécution d’un projet.
1. Choisissez la bonne image de base Docker Node.js pour votre application
Pour créer une image Docker pour un projet Node.js, nous construisons notre propre image d’application à partir d’une autre image Docker que nous récupérons sur Docker Hub. C’est ce que l’on appelle l’image de base. Elle sert de fondation à la nouvelle image Docker que vous allez créer pour votre application Node.js.
Le choix de l’image de base est essentiel, car il a un impact considérable sur la vitesse de création de l’image Docker, ainsi que sur la sécurité et les performances de votre application web. Vous pourriez choisir une image complète de système d’exploitation, basée sur Debian ou Ubuntu, car elle vous donne accès à tous les outils et toutes les bibliothèques qu’elle contient.
Mais cela a un coût. Si une image de base présente une vulnérabilité de sécurité, celle-ci se retrouvera dans l’image que vous venez de créer. Pourquoi partir sur de mauvaises bases en choisissant une image de base volumineuse qui contient de nombreuses vulnérabilités ?
Dans les images de base, de nombreuses vulnérabilités de sécurité se trouvent dans la couche du système d’exploitation (OS) utilisée. L’étude de Snyk publiée en 2019, Déplacer la sécurité Docker vers la gauche, a montré que les vulnérabilités introduites par cette couche peuvent varier considérablement selon la variante choisie.

Cette préoccupation est d’ailleurs légitime pour toutes les images de base que vous envisagez d’utiliser. Voici, par exemple, les principales images Docker et leurs builds les plus récents, tirés du rapport 2020 sur l’état de la sécurité de l’open source : ils montrent que les images de base Docker contiennent systématiquement des vulnérabilités de sécurité par défaut.
2. Analysez votre image Docker Node.js pendant le développement
Créer une image Docker à partir d’autres images, ou reconstruire ces images, peut introduire de nouvelles vulnérabilités. Mais vous pouvez garder la situation sous contrôle.
Traitez le processus de création d’images Docker comme toute autre activité de développement. Tout comme vous testez le code que vous écrivez, testez les images Docker que vous créez.
Ces tests comprennent des vérifications statiques des fichiers, également appelées linters, afin de vous assurer que vous évitez les failles de sécurité et autres mauvaises pratiques dans votre Dockerfile. Nous en présentons quelques-unes dans nos bonnes pratiques de sécurité pour les images Docker. Si vous développez des applications Node.js, consultez ce guide détaillé : 10 bonnes pratiques pour conteneuriser des applications web Node.js avec Docker.
Connecter vos dépôts Git à Snyk est également une excellente option. Snyk propose des intégrations natives avec GitHub, GitLab, Bitbucket et Azure Repos. L’intégration à Git nous permet d’analyser vos pull requests et de les annoter avec des informations de sécurité en cas de découverte de vulnérabilités. Vous pouvez ainsi définir des règles et empêcher la fusion d’une pull request si elle introduit de nouvelles vulnérabilités.
Si vous avez besoin de plus de flexibilité pour votre intégration continue (CI) ou d’une expérience développeur étroitement intégrée, découvrez la CLI Snyk.
La CLI vous permet de tester facilement votre image de conteneur Docker. Supposons que vous créez une image Docker localement et que vous l’avez étiquetée nodejs:notification-v99.9 : voici comment la tester :
Installez la CLI Snyk :
$ npm install -g snykLaissez ensuite la CLI Snyk récupérer automatiquement un jeton API pour vous avec :
$ snyk authAnalysez l’image de base locale :
$ snyk container test nodejs:notification-v99.9
Les résultats du test s’affichent à l’écran, avec des informations sur la CVE et le chemin qui introduit la vulnérabilité, afin que vous sachiez quelle dépendance du système d’exploitation en est responsable.
Voici un exemple de résultat de test pour l’image de base Docker node:15 :
Notre antisèche de la CLI Snyk présente quelques-unes des possibilités qu’elle offre. Vous trouverez également dans notre documentation de plus amples informations pour bien démarrer avec la CLI Snyk Container.
3. Corrigez les vulnérabilités de l’environnement d’exécution Node.js dans vos images Docker
Lorsqu’on gère les risques liés aux images de conteneurs Docker, on oublie souvent un détail : l’environnement d’exécution de l’application. Que vous utilisiez Docker pour Java ou Docker pour des applications web Node.js, l’environnement d’exécution Node.js lui-même peut présenter des vulnérabilités.
Veillez à suivre les mises à jour de sécurité Node.js et à respecter la politique de sécurité Node.js. Plutôt que de suivre manuellement ces informations, utilisez Snyk pour détecter également les vulnérabilités de sécurité Node.js.
Pour vous donner plus de contexte sur les vulnérabilités de sécurité des différentes balises d’images de base Node.js, j’en ai analysé plusieurs avec la CLI Snyk et représenté les résultats sur le graphique logarithmique suivant :

Vous pouvez constater que :
La balise d’image de base
nodepar défaut, également étiquetéenode:latest, regroupe plus de 500 vulnérabilités de sécurité et introduit aussi 2 vulnérabilités dans l’environnement d’exécution Node.js lui-même. Si vous utilisez actuellement Node.js 15 en production sans avoir appliqué de correctif, cela devrait vous inquiéter.La balise d’image de base
node:alpinene regroupe peut-être pas de dépendances système d’exploitation vulnérables dans l’image de base — d’où l’absence de barre bleue —, mais elle comprend tout de même une version vulnérable de l’environnement d’exécution Node.js le plus récent (version 15).Si vous utilisez une version de Node.js qui n’est plus prise en charge, par exemple Node.js 10, celle-ci est vulnérable et ne reçoit aucune mise à jour de sécurité.
Si vous choisissiez la version 15 de Node.js, la plus récente au moment de la rédaction de cet article, vous vous exposeriez non seulement à 561 vulnérabilités de sécurité au sein de ce conteneur, mais aussi à deux vulnérabilités dans l’environnement d’exécution Node.js lui-même.
Vous pouvez consulter les résultats de l’analyse Docker sur cette URL publique de test d’images. N’hésitez pas à tester d’autres balises d’images de base Node.js que vous utilisez avec ce service public et gratuit d’analyse Docker.

Si vous avez déjà un compte Docker, vous pouvez l’utiliser pour vous connecter à Snyk et importer rapidement vos dépôts Docker Hub.
4. Surveillez les images Docker déployées pour vos applications Node.js
Une fois vos images Docker créées, vous les envoyez probablement vers un registre Docker qui les répertorie, afin qu’elles puissent être déployées et lancées sous forme d’applications en conteneurs fonctionnelles.
Pourquoi surveiller les images de base Docker ?
Si vous appliquez toutes les consignes de sécurité que nous avons abordées jusqu’ici pour analyser et corriger les images de base, c’est très bien. Mais n’oubliez pas que de nouvelles vulnérabilités de sécurité sont découvertes en permanence. Si votre image compte aujourd’hui 78 vulnérabilités de sécurité, cela ne signifie pas qu’elle n’en comptera pas 100 demain matin, lorsque de nouvelles CVE seront signalées et toucheront vos conteneurs en production. C’est pourquoi il est essentiel de surveiller votre registre d’images de conteneurs — celles que vous utilisez pour déployer vos conteneurs — afin de détecter rapidement les problèmes de sécurité et d’y remédier.
Vous pouvez intégrer directement de nombreux registres d’images Docker depuis l’application Snyk. Par exemple, importez des images depuis Docker Hub, ACR, ECR, GCR ou Artifactory : Snyk les analysera régulièrement et vous signalera tout problème de sécurité sur Slack ou par e-mail.

5. Suivez les consignes de sécurité et les recommandations de production pour créer une image Docker Node.js sécurisée et optimale
Félicitations : vous avez suivi toutes les consignes de sécurité jusqu’ici !
Pour conclure, si vous souhaitez suivre les bonnes pratiques de sécurité pour créer des images Docker optimales pour Node.js et Java, consultez ces ressources :
10 bonnes pratiques de sécurité Docker — des pratiques de sécurité détaillées à suivre lors de la création d’images de base Docker et de leur téléchargement. Cette ressource présente également la confiance dans le contenu Docker.
Vous développez en Java ? Cette ressource vous sera utile : Docker pour les développeurs Java : 5 conseils pour ne pas compromettre votre sécurité
10 bonnes pratiques pour conteneuriser des applications web Node.js avec Docker — Si vous développez en Node.js, vous apprécierez ce guide pas à pas qui vous explique comment créer des images de base Docker sécurisées et performantes pour vos applications Node.js.
Commencez à tester et à corriger vos images de conteneurs avec Snyk.
Lancez-vous dans les compétitions Capture The Flag
Apprenez à résoudre des défis Capture The Flag en regardant à la demande notre atelier virtuel d’initiation.
